読者です 読者をやめる 読者になる 読者になる

ボクココ

サービス開発を成功させるまでの歩み

Bitbucket Pipeline で運用がちょっとだけ幸せになれた話

Heroku

ども、@kimihom です。

f:id:cevid_cpp:20161108213733p:plain

自分は Github ではなく Bitbucket を利用している。その Bitbucket が 最近 Bitbucket Pipeline ってのが出てきたので使ってみた。Bitbucket は落ちないし、いいよ!

Bitbucket Pipeline を利用しての自動デプロイ

Bitbucket Pipeline はとてもシンプルな Docker 環境で動く CI。ソースディレクトリの直下に、bitbucket-pipelines.ymlを置くだけで、いろいろな CI の実行を指定できる。

よくあるのがデプロイした瞬間にテストを走らせてチェックするような CI 。誰かがデプロイした時にテストが正しく通っているってことを保証するって意味でとても重要なことだ。サンプルにある Ruby の設定はこんな感じ。

# You can use a Docker image from Docker Hub or your own container registry
image: ruby:2.3.0
  
pipelines:
  default:
    - step:
        script:  # Modify the commands below to build and test your repository.
          - ruby --version
          - bundler --version
          - bundle install

どんなブランチがデプロイされても、とりあえず bundle install するっていう全く意味のない CI だw 少なくともこの後、bundle exec rake spec とかを実行したいものだが、そうすると環境によっては実行に失敗する。その場合は、 Docker イメージを別のに指定しなければならない。

Docker Hub ってのがあるらしい。 公開中のDocker イメージを集めた Github のようなものだ。この中で人気のある順とかで自分の環境に適してそうな Docker イメージを選択して、先ほどの image に指定すれば動くらしい。

自分の場合は、担当する Rails プロジェクトが自分一人なので、Bitbucket Pipeline でテスト実行する必要はなく、ローカルで実行すりゃいいだけなので設定するのはやめた。それよりも Heroku のデプロイの自動化をしたかったので、それのサンプルがこんな感じ。

pipelines:
  branches:
    develop: # only develop branch
      - step:
          script:
            - export HEROKU_APP_NAME=***
            - export HEROKU_API_KEY=***
            - ./bin/heroku_deploy.sh

今回は develop ブランチを指定している。この時だけ Heroku へアップする。 Heroku をはじめとした各環境へのデプロイスクリプトは、Examples of integrations for Bitbucket Pipelines に載っているのでチェックしてみよう。Heroku のスクリプトもここに載っている。Heroku の API_KEY は heroku auth:token を叩くとってこれる模様。初めてこのコマンド使ったわ。

んで、うまくいった場合には Slack に通知したいよね、ってなるわけ。CI を使うと良くある話だ。 Bitbucket Pipeline は当然それにも対応していて、方法は Notifications for Bitbucket Pipelines に載っている。 Slack の場合は Webhook URL を発行し、その Webhook を Bitbucket の Bitbucket repository > Settings > Webhooks にセットすればいいだけだ。その時にチェックする通知オプションは、Build status updated だ。

f:id:cevid_cpp:20161108214402p:plain

改善できたこと

Heroku へのデプロイは、おなじみの git push heroku master で動く。これは毎回デプロイのために Heroku で用意した リモートの Git ブランチに push する必要がある。これで Git 管理することは難しいので、当然 Bitbucket のような 他の Git リポジトリにソースを置く必要がある。てことで、Heroku を使う場合は大抵はリモートに Heroku と Bitbucket/Github などが混在することになる。

自分たちの場合は 開発者でなくても Bitbucket 上でちょっとした HTML の修正や、文言の修正が行えるようになっている。これを Heroku に反映したいって時は自分が git push heroku master する必要があった。これを今回の Bitbucket Pipeline によって、自分がわざわざこのコマンドを打たなくても、 Bitbucket 上で develop ブランチのソースを編集しただけで Heroku にデプロイできるような環境が整った。

自分としても毎回 git push heroku mastergit push origin develop するのは2度手間だったってのがあるので、git push origin develop だけで済むようになったのはちょっとだけ改善できた感じがする。

今まで勝手に STG にデプロイしてたのが、みんなにSlackで通知できるようになったってのも改善かもな。ここは他の迷惑になってるだけになる可能性もあるので注意。

終わりに

本当はより適切な Docker Image を使ってテストの実行をしてからデプロイみたいな感じにすべきなんだろうけど、そこまでの必要性はなかったので今回は書いていない。今後、 Bitbucket Pipeline でそういったことがうまくいけば記事にしようと思う。