Timee Product Team Blog

タイミー開発者ブログ

dependabot PRのAI自動レビューをCI完了後に実施させる

こんにちは、タイミーでバックエンドのテックリードをしている新谷 (@euglena1215) です。

タイミーでは、 dependabot による依存ライブラリのアップデート PR に対して、Devin による自動レビューを導入しています。しかし、CI が失敗しているにもかかわらず、「本プロジェクトへの影響は低いと判断します」というコメントがついてしまうケースがありました。

これはレビュー時点では CI が完了しておらず、Devin がコードの差分だけを見てレビューしていたことが原因です。この問題を解決するために、CI 完了後にレビューを実施するよう、ワークフローを修正しました。

方法

従来の実装

従来は pull_request イベントの opened をトリガーにしていました。

on:
  pull_request:
    types:
      - opened

この場合、PR が作成された直後にレビューが開始されるため、CI の結果を考慮することができません。

改善後の実装

workflow_run イベントを使用して、CI ワークフローの完了をトリガーにするように変更しました。

on:
  workflow_run:
    workflows: ["ci branch"]
    types:
      - completed
    branches:
      - 'dependabot/**'

workflow_run イベントは別のワークフローの完了を待ってから実行されるため、CI の結果を含めたレビューが可能になります。

PR情報の取得

workflow_run イベントでは github.event.pull_request が使えないため、gh コマンドで PR 情報を取得する必要があります。

- name: Get PR info
  id: pr-info
  env:
    GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  run: |
    PR_INFO=$(gh pr list \\
      --repo my-org/my-repo \\
      --head "${{ github.event.workflow_run.head_branch }}" \\
      --state open \\
      --json number,title,url \\
      --jq '.[0]')

    if [ -z "$PR_INFO" ]; then
      echo "No open PR found for branch ${{ github.event.workflow_run.head_branch }}"
      echo "skip=true" >> "$GITHUB_OUTPUT"
      exit 0
    fi

    {
      echo "skip=false"
      echo "number=$(echo "$PR_INFO" | jq -r '.number')"
      echo "title=$(echo "$PR_INFO" | jq -r '.title')"
      echo "url=$(echo "$PR_INFO" | jq -r '.url')"
    } >> "$GITHUB_OUTPUT"

ポイントは github.event.workflow_run.head_branch でブランチ名を取得し、そこから gh pr list で該当する PR を検索している点です。

CI結果の取得

CI の結果は github.event.workflow_run.conclusion で取得できます。さらに、失敗したジョブの一覧も取得してレビューの参考情報として渡しています。

- name: Get CI check results
  id: ci-checks
  run: |
    CI_CONCLUSION="${{ github.event.workflow_run.conclusion }}"
    echo "conclusion=${CI_CONCLUSION}" >> "$GITHUB_OUTPUT"

    # 失敗したジョブ一覧を取得
    FAILED_JOBS=$(gh pr checks "$PR_NUMBER" \\
      --repo my-org/my-repo \\
      --json name,state \\
      --jq '[.[] | select(.state == "FAILURE")] | map(.name) | join(", ")' \\
      2>/dev/null || echo "取得失敗")

これにより、Devin へのプロンプトに CI 結果と失敗したジョブ名を含めることができます。

- CI結果: ${CI_CONCLUSION}
- 失敗したジョブ: ${FAILED_JOBS:-なし}

レビュー指示にも CI 結果を考慮するよう追記しました。

- CI結果を確認し、失敗している場合はCIのログを読み込んで原因を分析する
- CIが失敗している場合、ライブラリの更新が原因かどうかを判断する
- CIが失敗している場合は、失敗の原因とマージ前に対応が必要かどうかを明記する

まとめ

workflow_run イベントを使うことで、CI 完了後に別のワークフローを実行できるようになります。dependabot PR の自動レビューのように、CI の結果を考慮したい処理に便利です。

ただし、pull_request イベントとは異なり PR 情報を直接取得できないため、gh コマンドで別途取得する必要がある点には注意が必要です。

参考: