CI/CD中的AI如何用Agent自動(dòng)生成Release Note
發(fā) Release 最煩的不是寫代碼,是寫 Release Note。
你在 GitHub 上看到一個(gè) Release,寫了 “Bug fixes and performance improvements”——作者的心態(tài)跟我一樣:代碼寫完了,真不想再花 20 分鐘組織語(yǔ)言總結(jié)改了什么。
但這個(gè)活 AI 特別擅長(zhǎng)——讀 Git 提交記錄,分類整理,生成人類可讀的 Release Note。
這正是我開源的 daily-report-agent 做的事。給它換個(gè) Prompt,它就能從 Git 歷史生成 Release Note 而不是日?qǐng)?bào)。
這篇帶你把這個(gè)能力嵌入 GitHub Actions,每次發(fā) Release 自動(dòng)生成變更說(shuō)明。
整體流程
Git Push (觸發(fā) workflow)
→ GitHub Actions 拉取代碼
→ 用 daily-report-agent 分析 git log
→ Agent 調(diào)用 LLM 分類 & 組織語(yǔ)言
→ 生成 Release Note Markdown
→ 自動(dòng)發(fā)布到 GitHub Releases第一步:把生成邏輯抽成一個(gè)獨(dú)立命令
在 cmd/agentd/main.go 里除了 API 服務(wù),再加一個(gè) release-note 子命令:
// cmd/agentd/release.go
package main
import (
"context"
"fmt"
"os"
"os/exec"
"strings"
"time"
"agent-project/internal/config"
"agent-project/internal/llm"
)
// GenerateReleaseNote 從 Git 歷史生成 Release Note
func GenerateReleaseNote(cfg *config.Config, fromTag, toTag string) (string, error) {
// 1. 獲取提交記錄
commits, err := getGitCommits(fromTag, toTag)
if err != nil {
return "", fmt.Errorf("獲取提交記錄失敗: %w", err)
}
if len(commits) == 0 {
return "無(wú)新提交", nil
}
// 2. 構(gòu)造 Prompt
prompt := buildReleaseNotePrompt(commits, fromTag, toTag)
// 3. 調(diào)用 LLM
client := llm.NewClient(cfg.LLM)
resp, err := client.Chat(context.Background(), []llm.Message{
{
Role: "system",
Content: releaseNoteSystemPrompt,
},
{
Role: "user",
Content: prompt,
},
})
if err != nil {
return "", fmt.Errorf("LLM 調(diào)用失敗: %w", err)
}
return resp.Text, nil
}
// getGitCommits 獲取兩個(gè) tag 之間的提交記錄
func getGitCommits(fromTag, toTag string) ([]Commit, error) {
rangeStr := "HEAD"
if fromTag != "" && toTag != "" {
rangeStr = fmt.Sprintf("%s..%s", fromTag, toTag)
} else if fromTag != "" {
rangeStr = fmt.Sprintf("%s..HEAD", fromTag)
}
cmd := exec.Command("git", "log", rangeStr,
"--pretty=format:%H|||%an|||%ad|||%s|||%b",
"--date=short",
)
output, err := cmd.Output()
if err != nil {
return nil, err
}
var commits []Commit
for _, line := range strings.Split(strings.TrimSpace(string(output)), "\n") {
if line == "" {
continue
}
parts := strings.SplitN(line, "|||", 5)
if len(parts) < 4 {
continue
}
body := ""
if len(parts) == 5 {
body = parts[4]
}
commits = append(commits, Commit{
Hash: parts[0][:7],
Author: parts[1],
Date: parts[2],
Subject: parts[3],
Body: body,
})
}
return commits, nil
}
type Commit struct {
Hash string
Author string
Date string
Subject string
Body string
}
// buildReleaseNotePrompt 構(gòu)造分類 Prompt
func buildReleaseNotePrompt(commits []Commit, fromTag, toTag string) string {
var sb strings.Builder
sb.WriteString(fmt.Sprintf("從 %s 到 %s 的變更:\n\n", fromTag, toTag))
for _, c := range commits {
sb.WriteString(fmt.Sprintf("- [%s] %s (%s, %s)\n",
c.Hash, c.Subject, c.Author, c.Date))
if c.Body != "" {
// 只取 body 的第一段
bodyLines := strings.Split(c.Body, "\n\n")
if len(bodyLines) > 0 {
sb.WriteString(fmt.Sprintf(" 詳情: %s\n", bodyLines[0]))
}
}
}
sb.WriteString(fmt.Sprintf("\n共 %d 個(gè)提交。請(qǐng)生成 Release Note。", len(commits)))
return sb.String()
}
const releaseNoteSystemPrompt = `你是一個(gè)開源項(xiàng)目的 Release Manager。
根據(jù) Git 提交記錄生成 Release Note。
分類規(guī)則:
- ?? 新功能:feat 開頭的提交
- ?? Bug 修復(fù):fix 開頭的提交
- ?? 改進(jìn):refactor/perf/style 開頭的提交
- ?? 文檔:docs 開頭的提交
- ?? 破壞性變更:有 BREAKING CHANGE 標(biāo)記或明顯不向后兼容的提交
如果不能歸類的,放在 "其他" 里。
格式要求:
- 使用 Markdown
- 每個(gè)條目一行,說(shuō)明變更內(nèi)容,不寫過(guò)程
- 避免 "該同志"、"表現(xiàn)優(yōu)異" 等套話
- 語(yǔ)言:中文
輸出格式:
## ?? 新功能
- xxx
## ?? Bug 修復(fù)
- xxx
## ?? 改進(jìn)
- xxx
## ?? 文檔
- xxx
如有破壞性變更,在開頭加:
> ?? 本版本包含破壞性變更,請(qǐng)謹(jǐn)慎升級(jí)。`第二步:寫 GitHub Actions Workflow
# .github/workflows/release-note.yml
name: Generate Release Note
on:
push:
tags:
- 'v*' # 推送 v 開頭 tag 時(shí)觸發(fā)
workflow_dispatch: # 也支持手動(dòng)觸發(fā)
inputs:
from_tag:
description: '從哪個(gè) tag 開始'
required: false
to_tag:
description: '到哪個(gè) tag'
required: false
jobs:
generate-release-note:
runs-on: ubuntu-latest
permissions:
contents: write # 需要寫權(quán)限來(lái)創(chuàng)建 Release
steps:
- name: 拉取代碼
uses: actions/checkout@v4
with:
fetch-depth: 0 # 獲取完整 git 歷史
- name: 安裝 Go
uses: actions/setup-go@v5
with:
go-version: '1.22'
- name: 編譯 agent
run: go build -o agentd ./cmd/agentd
- name: 確定 tag 范圍
id: tags
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "FROM=${{ inputs.from_tag }}" >> $GITHUB_OUTPUT
echo "TO=${{ inputs.to_tag }}" >> $GITHUB_OUTPUT
else
# 自動(dòng)獲?。荷弦淮?tag → 當(dāng)前 tag
CURRENT_TAG="${{ github.ref_name }}"
PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
echo "FROM=${PREV_TAG}" >> $GITHUB_OUTPUT
echo "TO=${CURRENT_TAG}" >> $GITHUB_OUTPUT
fi
- name: 生成 Release Note
env:
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
LLM_MODEL: deepseek-v4-flash
run: |
./agentd release-note \
--from "${{ steps.tags.outputs.FROM }}" \
--to "${{ steps.tags.outputs.TO }}" \
> release-note.md
- name: 展示生成的 Release Note
run: cat release-note.md
- name: 創(chuàng)建 GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
body_path: release-note.md
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}真實(shí)效果
以 daily-report-agent v0.2.0 為例,手動(dòng)寫 Release Note 大約花了 15 分鐘。用 Agent 自動(dòng)生成后:
Agent 生成的輸出:
## ?? 新功能 - 支持多倉(cāng)庫(kù)批量分析,自動(dòng)匯總?cè)請(qǐng)?bào) (#15) - 新增企業(yè)微信通知渠道,日?qǐng)?bào)直接推送到群 (#18) ## ?? Bug 修復(fù) - 修復(fù) Git 提交信息中含特殊字符時(shí)解析崩潰的問(wèn)題 (#12) - 修復(fù)時(shí)區(qū)問(wèn)題導(dǎo)致日?qǐng)?bào)日期差一天 (#14) ## ?? 改進(jìn) - LLM 調(diào)用增加指數(shù)退避重試,API 超時(shí)自動(dòng)恢復(fù) (#16) - 日志改用 slog 結(jié)構(gòu)化輸出,方便接入日志平臺(tái) (#17) ## ?? 文檔 - README 新增 Docker Compose 部署說(shuō)明 - 補(bǔ)充 API 文檔和調(diào)用示例
我審閱了一下,改了兩處措辭,就發(fā)布了。全程 3 分鐘。
Agent 不會(huì)漏提交——Git log 是完整的。它也不會(huì)把 feat 寫成 fix。比人更快,比人更準(zhǔn)確。
進(jìn)階:多倉(cāng)庫(kù) Release Note 匯總
如果你有一個(gè)微服務(wù)項(xiàng)目,一次發(fā)版涉及 5 個(gè)倉(cāng)庫(kù)。Agent 可以逐個(gè)倉(cāng)庫(kù)分析,再匯總:
func GenerateMultiRepoReleaseNote(repos []string) (string, error) {
var allNotes []string
for _, repo := range repos {
note, err := GenerateReleaseNoteForRepo(repo)
if err != nil {
log.Printf("[Warn] 倉(cāng)庫(kù) %s 生成失敗: %v", repo, err)
continue
}
allNotes = append(allNotes, fmt.Sprintf("### %s\n\n%s", repo, note))
}
// 調(diào)一次 LLM 做最終匯總
return summarizeReleaseNotes(allNotes)
}成本
一次 Release Note 生成:
| 步驟 | Token 消耗 | 費(fèi)用 |
|---|---|---|
| Git Log 提取 | 0(本地執(zhí)行) | ¥0 |
| LLM 分類整理 | ~3000 token | ¥0.009 |
| GitHub API 發(fā)布 | 0 | ¥0 |
| 合計(jì) | ~3000 token | ¥0.009 |
不到 1 分錢。省了 15 分鐘。
用 GitHub Actions 免費(fèi)額度(每月 2000 分鐘),完全在免費(fèi)額度內(nèi)。
不到1分錢省了15分鐘。下一篇:Agent 安全審查清單——API Key 管理、用戶數(shù)據(jù)隔離。10個(gè)檢查項(xiàng),每個(gè)配修復(fù)方案。
到此這篇關(guān)于CI/CD 中的 AI:用 Agent 自動(dòng)生成 Release Note的文章就介紹到這了,更多相關(guān)CI/CD Agent 自動(dòng)生成 Release Note內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章

深度對(duì)比OpenClaw,Claude Code與Hermes Agent的AI Agent記憶系統(tǒng)架構(gòu)設(shè)計(jì)
本文將深入對(duì)比三個(gè)代表性項(xiàng)目的記憶系統(tǒng)設(shè)計(jì),OpenClaw(通用 Agent 框架)、Claude Code(編程 Agent)和 Hermes Agent(自進(jìn)化 Agent),它們分別代表了三種不同的設(shè)計(jì)哲2026-05-30
Hermes Agent(愛馬仕)AI智能體框架部署的完整指南
Hermes Agent(開發(fā)者社區(qū)俗稱"愛馬仕") 是 2026 年 2 月正式開源的新一代 AI 智能體(Agent)框架,本文從框架原理、核心技術(shù)架構(gòu),與主流框架的橫向?qū)Ρ?,?W2026-05-26
2026年Hermes Agent配置AI模型的保姆級(jí)教程
Hermes Agent 是 Nous Research 開源的自進(jìn)化 AI Agent,支持 CLI、Telegram、Discord 等多端使用,但默認(rèn)只能接一個(gè)模型提供商,本文手把手教你通過(guò) OpenAI 兼容網(wǎng)關(guān),一鍵2026-05-21
OpenClaw vs Hermes Agent:2026年AI智能體雙雄深度對(duì)比
在2026年的AI Agent浪潮中,OpenClaw(昵稱"龍蝦")和 Hermes Agent 迅速成為兩大最熱門的開源項(xiàng)目,兩者都是自托管、本地運(yùn)行的自主AI Agent,下面我們就來(lái)深度2026-05-20
Hermes Agent 安裝部署攻略60秒入門這個(gè)可成長(zhǎng)的AI助手
HermesAgent是一個(gè)自主運(yùn)行的的A自主學(xué)習(xí)的AI代理,支持多多平臺(tái),具有自主成長(zhǎng)、跨會(huì)話會(huì)議和記憶的特點(diǎn),文章介紹安裝和配置過(guò)程,,及使用、技能管理和定時(shí)任務(wù)的簡(jiǎn)要使用,2026-05-19
2026年最新Hermes Agent部署教程:從零開始搭建你的自進(jìn)化AI助手
Hermes Agent 是由 Nous Research 開源的一款自進(jìn)化 AI Agent,它是目前唯一內(nèi)置學(xué)習(xí)循環(huán)的 Agent 系統(tǒng),能夠從經(jīng)驗(yàn)中創(chuàng)建技能、在使用過(guò)程中持續(xù)改進(jìn)、主動(dòng)持久化知識(shí),并2026-05-17
Hermes Agent Windows Docker 部署完全指南如何從零開始搭建你的自我進(jìn)化AI 智能體
HermesAgent是NousResearch開發(fā)的開源自我進(jìn)化型AI智能體,支持多模型、多平臺(tái)網(wǎng)關(guān)和持久化記憶,文章詳細(xì)介紹了環(huán)境準(zhǔn)備、Docker鏡像拉取、初始化配置、接入LLM模型、啟動(dòng)運(yùn)2026-05-13
Hermes Agent vs OpenClaw:2026年兩大AI Agent框架深度對(duì)比分析
OpenClaw作為開源社區(qū)寵兒,Hermes Agent作為企業(yè)級(jí)解決方案,兩者在設(shè)計(jì)理念、架構(gòu)實(shí)現(xiàn)和適用場(chǎng)景上存在根本性差異,本文就對(duì)二者進(jìn)行了深度的對(duì)比分析,需要的朋友可以參考2026-04-21
Hermes Agent工具集大全:20+工具讓你的AI無(wú)所不能
工具集是Hermes Agent區(qū)別于普通AI聊天工具的關(guān)鍵,通過(guò)調(diào)用各種工具,Hermes Agent不僅僅是一個(gè)對(duì)話伙伴,而是一個(gè)能夠?qū)嶋H操作系統(tǒng)的智能代理,本文整理了20+個(gè)工具集,覆2026-04-20










