📚

【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を使用する場合に設定が必要とのこと
https://kamal-deploy.org/docs/configuration/builder-examples/#gha-cache-configuration

各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へデプロイできるのは激アツですね。
手動でのデプロイって何かと面倒ですし、頻度が多いとなおさらですね。

これでめでたし!!

参考記事

https://gist.github.com/acidtib/df6fcdacfcf6063d2ec3d399e5ae8f5c

Discussion