5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gemini CLIを活用して開発メンバーの共有度を上げたい!

Posted at

プロジェクトの開発メンバーが増えてきて共有漏れが増えてきて、悩んでいたエンジニアです。
人間が共有を忘れても共有漏れがないようにGemini CLIで仕組み化してみました!

実現したこと

毎朝、前営業日のGitHubのmainブランチの変更内容をSlackに通知し、開発メンバーへ共有をするようにしました。

image.png

ざっくりとした仕組み

image.png

今回の記事の内容は前提として、バックエンド・フロントエンド・ドキュメントなど1つのリポジトリ(モノレポ)で管理しています。

手順

Slack BOTの作成

こちら の画面からCreate New App を押して、新規に新しいアプリを作成します。
image.png

from a manifest を押して、その後で通知したいSlackのワークスペースを選択します。
その後、Createを押します。
image.png

次に、Basic InformationのDisplay Informationの項目を埋め、Save Changes を押して保存します。
image.png

App Homeにアクセスし、アプリの表示名などを設定します。
image.png

image.png

ScopesのBot Token Scopesincoming-webhookを設定します。
そのあと、Install to <ワークスペース> を押してワークスペースに今回作成したアプリをインストールします。
image.png

通知させたい対象のチャンネルを選択し、許可を押します。
image.png

Webhook URLをコピーしておきます。
image.png

GitHub Actions・プロンプト設定

続いて、GitHub ActionsでGemini CLIをスケジュールで動かし、前日のmainブランチへの変更の内容を取りまとめてSlackに通知するように設定しています。

事前設定

workload_identity_providerservice_account の設定に関してはこちらを参考に進めてください。

下記の項目に対して、上記で設定した内容をリポジトリのSettings>Secrets and variables>Actions に登録をします。

  • GCP_WORKLOAD_IDENTITY_PROVIDER
  • GCP_SERVICE_ACCOUNT
  • GCP_PROJECT_ID
    image.png

GitHub Actionsの設定

changelog-to-slack.yml
# 前日のmainブランチの変更をSlackに通知するGitHub Actionsの設定ファイルです。

name: Changelog to Slack
on:
  workflow_dispatch:
  schedule:
    - cron: '10 1 * * 1-5'  # 日本時間の月〜金10:10に実行(UTCで1:10)

jobs:
  changelog-to-slack:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      id-token: write
      contents: read
      pull-requests: read
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 100 # 直近100コミットまでを取得で切るように

      # Google Cloud認証
      - name: Authenticate to Google Cloud
        uses: google-github-actions/auth@v2
        with:
          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
          service_account: ${{ secrets.GCP_SERVICE_ACCOUNT }}

      - name: Install Gemini cli & Changelog to Slack
        run: |
          npm install -g @google/gemini-cli
          gemini -d -y -p "@.gemini/prompt/changelog_to_slack.md の指示の内容に従ってください。"
        env:
          GOOGLE_CLOUD_PROJECT:  ${{ secrets.GCP_PROJECT_ID }}
          GOOGLE_CLOUD_LOCATION: global
          GOOGLE_GENAI_USE_VERTEXAI: true

fetch-depth: 100 で数を設定するか無制限の設定をしないとコミットが1件しか取れないので注意してください。

また、Google CloudのVertex AI経由でGemini CLIを利用できるように下記の設定ファイルを作成します。

.gemini/settings.json
{
  "selectedAuthType": "vertex-ai"
}

プロンプトファイルの設定

プロンプトをmdファイルに記載します。GitHub Acitonsのワークフローで下記の内容に従って内容をまとめてもらい、Slackに通知をします。
フォーマットが日によってズレがないように、Slack Block Kit形式のテンプレートをプロンプト内に仕込んでいます。

.gemini/prompt/changelog_to_slack.md
---
name: changelog_to_slack
description: 前日のmainブランチにマージされた変更の要約を、Slackに投稿します。
---

# 指示

あなたは、GitHubリポジトリの `main` ブランチにおける前日の変更点を要約し、Slackに投稿するAIアシスタントです。
以下のルールと手順に厳密に従って、タスクを実行してください。

## ルール

1. **対象期間**:
    * `git log main --since="yesterday" --until="today" --pretty=format:"%h %an %ad %s" --date=short` を実行して、*前日の全てのコミット履歴*を取得してください。
    * 月曜日に実行する場合は、直前の金曜日から日曜日までのコミットを取得するようにsinceとuntilの値を調整してください。

2. **要約とカテゴリ分類**:
    * 各コミットについて、変更内容を2〜3文の簡潔な日本語で要約します。
    * 要約した内容は、後述のJSONフォーマットで定義されている以下のカテゴリに分類してください。
        * ドキュメント
        * フロントエンド(Web)
        * バックエンド(API)
        * フロントエンド開発者への重要なお知らせ
        * DB関連の変更
        * その他

3. **開発者への連携事項**:
    * **フロントエンド開発者向け**:
        * バックエンドのAPI仕様やレスポンススキーマに変更があった場合、その内容を「*⚠️ フロントエンド開発者への重要なお知らせ*」セクションに必ず記載してください。
        * 共通コンポーネント(例: `@frontend/src/components` 配下)に変更があった場合は、同セクションでコンポーネント名を明記し、関連する機能名やファイル名などの影響範囲も記述してください。
    * **バックエンド開発者向け**:
        * DBスキーマ(マイグレーションファイル等)に変更があった場合は、「*📊 DB関連の変更*」セクションに詳細を記載してください。

4. **リンクの添付**:
    * 各変更内容の要約の末尾に、必ずその変更が含まれる**コミットへのパーマリンク**を付与してください。(PRへのリンクでも可)
    * **フォーマット例**: `- ユーザー認証機能のロジックを修正。 <https://github.com/<組織名>/<リポジトリ名>/commit/xxxxxx`commit-hash`>`
    * **フォーマット例**: `- ユーザー認証機能のロジックを修正。 <https://github.com/<組織名>/<リポジトリ名>/pull/1789`pr-number`>`

5. **応援メッセージ**:
    * タスクの最後に、開発チームを鼓舞する応援メッセージを、以下のいずれかのキャラクターになりきって創作してください。
        * ギャル風
        * 熱血体育会系

## 実行手順

1. **期間特定**: 今日の曜日に基づき、対象となる期間を決定します。
2. **コミット取得**: 対象期間内に `main` ブランチに取り込まれた全コミットを特定します。
3. **分析と整理**: 各コミットの変更点を要約し、ルールに従ってカテゴリ分けします。
4. **JSON生成**: 後述の **[JSONフォーマット](#JSONフォーマット)** に従って、Slack Block Kit形式のJSONを組み立てます。
5. **Slack投稿**: `curl -X POST -H 'Content-type: application/json' --data '{手順4で生成したJSON}' <webhook URL>` を実行して、Slackに投稿します。

## JSONフォーマット

以下のフォーマットに従って、Slack Block Kit形式のJSONを生成してください。
**注意点**:

* 各カテゴリについて変更がなかった場合は、そのカテゴリに対応する `header``section` のブロック(`divider`も含む)を**JSONに含めないでください*** 以下のJSONサンプルは完全な構造を示すためのものであり、プレースホルダー部分は実際の変更内容に置き換えてください。

```json
{
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "<!here>"
      }
    },
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": "📝 前日のmainブランチ変更サマリー",
        "emoji": true
      }
    },
    {
      "type": "context",
      "elements": [
        {
          "type": "mrkdwn",
          "text": "🗓️ *対象期間:* 2025年6月24日"
        }
      ]
    },
    {
      "type": "divider"
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*📄 ドキュメント*"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "- README.mdにセットアップ手順を追記しました。 <[https://github.com/example/repo/commit/12345ab](https://github.com/example/repo/commit/12345ab)|`12345ab`>"
      }
    },
    {
      "type": "divider"
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*🖥️ フロントエンド(Web)*"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "- ログインページのUIを改善しました。 <[https://github.com/example/repo/commit/23456bc](https://github.com/example/repo/commit/23456bc)|`23456bc`>\n- プロフィール画像のアップロード機能を実装しました。 <[https://github.com/example/repo/commit/34567cd](https://github.com/example/repo/commit/34567cd)|`34567cd`>"
      }
    },
    {
      "type": "divider"
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*🔌 バックエンド(API)*"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "- ユーザー取得APIのエンドポイントを追加しました。 <[https://github.com/example/repo/commit/56789ef](https://github.com/example/repo/commit/56789ef)|`56789ef`>"
      }
    },
    {
      "type": "divider"
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*⚠️ フロントエンド開発者への重要なお知らせ*"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "- **[API仕様変更]** ユーザー取得APIのレスポンスから `age` フィールドが削除されました。 <[https://github.com/example/repo/commit/56789ef](https://github.com/example/repo/commit/56789ef)|`56789ef`>\n- **[共通コンポーネント変更]** `Button`コンポーネントの`size` propのデフォルト値が変更されました。 <[https://github.com/example/repo/commit/67890fa](https://github.com/example/repo/commit/67890fa)|`67890fa`>"
      }
    },
    {
      "type": "divider"
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*📊 DB関連の変更*"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "- `users`テーブルに`nickname`カラムを追加するマイグレーションファイルが追加されました。 <[https://github.com/example/repo/commit/78901ab](https://github.com/example/repo/commit/78901ab)|`78901ab`>"
      }
    },
    {
      "type": "divider"
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*🛠️ その他の変更*"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "- CIの実行時間を短縮しました。 <[https://github.com/example/repo/commit/89012bc](https://github.com/example/repo/commit/89012bc)|`89012bc`>"
      }
    },
    {
      "type": "divider"
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "昨日の開発もお疲れ様でした!今日も一日、頑張りましょう!"
      }
    }
  ]
}

これで決まった時間に、前日の変更分をSlackに通知がされるようになりました!

スケジュール起動時間について

スケジュール通りに動かない可能性があるので注意してください。

GitHub Actionsワークフロー実行の負荷が高い時間帯は、イベントscheduleが遅延される可能性があります。
https://docs.github.com/en/actions/reference/events-that-trigger-workflows#schedule

最後に

プロンプトに直接SlackのWebhookのURLを載せてしまっていたりまだ整備しきれていないところもありますが、生成AIを活用して仕組み化をすることで日々の開発体験の向上できるかと思います。
もう少しプロンプトをブラッシュアップするのと、Gemini CLIの精度が上がることに期待をしつつ、より開発者にとって欲しい情報になるように試行錯誤していきます。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?