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を分けることもできます。
使用例
image: python:3.6
pipelines:
default:
- step:
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:
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:
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の実行対象とすることができます。
アスタリスクを使うこともできます。
使用例
image: python:3.6
pipelines:
branches:
develop:
- step:
script: echo "developだけですよ"
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が管理するクラウド上のコンテナで動きます。
そのため、デプロイ先のサーバ内でなにかしらのスクリプトを動かしたいときは、
そのコンテナから接続できるようにする必要があります。
- 「設定」→「PIPELINES」→「SSH keys」
ちなみにsshのオプションでよくやる「-i .ssh/kagidayo.pub」みたいな指定は要りません。
bitbucketがうまくやってくれます。
デプロイ先サーバにIP制限をかけたい
CircleCIだとIPが公開されていないので、
cliを使ってごにょごにょやる必要があり少し手間ですよね。
bitbucket-pipelinesだとこちらにbitbucket cloudのIPが公開されていますので、
接続許可設定をしてあげればよいです。
まとめ
自分で作ったパイプラインが動いてグリーンになるのは面白いし気持ち良いので
CIをどんどん導入していきましょう!
次回は実践編を書きたいと思います!
明日は食を愛し食に喰われた男@suzu-4が何か伝えます。
Salud!!🌵
参考/引用