GitHub ActionsとDevinによる複数リポジトリの更新内容を週次でレポート生成

# はじめに

メグリのAndroidチームでは、数百のプロジェクト（GitHubリポジトリ）を運用していますが、自分の関わらないプロジェクトの開発状況をキャッチアップするのが難しい状況でした。

エンジニアの週次ミーティングでは、開発している内容や問題点などを共有していますが、伝える側の準備工数も大変で、伝え忘れも発生しています。また、手動でのレポート作成には工数がかかるため、なかなか手が回らない状態が続いていました。

そこで、会社でDevinを導入したことから、直近1週間にあった変更内容を網羅的に分析してもらい、自動でレポートを作成する仕組みを試験的に構築してみました。

# 自動レポート化の背景

## 課題

メグリでは毎月のように新しいプロジェクトが作られ、現在では数百のリポジトリを運用しています。この規模になると、以下のような課題が顕在化してきました。

- **情報のキャッチアップ困難**: 自分が直接関わらないプロジェクトの開発状況を把握するのが困難
- **共有の負担**: 週次ミーティングでの共有準備に時間がかかり、伝え忘れも発生
- **レポート作成工数**: 手動でのレポート作成は時間がかかり、継続が困難
- **見落としリスク**: 重要な変更やセキュリティリスクの見落とし

## DevinによるAI活用のメリット

GitHub ActionsやBashスクリプトで情報収集はできますが、収集した大量の情報を分析・要約するには人手が必要でした。Devinを活用することで、以下のメリットが期待できました。

- **包括的な分析**: 大量のコミット情報を網羅的に分析
- **品質観点での評価**: セキュリティリスクや技術的負債の観点からコードを評価
- **一貫性のあるレポート**: 統一されたフォーマットでの継続的なレポート作成
- **工数削減**: 人的な分析・執筆作業の自動化

# 実装

## 全体のフロー

実装した自動化システムの全体的な流れは以下の通りです。

```mermaid
flowchart TD
    A[GitHub Actions<br/>スケジュール実行<br/>月曜 10:00] --> B[Devin API<br/>分析プロンプト送信<br/>※リポジトリ絞り込み処理も含む]
    B --> C[Devin<br/>リポジトリ絞り込み実行<br/>コミット履歴確認]
    C --> D[Devin<br/>対象リポジトリの<br/>コード分析実行]
    D --> E[Devin<br/>分析レポート生成完了]
    E --> F[Slack通知<br/>概要レポート投稿]
    E --> G[GitHub Issue<br/>詳細レポート投稿]
    F --> H[チーム通知完了]
    G --> H
    
    style A fill:#e1f5fe,stroke:#01579b,stroke-width:2px
    style B fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
    style C fill:#fff9c4,stroke:#f57f17,stroke-width:2px
    style D fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
    style E fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
    style F fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px
    style G fill:#fff3e0,stroke:#e65100,stroke-width:2px
```

このフローにより、定期的かつ網羅的なコード分析とレポート作成しています。以下、各ステップの詳細な実装について説明します。

## 対象リポジトリの効率的な絞り込み

上記フローの「Devinリポジトリ絞り込み実行」のステップは、Devinに単純にすべてのリポジトリを分析してもらうとACU（Action Compute Unit）の消費が多くなるため、プロンプト内で以下のコマンドを実行して対象リポジトリを1週間以内に更新されたものに限定するよう指示しています。

```bash
ORG=my_organization
DATE=$(date -d '7 days ago' '+%Y-%m-%dT%H:%M:%SZ')
gh repo list "$ORG" --limit 3000 --json name --jq '.[] | select(.name | endswith("_android")) | .name' | while read REPO; do
  COMM_DATE=$(gh api repos/$ORG/$REPO/commits --jq '.[0].commit.committer.date' 2>/dev/null)
  if [[ "$COMM_DATE" > "$DATE" ]]; then
    echo "$REPO: $COMM_DATE"
  fi
done
```

このスクリプトにより、以下の条件でリポジトリを絞り込んでいます。

- Androidプロジェクトのみを対象（`_android`で終わるリポジトリ名）
- 直近1週間以内にコミットがあるリポジトリのみ
- 最新コミット日時も同時に取得して分析の参考情報として提供

## レポートの観点定義

フローの「Devin対象リポジトリのコード分析実行」のステップでは、Devinに対して以下の5つの観点から分析を行うよう指示しています。

1. **特にインパクトの大きい変更**
   - 新機能追加、パフォーマンス改善、複雑なロジック導入など
   - ポジティブ・ネガティブ両面のインパクトを評価

2. **安定性、クラッシュ、セキュリティリスク**
   - 脆弱性、不適切な入力バリデーション、機密情報のハードコーディングなど
   - 具体的な脅威と対策を記述

3. **明らかに間違ったコード**
   - 文法エラー、ロジック矛盾、意図しない挙動など
   - 修正案も併せて提示

4. **将来的に技術的負債になりうる変更**
   - 一時的な回避策、テスト不足、非推奨API使用など
   - 技術的負債になる理由を具体的に説明

5. **素晴らしい内容**
   - 効率的なアルゴリズム、優れた設計、高い可読性など
   - 優秀な点を具体的に評価

これらの観点は、チーム全体でコード品質のベストプラクティスを共有・改善していくためのものとして仮で設定しています。今後、効果的な分析手法が見つかった場合は、評価基準を変更することで、より価値のある知見を共有できるようになるのではないかと考えています。

## GitHub Actionsでの自動実行

フローの起点となる「GitHub Actionsスケジュール実行」から「Devin API分析プロンプト送信」を実現するため、以下のワークフローを設定しました。

```yaml:weekly_report.yml
name: Android Weekly Report

on:
  workflow_dispatch:
  schedule:
    - cron: '0 1 * * 1' # JST 月曜 10:00

jobs:
  weekly-report:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: generate weekly report
      run: |
        cd scripts/reporting
        pip install requests
        python weekly_report.py
      env:
        GH_TOKEN: ${{ github.token }}
        DEVIN_API_TOKEN: ${{ secrets.DEVIN_API_TOKEN }}
```

## Devin APIとの連携

フローの「Devin API分析プロンプト送信」のステップは、Python スクリプトでDevin APIを呼び出し、リポジトリ絞り込み処理と分析指示を含む詳細なプロンプトを送信することで実現しています。

```python:weekly_report.py
import requests
import json
import os

def main():
    # Devin API キーを環境変数から取得
    devin_api_key = os.getenv("DEVIN_API_TOKEN")
    
    # 分析プロンプトの例（実際はより詳細）
    analysis_prompt = """
# Android Weekly Report

## 情報
- slack webhook url: https://hooks.slack.com/services/XXXXX
- github issue url: https://github.com/org/repo/issues/YYYYY

# 指示
あなたは優秀なソフトウェアエンジニアであり、コードレビューのエキスパートです。
以下の複数のGitHubリポジトリから、それぞれのデフォルトブランチに対して直近1週間以内に
行われたコミットを分析し、レポートを作成してください。

## 分析対象リポジトリ
対象リポジトリは以下のコマンドを実行して取得してください。

ORG=my_organization
DATE=$(date -d '7 days ago' '+%Y-%m-%dT%H:%M:%SZ')
gh repo list "$ORG" --limit 3000 --json name --jq '.[] | select(.name | endswith("_android")) | .name' | while read REPO; do
  COMM_DATE=$(gh api repos/$ORG/$REPO/commits --jq '.[0].commit.committer.date' 2>/dev/null)
  if [[ "$COMM_DATE" > "$DATE" ]]; then
    echo "$REPO: $COMM_DATE"
  fi
done

## レポートに含めるべき内容
1. 特にインパクトの大きい変更
2. 安定性、クラッシュ、セキュリティリスク
3. 明らかに間違ったコード
4. 将来的に技術的負債になりうる変更
5. 素晴らしい内容

レポート作成が完了したら、Slackに概要を通知し、
詳細レポートをGitHub issueにコメントとして追加してください。
    """

    # Devin APIエンドポイント
    devin_api_endpoint = "https://api.devin.ai/v1/sessions"
    
    # ヘッダー情報
    headers = {
        "Authorization": f"Bearer {devin_api_key}",
        "Content-Type": "application/json",
    }

    # APIリクエストのペイロード
    payload = {
        "prompt": analysis_prompt,
        "response_type": "comment"
    }

    try:
        response = requests.post(devin_api_endpoint, headers=headers, data=json.dumps(payload))
        response.raise_for_status()
        
        print(f"ステータスコード: {response.status_code}")
        print(json.dumps(response.json(), indent=2, ensure_ascii=False))
        
    except requests.exceptions.HTTPError as http_err:
        print(f"HTTPエラーが発生しました: {http_err}")
        print(f"レスポンス: {http_err.response.text if http_err.response else 'N/A'}")
    except Exception as e:
        print(f"予期せぬエラーが発生しました: {e}")

if __name__ == "__main__":
    main()
```

## 通知システムの設計

フローの最終段階では、Devinが分析レポート生成完了後に「Slack通知概要レポート投稿」と「GitHub Issue詳細レポート投稿」を実行し、以下の2段階で情報を共有します。

1. **Slack通知（概要）**
   - 新しいスレッドでタイトルと概要を通知
   - 20行以内の簡潔なサマリー
   - 詳細レポートへのリンクを必ず含める

2. **GitHub Issue（詳細）**
   - 後から参照しやすいよう詳細内容をIssueコメントに記録
   - コミットハッシュやPRリンクを含む網羅的な分析結果

# 実際の運用結果

## 分析対象の規模

実際の運用では、以下のような規模で分析を実行しています。

- **対象期間**: 直近1週間
- **分析リポジトリ数**: 平均数十リポジトリ/週
- **分析対象**: 各リポジトリのデフォルトブランチの最新コミット

## レポート内容の例

実際に生成されたレポートから、以下のような分析結果が得られています。

### Slack通知の例

```
Android Weekly Report (2025/05/26 - 2025/06/02)

直近1週間で35のAndroidリポジトリを分析しました。主な変更点：

🚀 **インパクト大**
• プロジェクトA: リリースブランチ作成ワークフロー自動化
• プロジェクトB: アナリティクスSDK導入による計測機能強化
• 外部サービス連携開発（複数プロジェクト）

⚠️ **安定性・セキュリティ**
• プロジェクトC: 3つの異なるクラッシュ対応
• プロジェクトD: プッシュ通知問題修正

📈 **技術的負債リスク**
• 共通ライブラリ一括更新の影響
• API設定変更の頻発
• 設定値ハードコーディング

🐛 **コードエラー**
• プロジェクトE: バグ修正または問題解決

✨ **優秀な実装**
• SDKログ制御機能
• 一貫したリファクタリング
• Lint警告の積極的修正

詳細レポート: [GitHub Issue URL]
```

### 詳細分析の例

GitHub Issueには、以下のような詳細な分析が記録されます。

- **リポジトリごとの詳細分析**: 各変更の具体的な評価
- **コミットハッシュとPRリンク**: トレーサビリティの確保
- **具体的な改善提案**: 発見された問題に対する対策案
- **総合評価**: 週全体の開発状況の俯瞰

# おわりに

この記事では、Devinを活用したWeeklyレポートの自動作成の事例について紹介しました。

大量のリポジトリを運用する組織では、手動での情報収集・分析には限界があります。今回の試験導入により、工数削減だけでなく、見落としの防止や一貫性のある分析の可能性が確認できました。

特に、ACU消費を抑えるための対象リポジトリの絞り込みや、Slack + GitHub Issue による効果的な情報共有の仕組みは、他の組織でも応用可能だと考えています。

一方で、分析観点やプロンプトの改良、チーム固有のニーズへの適応など、今後も継続的な改善が必要だと考えられます。AIを活用したコード分析や開発プロセスの自動化は、今後さらに重要性を増していくと予想されるため、引き続き、それぞれの組織に最適化されたアプローチを検討していこうと思います。

# お知らせ（採用情報）

メグリでは、今回のような生成AIの活用や、[GitHub Actionsを使った自動化](https://qiita.com/mgre_tanabe/items/6420567ed2882425821d) などに興味があるエンジニアを募集しております。
DevinやGitHub Actionsをはじめとする最新技術を活用した効率的な開発環境の構築に加えて、モバイルアプリ開発、サーバサイド開発に興味がある方はぜひ以下のページをご覧ください。

https://mgre.co.jp/careers

カジュアル面談も随時実施していますので、お気軽にお問い合わせください。