レビュー修正を Devin に丸投げできる仕組みを作ったら最高だった件【Claude Code より楽】

に公開

こんにちは。
株式会社キカガクの @tetsuro_b です。

PR のレビューに対する修正が自動化された未来...最高じゃないですか?
レビュー修正は Devin にやってもらってコーヒーでも飲みましょう ☕️

今回はそんな GitHub Actions を作ってみたので紹介します。

レビュー修正のここがつらい...

本題に入る前に個人的にレビュー修正のここがつらい...をいくつかあげておきます。

  • レビュー修正時次の実装をしていたりするのでブランチを切り替えたくない
  • Suggestion で提案された内容だけでは不十分なときも多い
  • 修正内容によってはレビュワーがやったほうが早いが、ほかの人の PR にコミットはしづらい
  • 再レビュー時、修正が複数コミットに分かれているとどんな修正がされたのか分かりにくい
  • Devin 以外の PR で Devin を呼び出そうとすると Slack や Devin のコンソールを経由する必要があったりで面倒

今回の Actions では上記のようなレビュー修正における従来の課題を全て解決しています!!

レビュー修正を Devin に丸投げする GitHub Actions

仕組みとしては超シンプルで GitHub Actions で Devin API を呼び出しているだけです。

GitHub Actions のソースコード(クリックして開く)

以下の GitHub Actions のソースコードはほぼ Devin が作ってくれたものなのでリファクタしたほうが良い箇所などもあるかもしれません。
ご自身のリポジトリなどに導入する際は、念のためコードをご確認いただき導入することをおすすめします。

name: '[PR] Devin Fix'

on:
  pull_request:
    types: [labeled]

env:
  label_name: devin-fix

permissions:
  pull-requests: write
  issues: write

jobs:
  request_devin_fix:
    runs-on: ubuntu-latest
    steps:
      - name: Request Devin Fix for PR Comments
        if: ${{ github.event.label.name == env.label_name }}
        env:
          DEVIN_API_KEY: ${{ secrets.DEVIN_API_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_URL: ${{ github.event.pull_request.html_url }}
          PR_NUMBER: ${{ github.event.pull_request.number }}
          REPO_OWNER: ${{ github.repository_owner }}
          REPO_NAME: ${{ github.event.repository.name }}
        run: |
          echo "Getting PR comments..."
          COMMENTS_JSON=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \
            -H "Accept: application/vnd.github+json" \
            -H "X-GitHub-Api-Version: 2022-11-28" \
            "https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/pulls/$PR_NUMBER/comments")

          ROCKET_COMMENT_URLS=""

          for comment_id in $(echo "$COMMENTS_JSON" | jq -r '.[].id'); do
            echo "Checking reactions for comment $comment_id..."

            REACTIONS_JSON=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \
              -H "Accept: application/vnd.github+json" \
              -H "X-GitHub-Api-Version: 2022-11-28" \
              "https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/pulls/comments/$comment_id/reactions")

            # ロケットアイコンにしたのはチーム内での利用率が低そうな絵文字だったため
            ROCKET_COUNT=$(echo "$REACTIONS_JSON" | jq '[.[] | select(.content == "rocket")] | length')

            if [ "$ROCKET_COUNT" -gt 0 ]; then
              COMMENT_URL=$(echo "$COMMENTS_JSON" | jq -r ".[] | select(.id == $comment_id) | .html_url")
              if [ -n "$ROCKET_COMMENT_URLS" ]; then
                ROCKET_COMMENT_URLS="$ROCKET_COMMENT_URLS, $COMMENT_URL"
              else
                ROCKET_COMMENT_URLS="$COMMENT_URL"
              fi
              echo "Found rocket reaction on comment: $COMMENT_URL"
            fi
          done

          if [ -z "$ROCKET_COMMENT_URLS" ]; then
            echo "No comments with rocket reactions found. Skipping Devin API call."
            exit 0
          fi

          echo "Rocket comment URLs: $ROCKET_COMMENT_URLS"

          PROMPT="${PR_URL} の PR に対して以下のコメントに対する修正を行ってください。[$ROCKET_COMMENT_URLS]。修正を行う際は子 PR として新しい PR を作成するようにしてください。PR 作成前には全てのコメントに対して修正が完了したか確認すること。PR 作成後は ${PR_URL} の PR に対して新規に作成した PR の URL をコメントで投稿すること。"

          JSON_PAYLOAD=$(cat <<EOF
          {
            "prompt": "$PROMPT"
          }
          EOF
          )

          echo "Sending request to Devin API..."
          curl -X POST "https://api.devin.ai/v1/sessions" \
               -H "Authorization: Bearer $DEVIN_API_KEY" \
               -H "Content-Type: application/json" \
               -d "$JSON_PAYLOAD"

GitHub Actions からプロンプト部分だけ抜き出すと以下のとおりです。

${PR URL} の PR に対して以下のコメントに対する修正を行ってください。
[{comment_url}, {comment_url}, {comment_url}...]
修正を行う際は子 PR として新しい PR を作成するようにしてください。
PR 作成前には全てのコメントに対して修正が完了したか確認すること。
PR 作成後は ${PR URL} の PR に対して新規に作成した PR の URL をコメントで投稿すること。

この Actions の推しポイント

Devin へレビュー修正を投げるのが本当に楽

以前からレビュー修正を Devin に依頼はしていましたが、以下のような手順を取っており少し面倒に感じていました。

  1. レビュー修正したいコメントの URL をコピー
  2. Slack で上記の URL を @Devin で依頼
  3. プロンプトも必要(以下の URL のレビュー修正をしてくださいなど)

それがこの Actions を利用した方式だと以下のようにPR 上だけでレビュー依頼が完結します。

  1. 修正したいコメントにPR 上で 🚀スタンプ をつける
  2. PR 上で「devin fix」ラベルをつける

ローカルでわざわざエディタを開く必要もないので本当に楽です。

レビュワーも気楽に使える

レビューコメントを残したものの、PR 作成者が忙しそうだったりお休みだったり...でレビュー修正にすぐに取り掛かってもらえなさそうな時ってありますよね。

今回作成した GitHub Actions の場合、上記のように簡単にレビュー修正を Devin に依頼できるのはもちろんのこと、子 PR として Devin が作ってくれるので元の PR を一切変更することなくレビュー修正が可能です。

※ 子 PR として作成されるのでレビュー修正による差分も見やすい
※ 不要な修正であればそのまま 子 PR を close すればいいのも良い

そのためレビュワーもサクッとレビュー修正の作業ができるので PR マージまでの時短にも活用できます。

変更が広範囲にわたる場合でも Devin がよしなにやってくれる

「Suggestion してくれてるけどそこ変えたら、別のとこも変更必要なんだよなぁ...。ローカルで作業するか。」

ってことたまにありませんか?例えば...↓

  • 変数の定義の部分で変数名の変更提案の Suggestion もらったけど、その後のコードは Suggestion ないのでその部分は手作業で修正が必要
  • 関数名変更による import の変更や、テストファイルなどでの呼び出し名の変更

こういった修正でも Devin に修正作業を依頼すれば漏れなく対応をしてくれます。

で、レビュー修正は何 ACU 使うの?

レビュー修正のコメント数や修正範囲に影響される前提はありつつも、1ACU 未満 〜 2ACU 前後など比較的少なめな ACU であることが多いです。

これは 0 → 1 の実装とは違い、実装箇所や変更内容が明確であるため Devin にとっても簡単なタスクであるケースが多いためだと思っています。

まとめ

Devin は Slack からサクッと指示を出せるのも魅力的ですが Devin API を活用することで、簡単に GitHub Actions などのワークフローに取り込むことができます。
今後もさまざまな場所で Devin にはがんばってもらえるように環境整備していこうと思います。

最後に(宣伝)

わたしの X(Twitter) では AI 活用に関する情報を日々情報発信しております!
フォローいただけたらうれしいです!

→ 株式会社キカガクの採用情報は こちらから

株式会社キカガク

Discussion