🪕

Claude Code Actions で完全自動開発リポジトリをつくる

に公開

Claude Code Actions を組み合わせて、Issue の作成から実装、PR作成、CI修正、レビュー、レビュー修正、マージまでを完全に自動化したワークフローをつくってみました。人間の介入なしに、放置スタイルな開発サイクルが回り続けます。何ができるのかは、謎です。

実装例:(ワークフローが動かせてしまうので issue 発行は自分のみに制限しています)
https://github.com/azumag/cca-auto-workflows

システム概要

ワークフロー図

完全自動化のポイント

Persional Access Token によるワークフロー実行

GitHub Actions には重要な制限があります。それは GitHub Actions や bot によるアクションではワークフローがトリガーされない ことです。

この制限自体は、Github Actions が意図しない無限ループを引き起こさないための仕様ですが、完全自動化のためにはこの制限を回避する必要があります。

これを解決するために、Persional Access Token (PAT) を利用してワークフローを実行することで、label, comment などのアクションで次のワークフローを実行することができます。

PRの自己マージ制限とその回避

通常の GitHub Token を使用したPRは、同じワークフロー内でマージできません。
また PAT を使っての PR はそのユーザーの発行した PR という扱いになるため、これも自己承認ができず、自動マージできません。
PR の作成のためには GitHub App を作成し、そのトークンをPR作成ワークフローに使用することでこの制限を回避できます。はい、めちゃめんどいです。

ラベルベースの状態管理

各Issue/PRの状態を管理します。またいくつかのタスクの起動条件になります。

Issue用ラベル

  • processing: 処理中, Claude に処理を頼み、待ちの状態
  • pr-ready: PR作成準備完了
  • pr-created: PR作成済み

PR用ラベル

  • ci-passed: CI成功, これをトリガーにレビューを動かす
  • ci-failure: CI失敗, これをトリガーにCI修正を動かす
  • reviewed: レビュー完了, これをトリガーにレビューに基づく修正を動かす
  • review-fixed: レビュー修正完了(マージ準備完了)、レビューに基づく修正がコミットされ、CIも再び通り、再度レビューを通り、レビュー修正タスクにて「これ以上の修正なし」と判断された状態。これをトリガーに自動マージを動かす

苦労ポイント

権限

ワークフローのファイル, claude, github app, PAT それぞれで権限管理が分かりづらいです。
具体的には actions: read, content, pull-request, issue: write に設定し、ワークフローファイル側でも合わせる必要があり、抜けていると、claudeが「私にはそれをする権限がない」と言い出し、ループが止まってしまうので、要注意です。

PR自動作成

issue の解決を @claude に頼んだ後、処理が完了したタイミングで自動でPRを作って欲しいものですが、PR作成リンクが提供されるのみで、自動で作ってくれません。
そのため、claude の処理が終わった後のステップで、最新のコメントから PR リンクを拾い、そこから PR を作成する API リクエストを実行しています。具体的にはこれ:
https://github.com/azumag/cca-auto-workflows/blob/main/.github/workflows/issue-processor.yml

CIの自動修正、自動レビューループ

CIについてはこちらで先行していましたが、さらにCIのパスを条件に自動レビューを起動します。PRのオープンのイベントはBOT起動なので、これでワークフローがトリガーできないため、CIでの判定による PAT のラベル付けをトリガーとします。また、レビュー→修正で生じたコミットでCIが失敗することもあるため、コミットが発生したらラベルを制御して最初のCI判定の状態にもどし、ループさせます。

PR自動マージの条件設定

レビュー修正が本当に終わっているかどうかの条件で自動マージを動かしたいです。claude はレビューに基づいて修正しました!と宣った上、全然修正できてないことがよくあります。そのため、レビュー修正タスクの終了をもってマージ条件としてしまうのは危険です。

そこで、修正ループのなかで、「レビューを受けて修正が必要ないと判断したら review-fixed というラベルをつけるよう」に claude 自身に指示します。claude が PR のラベルを更新できるように、pull-request: write 権限を実行トークン自体にもつける必要があります。

終了ステップにおいて、review-fixed がついているか否かを判定して、なければ次にレビューを受ける必要がある/CIを通す必要があるのでマージ処理には進まず、あれば自動マージに進めるという形です。

おわりに

もうすこし洗練できる気はしますが、さまざまな制限があるためにわりと絶妙なバランスで動いており、なかなか整理に労力がかかります。もしこれでもいけるよというアイディアがあればぜひ試してみてください。

Discussion