これからCIを導入したいそこのあなた! Bitbucket Pipelines はいかが? ~Bitbucket Pipelines の活用事例~

アプリケーションエンジニアの西辻です。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コマンドを利用できる(ECSimagepushできる)
  • CIで利用できる環境変数が豊富
  • 課金は利用したPipelinesの時間に応じて使ったぶんだけ請求される(ちょっと試すくらいであれば無料でできます)

Bitbucket Pipelines で実現できていること

正直なんでもできます
現在の運用では以下のことをBitbucket Pipelinesで実行しています

Ruby project

  • rspecの実行
  • rubocopでのsyntaxチェック
  • ECSへのimage push
  • submoduleを利用しているRepositoryの依存解決

Android project

  • JUnitの実行
  • Fabric Betaapkファイルのアップロード
  • masterブランチにマージする際にBeta版としてGoogle Play Consoleに配信

Bitbucket Pipelines を使ってみる

左のサイドバーにPipelinesのアイコンがあるのでそこから設定をすることができます
チュートリアルがかなり充実しているので実際にやってみた方が早いでしょう

仕組みとしては以下のbitbucket-pipelines.ymlRepositoryの直下に配置するだけで動きます

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内に公開してはいけない情報を持つ場合はdockerhubprivate imageにして利用するのがいいでしょう
$DOCKER_HUB_USERNAMEなどはBitbucketProjectの設定で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!