Herokuで実現する継続的デリバリのためのワークフロー
チームで開発する際にGitHub Flow(日本語訳)を採用するケースが多いのではないでしょうか。ただ、GitHub Flow内で紹介しているデプロイ手法を実現しようとすると、Hubotをいれたり、Hubotのためのサーバを立てたり、設定やらで案外大変だったりします。
そこで、GitHub Flowとも親和性の高い、Herokuのパイプライン(Pipeline)とレビューアプリ(Review App)を使って、簡単に実現できる継続的デリバリのためのワークフローをご紹介します。
概要
まず、おおよその流れを以下にまとめます。
設定
それでは、Railsを使ったプロジェクトをベースに設定をみていきましょう。
プロジェクトの準備
使用するRubyとRailsのバージョンは以下のとおりです。
まず、プロジェクトを作成します。
$ rails new kitadake
$ cd kitadake
Gemfile
にRubyのバージョンを指定しておきます。
ruby '2.3.1'
あと、PostgreSQLを使えるようにしておきます。
gem 'pg'
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と連携します。
[Connect to GitHub]をクリックすると、リポジトリを選択できる画面が開きます。
チームを選択して、[Search]を押すと一覧が表示されるので、連携したいリポジトリの[Connect]ボタンを押します。
これで、GitHubとの連携ができたので、最新のmasterをstagingアプリとproductionアプリに反映して、使用するBuildpackなどの設定をします。
stagingアプリの設定メニューを開きます。
[Deploy Branch]を選択します。
masterを選択して、[Deploy]を押します。
同様の手順でproductionアプリもmasterをデプロイします。
ここで、さらにmasterにコミットがあったらstagingアプリに自動でデプロイする設定をします。
stagingアプリのメニューから[Configure automatic deploys...]を選択します。
masterにコミットがあったら自動デプロイするので、masterを選択します。
CIを走らせている場合は、[Wait for CI pass before deploy]をチェックすることでCIが通ってからデプロイできるようにすることもできます。
[Enble Automatic Deploys]を押して設定を反映します。
レビューアプリの設定
次に、レビューアプリの設定をしていきます。
先ほど、GitHubと連携したタイミングで、レビューアプリの列が表示されるので、そこからレビューアプリを有効にします。
[Enable Review Apps]を押すと、設定画面が表示されます。
レビューアプリは、GitHubでプルリクが作成されるたび、動的に作成されます。そのため、アプリに関する設定値をリポジトリに保持しておく必要があります。stagingの設定値をベースにするのがいいので、ここでは[kitadake-staging]を選択して[Create an app.json File...]を押します。
デプロイ後に実行するコマンドを指定します。データベースは常にクリアされるので、Railsだとスキーマ作成のためのdb:migration
と確認用に必要なデータを投入するためのdb:seed
を指定しておくと便利です。
テキストフィールドに入力すれば、出力内容に反映されるので、内容を確認して、[Commits to Repo]を押します。
これで、app.jsonがGitHubのリポジトリにコミットされます。
引き続き、レビューアプリの設定画面が開くので、プルリクが作成されるたびに自動でレビューアプリを作成するための、[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し、プルリクエストを作成します。
プルリク上でデプロイが開始されたことが確認できます。
しばらくして、デプロイが完了すると表示が切り替わります。
[View deployment]を押して、デプロイされたアプリの確認をすることができます。
アプリの動作とコードのレビューが完了したらマージします。
確認
masterにマージされると、stagingに自動でデプロイが走ります。パイプラインの画面でデプロイの進捗を確認できます。
さらに、アプリの動作を確認するためには、
メニューから[Open app in browser]を選択すると、別画面でアプリを表示することができます。
本番反映
stagingで動作の確認ができたら、
[Promote to production...]を押して、内容を確認します。
[Promoto]を押して、productionへのデプロイをします。
productionの列でデプロイの状況を確認できます。
また、stagingアプリと同様に、[Open app in browser]でproductionアプリを確認することができます。
まとめ
同様の事はCircleCIやJenkinsなどのCIツールを使って実現できましたが、より簡単でシームレスな使い勝手になっているので、ワークフローが非常にスムーズになりました。