この手の記事が世界の至る所で書かれている気がしますが、シークレットキーを渡す方法を含めて最新の GitHub Actions 情報に対応したものを見つけることができなかったので書きます。

やりたいこと

  • Rspec や Rubocop を GitHub Actions で動かしたい
  • Rails の Environment Credentials を使っているので RAILS_MASTER_KEY を渡したい
  • Dependabot が作成するプルリクにもシークレット RAILS_MASTER_KEY を渡したい

前提

  • Private repository

YAML ファイル

まずは GitHub Actions の設定 YAML ファイルです。PostgreSQL と Redis をサービスコンテナとして用意しています。Ruby の実行には ruby/setup-ruby を使っています。ここらへんは GitHub Actions が用意してくれている Rails テンプレートをそのまま使っています。

name: "Ruby on Rails CI"
on:
  - push
  - pull_request
env:
  RAILS_ENV: test
  DATABASE_HOST: 127.0.0.1
  REDIS_URL: redis://127.0.0.1:6379/1
  RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
jobs:
  test:
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:12.6
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
        env:
          POSTGRES_HOST_AUTH_METHOD: 'trust'
          POSTGRES_USER: root
          POSTGRES_PASSWORD: password
          TZ: UTC
        ports:
          - 5432:5432
      redis:
        image: redis:6
        options: --health-cmd "redis-cli -h localhost ping" --health-interval 10s --health-timeout 5s --health-retries 15
        ports:
          - 6379:6379
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      - name: Install Ruby and gems
        uses: ruby/setup-ruby@8029ebd6e5bd8f4e0d6f7623ea76a01ec5b1010d # v1.110
        with:
          bundler-cache: true
      - name: Set up database schema
        run: bundle exec rails db:create db:schema:load db:seed
      - name: Run yarn
        run: yarn
      - name: Run Rspec
        run: bundle exec rspec

  lint:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      - name: Install Ruby and gems
        uses: ruby/setup-ruby@8029ebd6e5bd8f4e0d6f7623ea76a01ec5b1010d # v1.110
        with:
          bundler-cache: true
      - name: Lint Ruby files
        run: bundle exec rubocop --parallel

GitHub の設定

シークレットをフォーク先や Dependabot で読み取れるようにするには設定が必要です。

Organization 設定

1-min.jpg

Fork pull request workflows in private repositories という設定項目があるので、Send secrets to workflows from fork pull requests. にチェックを入れます。これでフォークしたリポジトリからのプルリクでも upstream リポジトリのシークレットを読み取ることができるようになります。

Dependabot 設定

Dependabot のプルリクだと上記の設定だけではシークレットが読み取れません。GitHub Actions のトリガーを pull_request から pull_request_trigger にするという解説もありますが、今はその必要ないです。

実はリポジトリの設定に Dependabot 専用のシークレットを設定する箇所があります。

2-min.jpg

以上でシークレットを読み取って Rails を GitHub Actions で動かすことができるようになります。