継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Git サブモジュールの更新を定期的に Dependabot で検知、自動承認及び自動マージできるかを試したメモ✍

タダです.

Git サブモジュールを使っているリポジトリでサブモジュールの更新を自動で検知・自動でマージできるよう仕組み化したい要望があり,Dependabot で対応できないかと思って調査・検証したメモを書きます.

Dependabot のサポート範囲

Dependabot が監視する,新バージョンのパッケージマネージャは以下のドキュメントをまとめられています.Git サブモジュールも対象になっていたので,Dependabot での監視を仕組み化検証することにしました.

docs.github.com

dependabot.yml の定義

Git サブモジュールの更新を検知する Dependabot の定義として以下で設定しました.今回サブモジュールはプライベートリポジトリになっていて,ドキュメントこのissueを参考に設定しました.secrets.DEPENDABOT_PRIVATE_KEY を Fine-grained tokens(試しに Read access to metadata/Read and Write access to administration and code を付与)を発行して Dependabot Secrets に登録しました.

version: 2
registries:
  git-submodule-repo:
    type: git
    url: https://github.com
    username: x-access-token
    password: ${{ secrets.DEPENDABOT_PRIVATE_KEY }}
updates:
  - package-ecosystem: "gitsubmodule"
    directory: "/"
    schedule:
      interval: "daily"
      time: "10:00"
      timezone: "Asia/Tokyo"
    registries:
      - git-submodule-repo

この状態で test-submodule というサブモジュールの更新を検知して Pull Request を作成できました.

Pull Request を自動承認及び自動マージさせる

ついでにサブモジュールの Pull Request を自動承認とマージを GitHub Actions で行ってみました.以下はサンプルコードですが, dependabot/fetch-metadata を参考にしています.自動承認と自動マージのセクションで処理させるのはサブモジュールの時だけに限定するため dependabot/fetch-metadata の output を確認し, ${{ contains(steps.metadata.outputs.package-ecosystem, 'submodules') }} という条件にしました.

name: Dependabot auto-approve for submodule
on:
  pull_request:
    types: opened

jobs:
  submodule:
    runs-on: ubuntu-latest
    permissions:
       pull-requests: write
       contents: write
    if: github.event.pull_request.user.login == 'dependabot[bot]'
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@8ca800c1642f5e46fd4fe73c07af0e3baf1375d6
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      - name: Auto approve a PR & merge it
        if: ${{ contains(steps.metadata.outputs.package-ecosystem, 'submodules') }}
        run: |
          gh pr review --approve "$PR_URL"
          gh pr merge --auto --merge "$PR_URL"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}
          GH_TOKEN: ${{secrets.GITHUB_TOKEN}}

この Actions で実行すると以下のスクリーンショットのように自動承認と自動マージが実現できました.

まとめ

Git サブモジュールの更新を定期的に Dependabot で検知と自動承認及び自動マージができるかを試したのでまとめました.Dependabot が使用する PAT はもっと権限を絞るべきなので確認できたら記事の内容も後追いして更新します...