株式会社チュートリアルでWebエンジニアを担当しています有賀です。
この記事は『Tutorial Advent Calendar 2020』の18日目です。
はじめに
今回の記事の内容は前回の記事の内容の続きです。前回は簡単なRailsアプリをGithub Actionsで構築したCI環境でビルド、テストを行っていく流れを紹介しました。今回はリポジトリへのpushをトリガーにして、ビルド、テストし、Herokuにアプリをデプロイして公開するまでの流れを紹介していきます。
前提知識
- Rails開発に関する入門レベルの知識
- CI/CDに関する入門レベルの知識
- yamlファイルに関する入門レベルの知識
- コンテナに関する入門レベルの知識
- Herokuに関する入門レベルの知識
各種環境、バージョン
- MacOS Catalina 10.15.4
- Ruby 2.6.6
- Rails 6.0.3
- Docker 19.03.8
- docker-compose 1.25.5
- MySQL 5.7
Herokuのセットアップ
まずはHerokuサイト内のログイン後トップページから「Create new app 」を選択してHeroku内にアプリデプロイ用の環境をセットアップしていきます。ここで最初に指定するアプリ名はユニークなものである必要があるので、今回はcicd-testというアプリ名にイニシャルのaをprefixとしてつけておきます。
HerokuにGithubと連携してデプロイを行うには、Github側でもGithub SecretにHeroku API Keyを登録しておく必要があります。(HerokuのAPI Keyはこちらから確認できます)Github Secretを登録する手順は以下の通りです。
- Githubのリポジトリのメインページに移動します。
- リポジトリ名直下のメニューのSettingsを選択します。
- 左サイドバーのSecretsを選択します。
- New repository secretを選択します。
- NameにHEROKU_API_KEYと入力します。
- ValueにHeroku側で確認できるAPI keyを入力します。
Secretを作成完了すると、こんな感じで登録されていると思います。
次に本番環境ではHerokuの用意するDBを使用するため、MySQLを動かすのに必要なアドオン(ClearDB MySQLを利用)を指定します。
続いてデプロイ関連に必要な設定を行います。Settingsから環境変数を設定するConfig Varsという項目があるのでこちらに必要な環境変数をセッティングしていきます。DATABASE_URLはアドオン導入時に自動でセットしてくれているので、SECRET_KEY_BASEにアプリのmaster.keyを入れて登録しましょう。
最後にDeployからDeployment methodにGithubをAutomatic deploysに「Wait for CI to pass before deploy」にチェックを入れて設定すればOKです。
設定ファイルの編集
次にGithub Actions設定用のworkflow yamlにデプロイ用の設定を追記していくのですが、ここでさきほど登録しておいたSecretを使用します。
name: RailsTest
on: [push]
jobs:
build:
runs-on: ubuntu-latest
services:
db:
image: mysql:5.7
env:
MYSQL_USERNAME: dbuser
MYSQL_ROOT_PASSWORD: dbpass
container:
image: ruby:2.6
env:
RAILS_ENV: test
MYSQL_HOST: db
MYSQL_USERNAME: dbuser
MYSQL_ROOT_PASSWORD: dbpass
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v1
with:
path: vendor/bundle
key: bundle-${{ hashFiles('**/Gemfile.lock') }}
- uses: actions/cache@v1
with:
path: node_modules
key: yarn-${{ hashFiles('**/yarn.lock') }}
- name: Setup yarn and node
run: |
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
apt-get update -qq
apt-get install -y nodejs yarn
yarn install
- name: Setup bundles
run: bundle install
- name: Setup Database
run: |
bundle exec rails db:create
bundle exec rails db:migrate
- name: Run tests
run: |
bundle exec rails test
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: akhileshns/heroku-deploy@v3.7.8
with:
heroku_api_key: ${{secrets.HEROKU_API_KEY}}
heroku_app_name: 'Herokuに登録したアプリ名'
heroku_email: 'Herokuに登録したメールアドレス'
新しく出てきた構文を紹介します。needsは指定したjobの完了を待ってから、自身のjobを実行します。つまり、ここではbuildというjobの完了を待ってビルドとテストが正常に完了したことを確認できたらdeployというjobが走りHerokuへのデプロイ作業がはじまるわけです。
needs: build # buildのジョブが完了したらdeployを実行
また、HerokuのDBを使用するためにdatabase.ymlの編集を行います。production環境の時にさきほどHerokuで登録しておいた環境変数でDBのURLに接続できるようにしておきます。
production:
url: <%= ENV['DATABASE_URL'] %>
最後に、デプロイ後にマイグレーションやサーバーを立ち上げるコマンドを実行するためにProcfileをルート直下に用意します。以下のように記述すれば準備は完了です。
release: bundle exec rails db:migrate
web: bundle exec puma -C config/puma.rb
あとはファイルを修正して、Githubにpushしてしばらくまてば、自動デプロイが成功しているはずです。
おわりに
本番用にはHerokuは中々使用しないと思うので、今回の経験を活かしてAWSのECSやEKS、GCPのGKEへの自動デプロイにもチャレンジしていければと思っています。