📚
【Rails8】KamalをGithub Actionsでデプロイしてみる
ゴール
GithubAction + kamalを使用して、Rails8アプリを自動デプロイする。
前提
下記を完了し、手元でkamal setupでのデプロイができていること
【kamal2】EC2にRails8アプリをデプロイしてみる (DockerHub不使用)
ではやっていこう!!
いったん全体像を書いて、なぜ必要かを別で書いていきます!
全体像
name: kamal-deploy
on:
push:
branches:
- main
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
- name: Install kamal
run: |
gem install specific_install
gem specific_install https://github.com/basecamp/kamal.git
- name: Set up Docker Buildx for cache
uses: docker/setup-buildx-action@v3
- name: Expose GitHub Runtime for cache
uses: crazy-max/ghaction-github-runtime@v3
- name: Create pem key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_KEY }}" > ~/.ssh/cask-tokyo-ec2.pem
- name: Create master key
run: |
mkdir -p config
echo "${{ secrets.RAILS_MASTER_KEY }}" > config/master.key
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
- name: Deploy
run: bundle exec kamal deploy
下記4点は、Githubのリポジトリシークレットに設定しておく必要があります。
SSH_KEY:SSH接続用 pemファイルの中身
RAILS_MASTER_KEY:Rails master.keyの中身
AWS_ACCESS_KEY_ID:AWS CLI用アクセスキー
AWS_SECRET_ACCESS_KEY:AWS CLI用シークレット
個々の説明
チェックアウト
- name: Checkout code
uses: actions/checkout@v4
GithubActionでの必須処理。
リポジトリ内のコードをGithubActionsが使用するために記述
Rubyインストール
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
Rubyインストール bundle / kamalを使用するために必要
※バージョンは.ruby-versionを参照
GithubActionキャッシュ構成設定
- name: Set up Docker Buildx for cache
uses: docker/setup-buildx-action@v3
- name: Expose GitHub Runtime for cache
uses: crazy-max/ghaction-github-runtime@v3
Kamal公式によると、GithubActionを使用する場合に設定が必要とのこと
各keyファイル生成(pemファイル/master.key)
- name: Create pem key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_KEY }}" > ~/.ssh/cask-tokyo-ec2.pem
- name: Create master key
run: |
mkdir -p config
echo "${{ secrets.RAILS_MASTER_KEY }}" > config/master.key
GithubActionsのリポジトリシークレットに各キーの中身を設定し、アクション内で適切なファイルに配置する。
AWS CLIアクセス情報設定
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
今回ECRをDockerのリポジトリとして使用しているため、AWS CLIのアクセス情報を設定する。
Kamal deploy
- name: Deploy
run: bundle exec kamal deploy
最後にkamalでDeployします。
以上
EC2へデプロイできるのは激アツですね。
手動でのデプロイって何かと面倒ですし、頻度が多いとなおさらですね。
これでめでたし!!
参考記事
Discussion