はじめに
本記事では、GitHub Actions
経由で、Heroku
にアプリケーションをデプロイする CI 環境の構築方法を紹介します。
GitHub Actions
で CI 環境を構築する記事は既にたくさんあるのですが、
- 「Heroku + GitHub Actions」の記事が少ない
- 日本語記事はほとんど無かった
- 英語記事はあるが内容が古いものが多かった
ことから、備忘録がてら、記事に残そうと思いました。
本記事のスコープ
本記事のスコープは以下を満たす人です。
- Heroku 上で、アプリケーションを既に稼働させている
- GitHub Actions で、アプリケーション の CI 環境を構築したい
GitHub Actions で CI 環境を構築する
実現したいワークフロー
- アプリケーションのリポジトリの
master
ブランチのコミットが進んだときにワークフローが起動する -
GitHub Actions
実行環境で、アプリケーションのリポジトリにチェックアウトする - (テストを実行する。本記事では割愛)
- Heroku に アプリケーションをデプロイする
Heroku の API TOKEN をGitHub Actions に登録する
- アプリケーションの
GitHub
リポジトリを開く - Settings > Secrets > New secret をクリック
- 以下の情報を入力して保存する
Name: HEROKU_API_TOKEN
Value: [Heroku-CLI で heroku auth:token と入力して得られる API TOKEN の値]
ワークフローを作成する
リポジトリ直下に/.github/workflows/deploy.yml
を作成して、push すれば CI 構築完了。
name: deploy
on:
push:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Deploy to Heroku
env:
HEROKU_API_TOKEN: ${{ secrets.HEROKU_API_TOKEN }}
HEROKU_APP_NAME: [Heroku上で登録しているアプリ名]
if: github.ref == 'refs/heads/master' && job.status == 'success'
run: |
git push https://heroku:$HEROKU_API_TOKEN@git.heroku.com/$HEROKU_APP_NAME.git origin/master:master
fetch-depth: 0
が重要で、これが無いと actions/checkout@v2
プラグインのチェックアウトが shallow clone
となってしまいます。Heroku 上で独自管理している Git リポジトリに push することでデプロイを行う関係上、最新コミットしか取得しない shallow clone をして push すると、コミットログの対応が取れずエラーとなってしまします。
元々、actions/checkout
プラグインにこの仕様が無かったからなのか、「Heroku + GitHub Actions」の記事を探すと、fetch-depth: 0
が無い記事ばかり見つかるので、気をつけてください。自分はこの部分で若干ハマってしまいました。
おわりに
AkhileshNS/heroku-deploy というプラグインもあるので、より複雑な処理を簡潔に記述したいと思う人は試してみると良いと思います。自分は、不要なemailアドレス情報を登録したくなかったので、採用しませんでした。
以上で、GitHub Actions で Heroku の CI 環境を構築する方法の解説はおしまいです。
何か突っ込みポイントなどあれば、ご指摘いただければ幸いです。