最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

CI/CD中的AI如何用Agent自動(dòng)生成Release Note

  發(fā)布時(shí)間:2026-06-23 10:45:26   作者:龍蝦不加班   我要評(píng)論
這篇教程教你如何使用GitHub Actions和AI工具daily-report-agent自動(dòng)生成ReleaseNote,省時(shí),提高效率,本文介紹的非常詳細(xì),感興趣的朋友一起看看吧

發(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)文章

最新評(píng)論

东乌珠穆沁旗| 堆龙德庆县| 晋宁县| 朝阳市| 内丘县| 新建县| 蓝田县| 科技| 南平市| 额济纳旗| 三台县| 揭阳市| 留坝县| 香港| 岳普湖县| 阜阳市| 探索| 伊吾县| 贵南县| 盐津县| 浦北县| 桓台县| 集安市| 来宾市| 合江县| 滨海县| 芒康县| 双鸭山市| 南昌市| 陆川县| 浑源县| 连江县| 六盘水市| 台山市| 房产| 清河县| 三明市| 舞钢市| 乐陵市| 鹤庆县| 新宾|