Edited at
LIFULLDay 20

【初心者向け】bitbucket-pipelinesのキーワードとTips

Ola!!

SET(Software Engineer in Test)Gの@mochioです。

みなさんはCI/CDやってますか!?

CIツールといえば「CircleCI」や「Jenkins」が有名だと思いますが、

ここではAtlassian謹製の「bitbucket-pipelines」を紹介したいと思います。

fukabori.fmのCI/CDの回でも話されていたとおり、

開発フローの序盤で導入するのが一番効果的だと思ってます。

導入に関してはこちらの記事を参考にしていただければと思います。


キーワードとは

CIの設定はbitbucket-pipelines.ymlにyaml形式で書いていくのですが、

キーワードはそのパイプライン(操作の流れ)において何を行うかを記述するものになります。

yaml上ではkeyにあたる部分です。

よく使うものをリストアップして使用例とともに紹介します。


image

CI・CDを回すコンテナイメージを指定します。

Docker Hubで公開されているイメージを使用したり、

プライベートイメージも使ったりできます。

すべてのstepで同一のイメージを使う場合は一番上に記述すれば良いです。

step以下に記述することもでき、使用するimageを分けることもできます。


使用例


Docker Hub

image: python:3.6

pipelines:
default:
- step:



Docker Hub(Private)

image: python:3.6

name: account-name/watashino-openjdk:8
username: $DOCKER_HUB_USERNAME
password: $DOCKER_HUB_PASSWORD
email: $DOCKER_HUB_EMAIL

pipelines:
default:
- step:



Amazon Container Registory

image: python:3.6

name: <aws_account_id>.dkr.ecr.<region>.amazonaws.com/openjdk:8
aws:
access-key: $AWS_ACCESS_KEY
secret-key: $AWS_SECRET_KEY

pipelines:
default:
- step:



step毎にimageを分けたい

pipelines:

default:
- step:
image: python:3.6
- step:
image: ruby:2.5

$変数名はbitbucket側で環境変数として設定することができる変数になります。

センシティブな情報は全部そちらで管理しましょう。

管理方法はこちらを参照してください。


pipelines

パイプラインを定義します。

pipelines以下にstepを宣言して、実行の詳細を記述していきます。


step

stepを宣言してから操作を記述していきます。


使用例

image: ruby:2.5

pipelines:
default:
- step:
script: echo "unittestします"
- step:
script: echo "rubocopかけます"


default

defaultを宣言すると、すべてのブランチがCIの実行対象となります。

実行されるタイミングはブランチのpush時です。


使用例

image: python:3.6

pipelines:
default:
- step:
script: echo "全部のブランチ対象だよー"


branches

特定のブランチをCIの実行対象とすることができます。

アスタリスクを使うこともできます。


使用例


developブランチを指定するとき

image: python:3.6

pipelines:
branches:
develop:
- step:
script: echo "developだけですよ"



featureブランチを指定するとき

image: python:3.6

pipelines:
branches:
feature/*:
- step:
script: echo "featureがつくブランチが対象です"



tags

特定のgitタグに紐づくブランチを指定できます。


使用例

image: python:3.6

pipelines:
tags:
enhancement:
- step:
script: echo "enhancementタグがついているブランチのみです"


parallel

並列でJobを実行したいときに使います。


使用例

image: ruby:2.5

pipelines:
default:
- parallel: # 以下のスクリプトは並列実行されます!
- step:
name: Integration 1
script:
- ./integration-tests.sh --batch 1
- step:
name: Integration 2
script:
- ./integration-tests.sh --batch 2


name

stepに名前をつけることができます。

テスト実行、静的解析実行、デプロイ実行など場合によって分けたいですね。


使用例

image: ruby:2.5

pipelines:
branches:
develop:
- step:
name: Execution unit testing


trigger

上の方でpush時に実行されると言いましたが、

triggerを使えばマニュアル実行に変更することもできます。

デプロイタスクなどはこちらにしたほうが良いかもしれません。

triggerを使用しない場合はauto(pushがトリガー)になるので注意。


使用例

image: ruby:2.5

pipelines:
branches:
develop:
- step:
trigger: manual
name: deploy
script: sh deploy_shimasu.sh


deployment

デプロイステップには使うようにしましょう。

deploymentsダッシュボードで扱えるようになります。

deploymentsの詳細に関してはまた別記事に書こうかなーと思ってます。


使用例

image: ruby:2.5

pipelines:
branches:
develop:
- step:
deployment: test
script: echo "start test deploy"


size

使用するコンテナのサイズを変更できます。

1xもしくは2xが使えるようです。

2xにした場合ビルド時間も二倍でカウントされるので注意

(bitbucketはCircleCIと課金体系がちょっと違い、ビルド時間に対して料金が変動します。)


使用例

image: ruby:2.5

pipelines:
branches:
develop:
- step:
size: 2x
script: echo "start many tests"


script

コンテナ内で実行したいコマンドを記述します。


使用例

image: rails:5.0.1

pipelines:
branches:
develop:
- step:
script: rspec spec/


artifacts

stepでの成果物を後のstepで使用するために使います。


使用例

image: python:3.6

pipelines:
branches:
develop:
- step:
script: rspec spec/ –format html:test_result.html
artifacts: test_result.html
- step:
name: report test result


options

パイプラインすべてに適用できるオプションを設定します。

現状max-timeしかないようです。


max-time

max-timeは一つのstepの最大時間を設定できます。

単位は分なので注意


使用例

options:

max-time: 60
pipelines:
default:
- step:
name: Sleeping step
script:
- sleep 120m
- step:
name: quick step
max-time: 5
script:
- sleep 120m #this step will timeout after 5 minutes

上の例のようにstep内に記述することでoptionに記述したものの掛け算をして使うことができます。


clone

コンテナにクローンするときの設定を記述します。


depth

depthはどこまでのコミットを含めてクローンしてくるかを設定できます。

デフォルトは50です。


使用例

clone:

depth: 5 # include the last five commits

pipelines:
default:
- step:
name: Cloning
script:
- echo "Clone all the things!"


definitions

複数コンテナを連動させたいときや、キャッシュをとっておきたいときはdefinitionsで定義します


services

複数コンテナを連動させて使いたいときはservicesで名前を定義してパイプラインで使うことができます。


使用例

pipelines:

branches:
master:
- step:
image: redis
script:
- redis-cli -h localhost ping
services:
- redis
- mysql
definitions:
services:
redis:
image: redis:3.2
mysql:
image: mysql:5.7
environment:
MYSQL_DATABASE: my-db
MYSQL_ROOT_PASSWORD: $password


caches

ビルドの度に依存関係を毎回インストールするのは、時間もかかりますし料金もかかります。

cachesを使うことでキャッシュをとっておくことができます。


使用例

image: ruby:2.4.0

pipelines:
default:
- step:
caches:
- bundler #cache is defined below in the definitions section
script:
- bundle install --path vendor/bundle

definitions:
caches:
bundler: vendor/bundle


Tips


ビルドコンテナ内からサーバにssh接続をしたいとき

CI自体はbitbucketが管理するクラウド上のコンテナで動きます。

そのため、デプロイ先のサーバ内でなにかしらのスクリプトを動かしたいときは、

そのコンテナから接続できるようにする必要があります。


  1. 「設定」→「PIPELINES」→「SSH keys」
    スクリーンショット 2018-12-18 13.49.56.png

  2. Generate Keys
    スクリーンショット 2018-12-18 13.51.38.png

  3. 公開鍵が発行されるので、デプロイ先のサーバ内で公開鍵認証設定をする。
    https://qiita.com/nnahito/items/dbe6fbfe347cd66ae7e6

  4. 接続!

ちなみにsshのオプションでよくやる「-i .ssh/kagidayo.pub」みたいな指定は要りません。

bitbucketがうまくやってくれます。


デプロイ先サーバにIP制限をかけたい

CircleCIだとIPが公開されていないので、

cliを使ってごにょごにょやる必要があり少し手間ですよね。

bitbucket-pipelinesだとこちらにbitbucket cloudのIPが公開されていますので、

接続許可設定をしてあげればよいです。


まとめ

自分で作ったパイプラインが動いてグリーンになるのは面白いし気持ち良いので

CIをどんどん導入していきましょう!

次回は実践編を書きたいと思います!

明日は食を愛し食に喰われた男@suzu-4が何か伝えます。

Salud!!🌵


参考/引用

https://ja.confluence.atlassian.com/bitbucket/configure-bitbucket-pipelines-yml-792298910.html