この手の記事が世界の至る所で書かれている気がしますが、シークレットキーを渡す方法を含めて最新の 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 設定
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 専用のシークレットを設定する箇所があります。
以上でシークレットを読み取って Rails を GitHub Actions で動かすことができるようになります。