アプリケーションエンジニアの西辻です。2017年4月からHousmartで主にAndroidアプリ開発を担当しています。今回のブログでは、弊社のCI環境としてメインで利用している Bitbucket Pipelines についての活用事例についてご紹介したいと思います。
Overview
元々CI
としてはWercker
を利用していたのですが、社内でソースコードを管理しているBitbucket
内でもCI
を利用できることがわかったので
利用するプラットフォームを減らす目的でBitbucket Pipelines
を導入してみようという流れになりました
利用してみて特に問題なく運用できているのでこの記事では、Bitbucket Pipelines
で何ができるのかと
実際の運用方法について書いていこうと思います
公式ドキュメント
https://confluence.atlassian.com/bitbucket/configure-bitbucket-pipelines-yml-792298910.html
Bitbucket Pipelines の基本的な知識
docker image
を利用できるので各プロジェクトに適した環境でCI
をスタートできるdocker-compose
のような利用ができる(redis
,mysql
などを別コンテナとして起動できる)- 指定された
yml
ファイルをRepository
の直下に配置だけで動作する Bitbucket
内のプルリクにCI
の結果が表示できる- 指定したディレクトリを
cache
にできる(bundle install
の高速化などに利用) - 制限はあるが
docker
コマンドを利用できる(ECS
へimage
をpush
できる) CI
で利用できる環境変数が豊富- 課金は利用した
Pipelines
の時間に応じて使ったぶんだけ請求される(ちょっと試すくらいであれば無料でできます)
Bitbucket Pipelines で実現できていること
正直なんでもできます
現在の運用では以下のことをBitbucket Pipelines
で実行しています
Ruby project
rspec
の実行rubocop
でのsyntaxチェックECS
へのimage push
submodule
を利用しているRepository
の依存解決
Android project
JUnit
の実行Fabric Beta
へapk
ファイルのアップロードmaster
ブランチにマージする際にBeta
版としてGoogle Play Console
に配信
Bitbucket Pipelines を使ってみる
左のサイドバーにPipelines
のアイコンがあるのでそこから設定をすることができます
チュートリアルがかなり充実しているので実際にやってみた方が早いでしょう
仕組みとしては以下のbitbucket-pipelines.yml
をRepository
の直下に配置するだけで動きます
image: ruby:2.4.0
pipelines:
default:
- step:
caches:
- bundler
script:
- bundle install
definitions:
caches:
bundler: ./vendor
これは新規作成で作成されるサンプルをそのまま貼り付けただけなのですが、簡単に何をしているか説明します
image:
で利用したいimage
を指定します
dockerhub
に上がっているpublic image
であれば基本なんでも利用できると思います
また、以下のように記載することでprivate image
も利用可能です
自分で作成したimage
内に公開してはいけない情報を持つ場合はdockerhub
でprivate image
にして利用するのがいいでしょう
$DOCKER_HUB_USERNAME
などはBitbucket
のProject
の設定でPipelines
に対してセットできる環境変数になります
image:
name: housmart/kawlu-pipeline:latest
username: $DOCKER_HUB_USERNAME
password: $DOCKER_HUB_PASSWORD
default:
セクション以下に記載するとgit push
されたタイミングでどのブランチに対してもPipelines
が実行されます
特定のブランチに対する処理を分けることも可能です
現在の運用ではmaster
, develop
, KAW-*
ブランチに対してそれぞれ異なる処理になるように設定しています
利用はしていないですが、tag
でも指定できます
pipelines:
branches:
master:
- step:
script:
- 省略
develop:
- step:
script:
- 省略
KAW-*:
- step:
script:
- 省略
definitions:
ではキャッシュしたいディレクトリの指定や別コンテナで起動したいサービスなどを指定します
以下の例ではredis
を別コンテナで起動しています
definitions:
caches:
bundler: /usr/local/bundle
services:
redis:
image: redis
価格について
これから導入を考えてる方へ
参考までに社内で現在どれくらい利用していくらかかっているか興味があると思うので共有しておきます
Ruby
Repository : 6
Android
Repository : 1
Pull Requestは全体で1日平均3~4くらいになります
ちょうど月半ばくらいで2,788 minutes 利用しているので1ヶ月だと5,000 minutes くらいになりそうです
金額としては現在の Plan が500 build minutes 含めているので $50/month のコストで運用しています
その他 Tips
bitbucket-pipelines.yml の syntax check tool
書いたyml
ファイルが正しいかどうかオンラインでチェックするツールがあります
https://bitbucket-pipelines.atlassian.io/validator
rubocop の運用について
今回のメインの記事であるPipelines
の話からは少しずれますが
既存のrails
プロジェクトにrubocop
を導入したのですが、いきなり全てを対象にするととんでもないことになったので
現在の運用ではdevelop
ブランチと差分ファイルがあるものだけをrubocop
の対象にしています
こうすることで今後の修正で少しずつ改善していけるサイクルができあがりました
ECS への image push について
ECSへの認証は12時間でリフレッシュされるのでCI
を導入する上で以下の設定を導入しました
https://aws.amazon.com/blogs/compute/authenticating-amazon-ecr-repositories-for-docker-cli-with-credential-helper/
終わりに
今回の記事ではBitbucket Pipelines
に関する設定や運用方法について書いてみました
世の中的には Github ユーザの方が多いかと思いますが
個人で private repository を無料で作れたりとBitbucket
を利用するメリットはあるので
Pipelines
、是非活用してみてください
docker
ベースのCI
ツールなのでカスタマイズしてやれることはかなり多いのも魅力的ですね
個人的にはAndroid
のビルド時間がおよそ5分で終わったりとPipelines
の動作するマシンの性能の良さに非常に満足しています
Housmartではエンジニアを募集しています。
今話題のReTech!業界を変えるカウルを支えるエンジニアをWanted!