背景
GitHub 公式が公開した actions/ai-inference アクションで、ワークフロー内での AI モデルの利用が簡単になった。PR の変更内容を要約するワークフローを実装してみる。
実装方法
ラベル付与をトリガとして、PR差分を取得し、AIモデルで要約を生成、結果をPRコメントとして投稿する一連の処理を自動化する。
トリガ設定
PR へのラベル付与 (pull_request イベントの labeled タイプ) をトリガとする。
トリガを labeled イベントに限定することで、不要な AI 実行とトークン消費を抑制する。開発者が必要と判断したタイミングで ai-summary ラベルを付与する運用が効果的だ。
ジョブ定義
summary ジョブは、ai-summary ラベルが付与された場合のみ実行される (if: github.event.label.name == 'ai-summary')。 実行に必要な権限(permissions)を以下に設定する。
pull-requests: write- PRへのコメント書き込みmodels: read- AIモデルへのアクセスcontents: read- リポジトリの読み取り
ステップ構成
リポジトリのチェックアウト
actions/checkout@v4でリポジトリをチェックアウト。fetch-depth: 0を指定して全履歴を取得し、後続のgit diffコマンドが正確な差分を計算できるようにする。PR差分の取得
git diff --name-statusコマンドを実行し、PR のベースブランチとヘッドコミットの間の差分情報を取得する。--name-statusオプションにより、具体的にどのファイルが追加(A)、変更(M)、削除(D)されたかという情報のみを取得する。取得した差分情報は、ステップ出力
filesに設定し、後続の AI 推論ステップのプロンプトに渡す。出力例:A .github/workflows/ci-build.yml D docs/old-feature-guide.md D src/legacy/utils.js M package-lock.json M package.json M src/components/UserProfile.jsx M src/styles/variables.cssAI推論の実行
actions/ai-inference@v1アクションを使用して AI が推論し、PR の要約を生成する。サンプルコードでは生成される応答の最大トークン数を
max-tokens: 500で指定している。この値は、プロンプト内で指示した目安(300トークン)に対して十分な余裕を持たせている。
ワークフロー定義
上記の処理を実装したGitHub Actionsのワークフロー定義:
# .github/workflows/ai-summary.yml
name: Summarize PR
on:
pull_request:
types: [labeled] # 'labeled' イベントをトリガーとする
jobs:
summary:
# 'ai-summary' ラベルが付与された場合のみ実行
if: github.event.label.name == 'ai-summary'
runs-on: ubuntu-latest
# 必要な権限を設定
permissions:
pull-requests: write # PR へのコメント書き込み
models: read # AI モデルへのアクセス
contents: read # リポジトリコンテンツの読み取り
steps:
# リポジトリのコードをチェックアウト
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # 全履歴を取得して diff を正確に計算
# PR の差分を取得
- name: Fetch PR diff
id: fetch_diff
run: |
# ベースブランチとヘッドコミットの参照を取得
BASE_REF="origin/${{ github.event.pull_request.base.ref }}"
HEAD_SHA="${{ github.event.pull_request.head.sha }}"
echo "Base ref: ${BASE_REF}"
echo "Head SHA: ${HEAD_SHA}"
# ベースブランチとヘッドブランチの情報をフェッチ
git fetch origin ${{ github.event.pull_request.base.ref }}
git fetch origin ${{ github.event.pull_request.head.ref }}
# git diff コマンドで変更ファイルリストとステータスを取得
echo "Running git diff --name-status..."
CHANGED_FILES=$(git diff --name-status ${BASE_REF}...${HEAD_SHA})
if [ $? -ne 0 ]; then
echo "Error: git diff command failed."
exit 1
fi
echo "${CHANGED_FILES}"
# 取得した差分情報をステップ出力 'files' として設定
echo "Setting files output..."
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
echo "files<<$EOF" >> $GITHUB_OUTPUT
echo "${CHANGED_FILES}" >> $GITHUB_OUTPUT
echo "$EOF" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # GitHub API アクセス用トークン
# AI 推論を実行
- name: Run AI inference
id: inference
uses: actions/ai-inference@v1
with:
max-tokens: 500 # 生成する最大トークン数
prompt: |
PRの差分を分析し、**必ず下記の指定フォーマットに従い概要を日本語で生成してください。**
**全体で300トークンを目安に、各項目は最も重要な点に絞って簡潔に記述してください。**
```フォーマット
## PRレビュー概要
### 主な目的
{diffから推測される、この変更の**最も重要な目的やゴール**を1〜2文で記述}
### 範囲
{変更が加えられた**主要なファイル種別や機能領域**を簡潔に列挙}
### 影響範囲
{この変更によって特に注意すべき**影響(システム動作、UX、他機能等)**を1〜2点で記述}
```
```分析対象のPR Diff
${{ steps.fetch_diff.outputs.files }} # 前のステップで取得した差分情報を埋め込む
```
# PR にコメントを投稿
- name: Comment
uses: marocchino/sticky-pull-request-comment@v2
with:
header: ai-summary-comment # コメントを識別するためのヘッダー
message: ${{ steps.inference.outputs.response }} # AI が生成した要約
