ボクココ

個人開発に関するテックブログ

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

ども、@kimihom です。

Heroku Advent Calendar 2016 の記事です。

f:id:cevid_cpp:20161108213733p:plain

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

注意 201706/17 追記

この記事の内容は古くなってます。最新の Bitbucket Pipeline は無料枠で月50min のビルド実行時間枠となり、だいぶ厳しくなってしまいました。。Rails x Heroku 周りで参考になるリンクをご紹介します。

Heroku デプロイ https://confluence.atlassian.com/bitbucket/deploy-to-heroku-872013667.html

Rspec の実行 https://confluence.atlassian.com/bitbucket/ruby-with-bitbucket-pipelines-872005618.html

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 のスクリプトもここに載っている。そのスクリプトを Rails プロジェクトの適当な場所に放り込んで、それを実行させるような script を bitbucket-pipelines.yml に記述すれば OKだ。 Heroku の API_KEY は heroku auth:token を叩くとってこれる模様。初めてこのコマンド使ったわ。

この時の Heroku デプロイのスクリプトがなかなか興味深い。tgz で固めて、それをそのまま Heroku へアップロードし、その後にそのビルドを本番のビルドへ差し替えるようなシェルスクリプトが書かれていた。こんな Heroku のデプロイ方法もあったのか、と思った。

んで、うまくいった場合には 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 Pipeline とかも出てきたし、Dropbox や Github 経由でのデプロイってのも出てきているみたいだね。Git コマンドでのデプロイの場合は、毎回デプロイのために Heroku で用意した リモートの Git ブランチに push する必要がある。てことで Heroku にも Git リポジトリがあるわけだけども、これだけでソースコードを管理することは難しいので、当然 Bitbucket のような 他の Git リポジトリにソースを置く必要がある。となると Heroku を使う場合は大抵は Git の remote に 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 でそういったことがうまくいけば記事にしようと思う。