APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Copilot coding agentのPR descriptionは変えられないのか? — GitHub Actionsで変えた

こんにちは。ACS事業部の越川です。

GitHub Copilot coding agentが自動生成するPRの本文(description)、チームのフォーマットに合わせたいと思ったことはありませんか?

先日、この課題を5パターンで検証した記事が公開されました。

zenn.dev

結論は「copilot-instructions.mdもPRテンプレートも効かない」。PR本文の生成はインストラクションとは別の独立したフェーズで実行されているため、現時点では公式の方法ではカスタマイズできません。

本記事では、この「できなかった」に対して、GitHub Actionsによる後処理で書き換える方法を7回の試行錯誤を経て実現したので、その過程と最終的な構成を紹介します。

アプローチ: Copilotの後にActionsで書き換える

発想はシンプルです。Copilot coding agentがPRを作成した後に、GitHub Actionsで本文を上書きします。

Copilot coding agent が PR を作成
  → GitHub Actions 発火
  → 差分と Issue 情報を取得
  → チームフォーマットに沿った本文を生成
  → gh pr edit で上書き

しかし、このシンプルな発想を実現するまでに7回の試行錯誤が必要でした。

ハマり1: Copilot coding agentのbot名が文脈で異なる

最初に躓いたのは、「CopilotのPRだけを対象にする」条件式です。

GitHub Actionsではgithub.actor(誰がトリガーしたか)で条件分岐するのが一般的です。しかし、Copilot coding agentの名前は文脈によって異なります。

場面 名前
GitHub Actionsのgithub.actor Copilot
GitHub APIのuser.login Copilot
gh pr viewauthor.login app/copilot-swe-agent
IssueアサインAPIの指定名 copilot-swe-agent[bot]

copilot[bot]でもcopilot-swe-agent[bot]でもなく、Copilot。これを突き止めるまでに3回の試行が必要でした。

ハマり2: CopilotがPR本文を後から上書きする

bot名の問題を解決し、テンプレートベースでのPR本文書き換えに成功しました。Actionsのログにも「PR本文を更新しました」と表示されています。

しかしPRを確認すると、Copilotのデフォルト本文に戻っている

原因は、Copilot coding agentのワークフローにあります。

  1. CopilotはまずDRAFT(WIP)のPRを作成する
  2. この時点でopenedイベントが発火し、Actionsが本文を書き換える
  3. しかしCopilotはまだ作業中。コードを生成し終えた後、PR本文を自分で上書きする

つまり、openedのタイミングでは早すぎるのです。

ハマり3: DRAFTを外す人によってactorが変わる

解決策として、Copilotの作業完了後にDRAFTが外れるready_for_reviewイベントをトリガーに追加しました。しかし、DRAFTを外すのは人間です。するとgithub.actorはDRAFTを外した人(例: apc-m-koshikawa)になり、Copilotとの条件が一致しません。

ここで発想を切り替えました。「誰がトリガーしたか」ではなく「PRを作ったのは誰か」で判定する

if: github.event.pull_request.user.login == 'Copilot'

github.event.pull_request.user.loginはPR作成者を指すので、誰がDRAFTを外しても常にCopilotと一致します。

成功した最終構成

7回目の試行で、以下の構成に到達しました。

name: Rewrite Copilot PR Description

on:
  pull_request:
    types: [opened, ready_for_review]

jobs:
  rewrite-description:
    if: github.event.pull_request.user.login == 'Copilot'
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
      contents: read
      issues: read
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Get PR info
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_NUMBER: ${{ github.event.pull_request.number }}
        run: |
          gh pr diff "$PR_NUMBER" > /tmp/pr_diff.txt
          gh pr view "$PR_NUMBER" --json title,body,headRefName > /tmp/pr_meta.json

      - name: Generate new PR description
        run: |
          PR_TITLE=$(jq -r '.title' /tmp/pr_meta.json)
          DIFF_STAT=$(wc -l < /tmp/pr_diff.txt)
          FILES_CHANGED=$(grep '^diff --git' /tmp/pr_diff.txt \
            | sed 's/diff --git a\///' | sed 's/ b\/.*//' | sort -u)

          cat > /tmp/new_description.md <<EOF
          ## 概要
          ${PR_TITLE}

          ## 変更内容
          ### 変更ファイル
          $(echo "$FILES_CHANGED" | while read f; do echo "- \`$f\`"; done)

          ### 差分統計
          - 変更行数: ${DIFF_STAT} 行

          ## テスト
          - [ ] 動作確認済み
          - [ ] 既存のテストが通ること
          EOF
          sed -i 's/^          //' /tmp/new_description.md

      - name: Update PR body
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_NUMBER: ${{ github.event.pull_request.number }}
        run: |
          gh pr edit "$PR_NUMBER" --body-file /tmp/new_description.md

運用フローは以下の通りです。

  1. Issueを作成し、Copilot coding agentをアサイン
  2. CopilotがDRAFT PRを作成し、コードを生成
  3. Copilotの作業完了を確認し、gh pr readyでDRAFTを外す
  4. ready_for_reviewでActionsが発火し、PR本文がチームフォーマットに書き換わる

おまけ: CLIからCopilotを自動アサインする方法

検証の過程で、CLIからCopilot coding agentをIssueにアサインする方法も判明しました。

gh api repos/OWNER/REPO/issues/ISSUE_NUMBER/assignees \
  --method POST \
  -f "assignees[]=copilot-swe-agent[bot]"

Web UIを開かなくても、ターミナルからIssue作成→Copilotアサインまで一気に実行できます。

まとめ

Copilot coding agentのPR本文は、公式にはカスタマイズできません。しかし、GitHub Actionsで後処理として書き換えることで対応できます。

実装にあたって押さえるべきポイントは3つです。

  1. bot名はCopilotcopilot[bot]でもcopilot-swe-agent[bot]でもない
  2. タイミングはready_for_reviewopenedではCopilotに上書きされる
  3. 条件はuser.loginで判定actorはトリガーした人になるので使えない

今回はテンプレートベースでの書き換えでしたが、LLM APIを組み合わせれば、差分の要約や変更理由の自動生成も可能です。

元記事の「できなかった」を「こうすればできる」に変えるまでに7回の試行錯誤がありました。この過程自体が、AI駆動開発における「動かしてみないとわからない」を体現していると感じています。

参考文献

  • kumewata. "Copilot coding agent の PR description はカスタマイズできるのか?検証した" — Zenn
  • GitHub Docs. "GitHub Copilot coding agent" — docs.github.com

お知らせ

私の所属する ACS 事業部では、開発者ポータル Backstage、Azure AI Service などを活用し、Platform Engineering + AI の推進・内製化を支援しています。

www.ap-com.co.jp www.ap-com.co.jp www.ap-com.co.jp

また、GitHub パートナーとしてお客様に GitHub ソリューションの導入支援を行っています。 GitHub Copilot などのトレーニングなども行っておりますので、ご興味を持っていただけましたらぜひお声がけいただけますと幸いです。

一緒に働いていただける仲間も募集中です! ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp www.ap-com.co.jp

本記事の投稿者: 越川将人