🐧

GitHub Actions で Verified Commit でコードを自動修正

2025/02/15に公開

コードを Verified Commit で自動修正する action を紹介します。

https://github.com/suzuki-shunsuke/commit-action

Pull Request の CI でコードを自動でフォーマットしたりコードからドキュメントを自動生成したり出来ると便利です。
また、 Pull Request をマージしたあとに base branch 上で自動修正したい場合もあるでしょう。
こういった場合、コードを修正したあとに commit を生成して push する必要があります。
この commit の生成と push を簡単に出来る action を作成しました。
似たような action は他にもありますが、 Git を使わずに GitHub API で commit を生成して push するのが特徴です。
このため、 GitHub Actions token ${{github.token}} や GitHub App の Installation access token を使うと verified commit が生成できます。
似たような action でも Git を使ってる action の場合 GPG Key や SSH Key を使わないと verified commit は生成できません。
自動化のために GPG Key や SSH Key を管理するのは面倒なので、これらを必要としないのは非常に便利です。

verified commit は誰が commit を生成したのか証明する非常に重要なものです。

https://docs.github.com/ja/authentication/managing-commit-signature-verification

自分の多くの OSS では Branch Rulesets で verified commit を必須にしています。
これにより自分の OSS の信頼性が一定程度担保されています。
業務であっても verified commit は必須にすべきだと思いますが、 CI で Git を使って commit を生成していてそれが verified commit じゃないから必須にできないといったケースも見かけます。
それも今回紹介する action に置き換えれば解決します。

使い方

使い方は非常に簡単で執筆時点で全ての input は option です。
workflow 中でコードを修正したあとにこの action を実行すると commit が生成・push されます。
push されるとこの action は失敗します。
push する変更がない場合、この action は何もせずに正常終了します。

name: Example
on:
  pull_request: {}
jobs:
  example:
    runs-on: ubuntu-24.04
    steps:
      - name: Checkout
        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
        with:
          persist-credentials: false

      # Change files
      # ...

      - name: Push changes to the remote branch
        uses: suzuki-shunsuke/commit-action@v0.0.4

default の push 先は $GITHUB_REPOSITORY${GITHUB_HEAD_REF:-${GITHUB_REF_NAME}} ですが、変更できます。
default では ${{github.token}} を使いますが、 ${{github.token}} は新しい workflow run をトリガーしないのでおすすめしません。
代わりに GitHub App の installation access token をおすすめします。
自分で installation access token を生成して github_token input として渡しても良いですが、 GitHub App の Application ID と Private Key を渡すとよりコードがシンプルになります。

- uses: suzuki-shunsuke/commit-action@v0.0.4
  with:
    app_id: ${{secrets.APP_ID}}
    app_private_key: ${{secrets.APP_PRIVATE_KEY}}

こうすると内部で installation access token を生成しますが、その際に repositories と permissions を最小限にします。

デフォルトでは作成・変更・削除された全てのファイルがコミットされますが、これも変更できます。
変更する場合は対象ファイルのリストを改行区切りで渡してください。
glob や正規表現などは現状サポートされていません。

- uses: suzuki-shunsuke/commit-action@v0.0.4
  with:
    files: |
      README.md
      package-lock.json

commit message も変更可能です。

Discussion