Gemfile並行運用時のTips
複数のGemfileを並行運用する際に便利な情報を幾つか挙げておく。
更新漏れの検知
複数のGemfileを並行運用していると「Gemfile.lockを変更したがもう1つのlockファイルの更新を忘れてしまった」という事態が起き得る。これを避けるために、差分検知を行うworkflowを設けておくと有用である。
以下はr7kamura/gemfile-diffというactionで実現する例:
name: gemfile-diff
on:
pull_request:
paths:
- Gemfile.lock
- Gemfile_rails_8_0.rb.lock
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: r7kamura/gemfile-diff@v0
with:
gemfile_lock_a: Gemfile.lock
gemfile_lock_b: Gemfile_rails_8_0.rb.lock
ignore:
actioncable
actionmailbox
actionmailer
actionpack
actiontext
actionview
activejob
activemodel
activerecord
activestorage
activesupport
rails
railties
Dependabot対策
DependabotはGemfile.lockしか更新してくれないので、並行運用時にDependabotを稼働させるには何らかの対策が必要になる。
dependabot/fetch-metadataというactionを使うと、dependabotが変更対象としているGemの名前を取得できる。 これを利用すると、dependabotからのPull Requestの場合に他のlockファイルも自動で更新させるという処理を実現できる。
一例としては、以下のようなWorkflowを用意すると良い。
name: gemfile-lock-update-for-dependabot
on:
pull_request:
paths:
- Gemfile.lock
jobs:
gemfile-lock-update-for-dependabot:
permissions:
pull-requests: read
runs-on: ubuntu-latest
if: github.actor == 'dependabot[bot]'
steps:
- uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ secrets.MY_GITHUB_APP_ID }}
private-key: ${{ secrets.MY_GITHUB_APP_PRIVATE_KEY }}
- uses: actions/checkout@v4
with:
token: ${{ steps.app-token.outputs.token }}
- uses: dependabot/fetch-metadata@v2
id: metadata
- uses: ruby/setup-ruby@v1
- run: bundle update "${{ steps.metadata.outputs.dependency-names }}"
env:
BUNDLE_FROZEN: "false"
BUNDLE_GEMFILE: Gemfile_rails_8_0.rb
- uses: stefanzweifel/git-auto-commit-action@v5
この例ではPersonal Access TokenではなくGitHub Appを利用してアクセストークンを発行しているが、どちらで実装しても構わない。 いずれの方法を取るにせよ、このアクセストークンには以下の権限が必要になる。
- contents: write
- workflows: write