プロジェクトの開発メンバーが増えてきて共有漏れが増えてきて、悩んでいたエンジニアです。
人間が共有を忘れても共有漏れがないようにGemini CLIで仕組み化してみました!
実現したこと
毎朝、前営業日のGitHubのmainブランチの変更内容をSlackに通知し、開発メンバーへ共有をするようにしました。
ざっくりとした仕組み
今回の記事の内容は前提として、バックエンド・フロントエンド・ドキュメントなど1つのリポジトリ(モノレポ)で管理しています。
手順
Slack BOTの作成
こちら の画面からCreate New App
を押して、新規に新しいアプリを作成します。
from a manifest
を押して、その後で通知したいSlackのワークスペースを選択します。
その後、Create
を押します。
次に、Basic InformationのDisplay Informationの項目を埋め、Save Changes
を押して保存します。
App Home
にアクセスし、アプリの表示名などを設定します。
ScopesのBot Token Scopes
にincoming-webhook
を設定します。
そのあと、Install to
を押してワークスペースに今回作成したアプリをインストールします。
GitHub Actions・プロンプト設定
続いて、GitHub ActionsでGemini CLIをスケジュールで動かし、前日のmainブランチへの変更の内容を取りまとめてSlackに通知するように設定しています。
事前設定
workload_identity_provider
、service_account
の設定に関してはこちらを参考に進めてください。
下記の項目に対して、上記で設定した内容をリポジトリのSettings>Secrets and variables>Actions
に登録をします。
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へのリンクでも可)
* **フォーマット例**: `- ユーザー認証機能のロジックを修正。 //commit/xxxxxx` commit-hash`>`
* **フォーマット例**: `- ユーザー認証機能のロジックを修正。 //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}' ` を実行して、Slackに投稿します。
## JSONフォーマット
以下のフォーマットに従って、Slack Block Kit形式のJSONを生成してください。
**注意点**:
* 各カテゴリについて変更がなかった場合は、そのカテゴリに対応する `header` と `section` のブロック(`divider`も含む)を**JSONに含めないでください**。
* 以下のJSONサンプルは完全な構造を示すためのものであり、プレースホルダー部分は実際の変更内容に置き換えてください。
```json
{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ""
}
},
{
"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にセットアップ手順を追記しました。 "
}
},
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*🖥️ フロントエンド(Web)*"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "- ログインページのUIを改善しました。 \n- プロフィール画像のアップロード機能を実装しました。 "
}
},
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*🔌 バックエンド(API)*"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "- ユーザー取得APIのエンドポイントを追加しました。 "
}
},
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*⚠️ フロントエンド開発者への重要なお知らせ*"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "- **[API仕様変更]** ユーザー取得APIのレスポンスから `age` フィールドが削除されました。 \n- **[共通コンポーネント変更]** `Button`コンポーネントの`size` propのデフォルト値が変更されました。 "
}
},
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*📊 DB関連の変更*"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "- `users`テーブルに`nickname`カラムを追加するマイグレーションファイルが追加されました。 "
}
},
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*🛠️ その他の変更*"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "- CIの実行時間を短縮しました。 "
}
},
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "昨日の開発もお疲れ様でした!今日も一日、頑張りましょう!"
}
}
]
}
これで決まった時間に、前日の変更分をSlackに通知がされるようになりました!
最後に
プロンプトに直接SlackのWebhookのURLを載せてしまっていたりまだ整備しきれていないところもありますが、生成AIを活用して仕組み化をすることで日々の開発体験の向上できるかと思います。
もう少しプロンプトをブラッシュアップするのと、Gemini CLIの精度が上がることに期待をしつつ、より開発者にとって欲しい情報になるように試行錯誤していきます。
Views: 0