Herokuで実現する継続的デリバリのためのワークフロー

チームで開発する際にGitHub Flow(日本語訳)を採用するケースが多いのではないでしょうか。ただ、GitHub Flow内で紹介しているデプロイ手法を実現しようとすると、Hubotをいれたり、Hubotのためのサーバを立てたり、設定やらで案外大変だったりします。

そこで、GitHub Flowとも親和性の高い、Herokuのパイプライン(Pipeline)とレビューアプリ(Review App)を使って、簡単に実現できる継続的デリバリのためのワークフローをご紹介します。

概要

まず、おおよその流れを以下にまとめます。

f:id:hrtkmztn:20160725144117p:plain

設定

それでは、Railsを使ったプロジェクトをベースに設定をみていきましょう。

プロジェクトの準備

使用するRubyRailsのバージョンは以下のとおりです。

まず、プロジェクトを作成します。

$ rails new kitadake
$ cd kitadake

GemfileRubyのバージョンを指定しておきます。

ruby '2.3.1'

あと、PostgreSQLを使えるようにしておきます。

gem 'pg'

逆に、SQLiteコメントアウトします。

DBの設定ファイルはだいたいこんな感じにしておきます。

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  host: localhost

development:
  <<: *default
  database: kitadake_development

test:
  <<: *default
  database: kitadake_test

production:
  url:  <%= ENV["DATABASE_URL"] %>
  pool: <%= ENV["DB_POOL"] || ENV['MAX_THREADS'] || 5 %>

bundle installします。

$ bundle install

Gitを初期化して、コミットします。

$ git init
$ git add .
$ git commit -am'First commit'

GitHubで新しいプロジェクトを作成して、プッシュします。

$ git remote add origin git@github.com:zenstyle-inc/kitadake.git
$ git push -u origin master

アプリおよびパイプラインの作成

productionとstagingアプリを作成して、パイプラインでつなぎます。

まずは、productionアプリを作成します。

$ heroku create kitadake
Creating ⬢ kitadake... done
https://kitadake.herokuapp.com/ | https://git.heroku.com/kitadake.git

上記のアプリを、パイプラインを作成してproductionとして追加します。

$ heroku pipelines:create -a kitadake
? Pipeline name kitadake
? Stage of kitadake production
Creating kitadake pipeline... done
Adding kitadake to kitadake pipeline as production... done

stagingアプリを作成します。

$ heroku create kitadake-staging
Creating ⬢ kitadake-staging... done
https://kitadake-staging.herokuapp.com/ | https://git.heroku.com/kitadake-staging.git

同様に、先ほど作成したパイプラインにstagingとして追加します。

$ heroku pipelines:add -a kitadake-staging kitadake 
? Stage of kitadake-staging staging
Adding kitadake-staging to kitadake pipeline as staging... done

GitHubとの連携

アプリの一覧に先ほど作成したパイプラインが表示されるので詳細を表示して、GitHubと連携します。

f:id:hrtkmztn:20160725144217p:plain

[Connect to GitHub]をクリックすると、リポジトリを選択できる画面が開きます。

f:id:hrtkmztn:20160725144232p:plain

チームを選択して、[Search]を押すと一覧が表示されるので、連携したいリポジトリの[Connect]ボタンを押します。

これで、GitHubとの連携ができたので、最新のmasterをstagingアプリとproductionアプリに反映して、使用するBuildpackなどの設定をします。

stagingアプリの設定メニューを開きます。

f:id:hrtkmztn:20160725144251p:plain

[Deploy Branch]を選択します。

f:id:hrtkmztn:20160725144304p:plain

masterを選択して、[Deploy]を押します。

同様の手順でproductionアプリもmasterをデプロイします。

ここで、さらにmasterにコミットがあったらstagingアプリに自動でデプロイする設定をします。

f:id:hrtkmztn:20160725144317p:plain

stagingアプリのメニューから[Configure automatic deploys...]を選択します。

f:id:hrtkmztn:20160725144330p:plain

masterにコミットがあったら自動デプロイするので、masterを選択します。

CIを走らせている場合は、[Wait for CI pass before deploy]をチェックすることでCIが通ってからデプロイできるようにすることもできます。

[Enble Automatic Deploys]を押して設定を反映します。

レビューアプリの設定

次に、レビューアプリの設定をしていきます。

先ほど、GitHubと連携したタイミングで、レビューアプリの列が表示されるので、そこからレビューアプリを有効にします。

f:id:hrtkmztn:20160725144347p:plain

[Enable Review Apps]を押すと、設定画面が表示されます。

f:id:hrtkmztn:20160725144401p:plain

レビューアプリは、GitHubでプルリクが作成されるたび、動的に作成されます。そのため、アプリに関する設定値をリポジトリに保持しておく必要があります。stagingの設定値をベースにするのがいいので、ここでは[kitadake-staging]を選択して[Create an app.json File...]を押します。

f:id:hrtkmztn:20160725144412p:plain

デプロイ後に実行するコマンドを指定します。データベースは常にクリアされるので、Railsだとスキーマ作成のためのdb:migrationと確認用に必要なデータを投入するためのdb:seedを指定しておくと便利です。

f:id:hrtkmztn:20160725144422p:plain

テキストフィールドに入力すれば、出力内容に反映されるので、内容を確認して、[Commits to Repo]を押します。

これで、app.jsonGitHubリポジトリにコミットされます。

f:id:hrtkmztn:20160725144438p:plain

引き続き、レビューアプリの設定画面が開くので、プルリクが作成されるたびに自動でレビューアプリを作成するための、[Create new review apps for new pull requests automatically]と使われていないレビューアプリを自動で削除するための、[Destroy Stale review apps automatically]をチェックして、[Enable]を押します。

実際のワークフロー

以上で設定ができたので、実際のワークフローを見てきましょう。

レビュー

プルリクを作成します。"Hello World!"を表示する機能を作成するとします。

コントローラを作成します。

$ bundle exec rails generate controller HelloWorld

routes.rbに、

root to: 'hello_world#index'

app/controllers/hello_world_controller.rb に以下のアクションを追加します。

def index
end

app/views/hello_world/index.html.erb に表示する内容を記述します。

Hello World!

修正をコミットしてブランチをpushし、プルリクエストを作成します。

f:id:hrtkmztn:20160725144505p:plain

プルリク上でデプロイが開始されたことが確認できます。

しばらくして、デプロイが完了すると表示が切り替わります。

f:id:hrtkmztn:20160725144518p:plain

[View deployment]を押して、デプロイされたアプリの確認をすることができます。

f:id:hrtkmztn:20160725144529p:plain

アプリの動作とコードのレビューが完了したらマージします。

確認

masterにマージされると、stagingに自動でデプロイが走ります。パイプラインの画面でデプロイの進捗を確認できます。

f:id:hrtkmztn:20160725144544p:plain

さらに、アプリの動作を確認するためには、

f:id:hrtkmztn:20160725144557p:plain

メニューから[Open app in browser]を選択すると、別画面でアプリを表示することができます。

本番反映

stagingで動作の確認ができたら、

f:id:hrtkmztn:20160725144611p:plain

[Promote to production...]を押して、内容を確認します。

f:id:hrtkmztn:20160725144623p:plain

[Promoto]を押して、productionへのデプロイをします。

f:id:hrtkmztn:20160725144636p:plain

productionの列でデプロイの状況を確認できます。

f:id:hrtkmztn:20160725144651p:plain

また、stagingアプリと同様に、[Open app in browser]でproductionアプリを確認することができます。

まとめ

同様の事はCircleCIやJenkinsなどのCIツールを使って実現できましたが、より簡単でシームレスな使い勝手になっているので、ワークフローが非常にスムーズになりました。