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