GitLab で Rails Tutorial を自動で Heroku にデプロイする
昨日くらいからRuby on Rails チュートリアルを始めました。
やりたいことがあっちこっちにいくことはあまり良くないなと思いつつ、モチベーションがあるうちに終わらせたいなと思ったのでコツコツやってます。
今はちょうど第3章が終わったところです。 10年くらい前に PHP でサービスを作ったことがあり勘所はあったので、今のところそこまで悩まずに進められています。
このチュートリアルの良いところは、テストを意識させてくれるところと、Heroku を使った本番環境へのデプロイがあるところですね。実践的な開発を意識して勉強できることはとてもいいですね。
さて、ここでもう一歩踏み込んだことをしてみたいと思います
手元でテストして Heroku にデプロイするのって面倒くさいですよね?1ってことで、タイトルにある通り、この手順を自動化したいと思います。
チュートリアルだとBitbucket
を使ってますが、僕はGitLab
を使っています。どのホスティングサービスを使うかは好みなのでGitHub
でもいいと思いますが、GitLab
は CI/CD が統合されてるので便利かと思います。GitHub
を使う場合はCircleCI
などほかの CI サービスと連携すれば同じことができます。
最終的には、GitLab
の master
ブランチに push
したときに、自動テストしてパスしたら Heroku
にデプロイできるようにします。
自動でテストを動かす
どこでミスをしたかわかりやすいように、段階を踏んで少しずつ設定をしていきます。
まず GitLab
の master
ブランチに push
したときに、自動テストを行うようにします。
.gitlab-ci.yml
というファイルをリポジトリ直下に置くと、push
したときにこの設定を読んで色々してくれます。
test:
stage: test
script:
- apt-get update -qy
- apt-get install -y nodejs
- gem install rails -v 5.1.4
- bundle install
- rails db:migrate RAILS_ENV=test
- rails test
ただコマンドを羅列しているだけなので、見てもらえればすぐ理解できると思います。注意するところは開発環境と同じバージョンの Rails をインストールするところでしょうか。
rails test
が失敗したら通知が届いて、次のデプロイに進みません。エラーが出る場合はログを見て修正しましょう。
Heroku にデプロイする
テストがすべて成功したらHeroku
にデプロイできるようにしましょう。ここではdpl
というコマンドラインツールを使ってデプロイします。
production:
stage: deploy
script:
- gem install dpl
- dpl --provider=heroku --app=pacific-earth-65195 --api-key=$HEROKU_PRODUCTION_API_KEY
dpl
コマンドの--app
オプションで指定されてる名前は自身のアプリ名を指定してください。
HEROKU_PRODUCTION_API_KEY
は環境変数で、GitLab
に設定します。もしパブリックリポジトリで.gitlab-ci.yml
ファイルにAPIキーを直接書いてしまうと、そのキーを使って誰でもHeroku
にアクセスできてしまうので、セキュリティの観点から危険です。
APIキーは絶対に直接書かずに環境変数などで指定するようにして、誰でも見えるようにしないでください。
Setting``CI/CD
を順にクリックして、Variables
のExpand
をクリックすると環境変数を設定できるようになります。上の画像みたいになるはずです。
ここに入力するAPIキーは、Heroku
のアカウント管理画面に書いてあるAPIキーを使います。
全体像
最終的の.gitlab-ci.yml
は以下のようになります。
test
とdeploy
の2ステージのパイプラインになっていて、test
が成功するとdeploy
が実行されるようになります。
stages:
- test
- deploy
test:
stage: test
script:
- apt-get update -qy
- apt-get install -y nodejs
- gem install rails -v 5.1.4
- bundle install
- rails db:create RAILS_ENV=test
- rails test
production:
stage: deploy
script:
- gem install dpl
- dpl --provider=heroku --app=pacific-earth-65195 --api-key=$HEROKU_PRODUCTION_API_KEY
rails db:migrate を誰がやるのか
Ruby on Rails チュートリアルを進めていくと、rails db:migrate
コマンドを実行することがあります。しかし、上記の設定だとそこまでやりません。
データベースのマイグレーションなので、GitLab
でrails db:migrate
をしても意味がありません。デプロイ先はHeroku
なので、そこで行う必要があります。
そこでRelease Phase
機能2を使います。詳しくは公式ドキュメントを見てほしいのですが、デプロイ後に
- CDN にCSS/JSを送る
- キャッシュを無効化する
- データベースのマイグレーションをする
などを行うための機能です。
Procfile
を使うとHeroku
にいろいろ指示・設定ができます3。Procfile
はルートディレクトリに置く必要があります。
次のように設定するとデプロイした後にrails db:migrate
を行って、それが終わるとデプロイしたバージョンにアクセスできるようになります。
release: rails db:migrate
最後に
これでmaster
にpush
するとテストしてHeroku
にデプロイできるようになりました。少しモダンな環境になりました。
ただ毎回gem insall
を実行するので時間がかかります。
Docker
であらかじめテスト環境を構築しておけばもう少し早くなるのかな…?と思ったりします。
GitLab
上での使い方が分からないのでまた違う機会で調べてみたいと思います。
分からないことがあれば、@takuchalleにリプライでもDMでも聞いてください。