ENECHANGE Developer Blog

ENECHANGE開発者ブログ

DevinのPRを誰が作ったか分からない問題を、GitHub Actionsで解決してみた

こんにちは。ENECHANGEの石橋です。

最近、AI開発エージェントのDevinを活用してコード生成を行う機会が増えています。
しかし、Devinが作成したPull Requestは全て devin-ai-integration[bot] アカウントで作成されるため、実際に誰がDevinに指示を出したのかが分からないという課題に直面しました。

特に、Findy Team+のような開発者生産性測定ツールを使用している場合、誰がどれだけDevinを活用しているかを正確に計測できないのは大きな問題です。

本記事では、GitHub Actionsを活用してDevinが作成したPRに依頼者の情報を自動で付与する仕組みを紹介します。

課題:DevinのPRが全て同じアカウントになってしまう

現状の問題

Devinを使用してPRを作成すると、以下のような状況が発生します:

  • 全てのPRの作成者が devin-ai-integration[bot] になる
  • 実際にDevinに指示を出した開発者が不明
  • コードレビューでどの開発者に確認すべきかが分からない
  • Findy Team+で個人の生産性が正確に計測できない

Findy Team+での課題

Findy Team+では、GitHubのPR作成者を基準に開発者の生産性を測定します。
しかし、Devinが作成したPRは全て devin-ai-integration[bot] として記録されるため:

  • 個人のコントリビューション数に反映されない
  • チーム内でのDevin活用度が見えない
  • AI活用による生産性向上が数値化できない

解決したいこと

  • 誰がDevinを利用したかを明確にする
  • PRに依頼者の情報を自動で付与する
  • Findy Team+で正確な生産性測定を可能にする

解決方法:ブランチ名とGitHub Actionsを活用した自動ラベリング

アプローチの概要

  1. ブランチ命名規則の策定: 依頼者情報をブランチ名に含める
  2. GitHub Actionの作成: PRが作成された際にブランチ名から依頼者を抽出
  3. 自動ラベル付与: 抽出した依頼者名をPRのラベルとして付与

実装手順

1. DevinのKnowledge機能で命名規則を学習させる

ここがこの解決方法の工夫ポイントです!

Devinは内部的に利用者のメールアドレス情報を持っています。この情報を活用して、ブランチ名に依頼者を識別できる情報を自動で組み込むことができます。

Devin Setting > Devin's Resources > Knowledge で新しいKnowledgeを作成:

設定項目 内容
Title 作業ブランチの命名戦略
Enabled for you True
Content ブランチを発行する場合、prefixを以下のようにつけてください。

devin/#{local-part_of_email}/#{timestamp}-#{description}

例)指示者のメールアドレスがjohn.doe@company.comの場合:
devin/john.doe/1747904069-add-instructor-label-action
Pin to Repository All Repositories
Macro working-branch-naming
Is procedural False

工夫ポイント

  • #{local-part_of_email} でメールアドレスの@より前の部分を自動取得
  • #{timestamp} で作業開始時刻を自動挿入
  • #{description} で作業内容を自動生成

この設定により、Devinは自動的に依頼者を識別できるブランチ名を作成するようになります。

2. GitHub Actionの実装

続いて、Devinが作成したPRに対して、GitHub Actionsでラベルを自動付与するように設定します。

.github/workflows/add-instructor-label.yml を作成し、以下の内容を設定します:

name: Add Instructor Label to Devin PRs

on:
  pull_request:
    types: [opened, edited]

jobs:
  add-instructor-label:
    runs-on: ubuntu-latest
    # DevinのPRに対してのみ実行
    if: ${{ github.event.pull_request.user.login == 'devin-ai-integration[bot]' }}
    permissions:
      contents: read
      pull-requests: write
      issues: write
    steps:
      - name: Add Instructor Label
        uses: actions/github-script@v7
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const prNumber = context.issue.number;
            const repo = context.repo;
            
            // PRの詳細情報を取得
            const { data: pullRequest } = await github.rest.pulls.get({
              owner: repo.owner,
              repo: repo.repo,
              pull_number: prNumber
            });
            
            let instructorUsername = null;
            
            // ブランチ名から指示者のユーザー名を抽出
            const branchName = pullRequest.head.ref;
            console.log(`Branch name: ${branchName}`);
            
            if (branchName.startsWith('devin/')) {
              // パターン: devin/username/timestamp-description
              const usernamePattern = /^devin\/([^\/]+)\//;
              const match = branchName.match(usernamePattern);
              
              if (match && match[1]) {
                instructorUsername = match[1];
                console.log(`Found instructor username from branch: ${instructorUsername}`);
              }
            }
            
            // 指示者のユーザー名が見つかった場合、ラベルを追加
            if (instructorUsername) {
              console.log(`Using instructor username: ${instructorUsername}`);
              
              try {
                // ラベルを追加
                await github.rest.issues.addLabels({
                  owner: repo.owner,
                  repo: repo.repo,
                  issue_number: prNumber,
                  labels: [instructorUsername]
                });
                console.log(`Successfully added label: ${instructorUsername}`);
              } catch (error) {
                console.error(`Error adding label: ${error}`);
                
                // ラベルが存在しない場合は作成してから追加
                if (error.status === 422) {
                  try {
                    // ラベルを作成
                    await github.rest.issues.createLabel({
                      owner: repo.owner,
                      repo: repo.repo,
                      name: instructorUsername,
                      color: '0366d6' // GitHubのデフォルトブルー
                    });
                    console.log(`Created new label: ${instructorUsername}`);
                    
                    // 作成したラベルを追加
                    await github.rest.issues.addLabels({
                      owner: repo.owner,
                      repo: repo.repo,
                      issue_number: prNumber,
                      labels: [instructorUsername]
                    });
                    console.log(`Successfully added new label: ${instructorUsername}`);
                  } catch (createError) {
                    console.error(`Error creating label: ${createError}`);
                  }
                }
              }
            } else {
              console.log('Could not find instructor username from branch name');
            }

動作検証

準備が完了したら

  1. DevinのKnowledge設定
  2. GitHub Actionの設定

両方の準備が完了したら、実際に一連の動作を検証してみましょう。

検証手順

Step 1: Devinに作業を依頼

「ユーザー認証機能を追加してください」

Step 2: ブランチ名の確認

Devinが設定したKnowledgeに基づいて、以下のようなブランチ名で自動的に作業を開始することを確認:

devin/john.doe/1747904069-add-user-authentication

Step 3: PR作成後の確認

Devinが作業を完了してPRを作成したら、以下を確認:

  1. PR作成者: devin-ai-integration[bot] になっている
  2. GitHub Action実行: Add Instructor Label to Devin PRs が自動実行される
  3. ラベル付与: john.doe ラベルが自動で付与される

Step 4: Findy Team+での確認

  • PRに付与されたラベルにより、誰がDevinを活用したかが明確になる
  • 個人の生産性測定により正確に反映される

重要なポイント

  • メールアドレスの活用: Devinが保持するメールアドレス情報から自動で依頼者を識別
  • 完全自動化: 手動でブランチ名を指定する必要は一切なし

実装結果

動作例

  1. 開発者がDevinに「ユーザー認証機能を追加して」と指示
  2. Devinが devin/john.doe/1747904069-add-user-auth ブランチを作成
  3. PRが作成されると、GitHub Actionが自動で実行
  4. ブランチ名から john.doe を抽出
  5. PRに john.doe のラベルが自動付与

効果

  • 追跡性の向上: 誰がDevinを利用したかが一目で分かる
  • レビュー効率の向上: 適切なレビュアーをアサインしやすくなる
  • Findy Team+での正確な測定: 個人のDevin活用による生産性が数値化される

まとめ

GitHub Actionsとブランチ命名規則を組み合わせることで、Devinが作成したPRの追跡性を大幅に向上させることができました。

特にFindy Team+を活用している開発チームにとっては、以下のメリットがあります:

  • 個人のDevin活用度が可視化される
  • AI活用による生産性向上が数値で把握できる
  • チーム全体のDevin活用状況が分析可能

この仕組みは以下のような場面で特に有効です:

  • Devinを導入している、または導入を検討している開発チーム
  • Findy Team+で開発生産性を測定している組織
  • AI活用の効果を定量的に評価したい企業

実装も比較的簡単で、既存の開発フローに大きな変更を加えることなく導入できます。

DevinとFindy Team+を活用している開発チームは、ぜひ試してみてください。


この記事がお役に立てば幸いです。ご質問やご意見がございましたら、お気軽にコメントください。