Elixir/Phoenixアプリをパブリックに公開するとき、一番手軽な方法はおそらく Gigalixir にデプロイすることです。
Gigalixirは、Elixirに対するサポートが強い(Hot Upgradeできたりします)HerokuのようなPaaSです。Herokuと同様にCLIでアプリを作って設定を行い、git pushするだけでデプロイできます。DB(PostgreSQL)も使えます。
Gigalixirの基本や導入については @piacerex さんの記事が分かりやすくまとまっているので、そちらをご覧ください。
手動でデプロイしたくない!
PhoenixはProductive |> Reliable |> Fast なフレームワークなので、たくさん改善してたくさんデプロイしたいですよね。それなのに、git pushだけでいいとはいえわざわざ手動でデプロイしたくありません。
ということで、みんな大好きGitHub Actionsで自動デプロイできるようにしてみましょう。
マーケットプレイスを探してみる
ありました。
このactionを使えば解決!なんですが、個人的に少し気に入らない点があります
- uses: mhanberg/gigalixir-action@<current release>
with:
GIGALIXIR_USERNAME: ${{ secrets.GIGALIXIR_USERNAME }}
GIGALIXIR_PASSWORD: ${{ secrets.GIGALIXIR_PASSWORD }}
GIGALIXIR_APP: my-gigalixir-app # Feel free to also put this in your secrets
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
MIGRATIONS: false # defaults to true
- Gigalixirアカウントのパスワードを使わないといけない
- SSH秘密鍵を使わないといけない
パスワードもSSH秘密鍵も、あまり外に出したくないですよね…
ちなみに、ソースコードを見るとGigalixir CLIをインストールしているようです。あれ?git pushだけでいいんじゃなかったっけ?
公式ドキュメントを見る
素直に公式ドキュメントを見てみましょう
How to Set Up Continuous Integration (CI/CD)?
やりたいことど真ん中なセクションがありました。GitHub Actionsを使う方法も書いてありますが、Travis CIの例を見るとGigalixir CLIは使っていません
script:
- git remote add gigalixir https://$GIGALIXIR_EMAIL:$GIGALIXIR_API_KEY@git.gigalixir.com/$GIGALIXIR_APP_NAME.git
- mix test && git push -f gigalixir HEAD:refs/heads/master
どうやらGigalixirのAPIキーが必要なようです。発行しましょう。
GigalixirのAPIキーを発行する
管理コンソールの「Account > API Key」でAPIキーを確認できます。明示的に発行しなくても、アカウントを作った時点ですでに発行されているはずです。
(APIキーはすでに更新しているので、ご心配なく)
GitHub Actionsの設定ファイルを書く
main
ブランチにプッシュされたら自動デプロイされるようにします。
name: Deploy to Gigalixir
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: git push gigalixir
run: |
git remote add gigalixir https://${{ secrets.GIGALIXIR_EMAIL }}:${{ secrets.GIGALIXIR_API_KEY }}@git.gigalixir.com/${{ secrets.GIGALIXIR_APP_NAME }}.git
git push -f gigalixir HEAD:refs/heads/master
1つ注意が必要なのが、actions/checkout@v2
をデフォルト設定で使うとshallow cloneとなり、このままgit pushするとエラーが出てしまうため、fetch-depth: 0
を指定する必要があります。2021/01/23時点で起こっていたエラーなので、今は解決しているかもしれません。
.github/workflows/deploy_to_gigalixir.yml
を追加して main
ブランチにプッシュすると、GitHub Actionsによって自動デプロイされます
最後に
mhanberg/gigalixir-action
ではデプロイ時にDBマイグレーションも行えるようですが、git pushだけではDBマイグレーションを行うことができません。が、Gigalixirは Distillery というリリースパッケージを作成できるツールに対応していて、Distilleryを使うとPhoenixアプリの起動時にDBマイグレーションを行うように設定できるので、対応したい方はそれぞれの公式ドキュメントを見ながら設定してみてください。
また、私がPhoenix LiveViewの勉強用に作ったTodoアプリで自動デプロイされるように設定しているので、興味があればこちらもご覧ください
2021/04/06追記
Elixir1.9以降であれば、標準で mix release を使うことができます。DistilleryのようにHot Upgradesはできませんが、より手軽にリリースパッケージを作成できるので、Hot Upgradesが必要ない場合はmix releaseも試してみてください。