把 AI 接进研发流水线:从 PR 审查到自动发布的实战配置指南
AI编程 工作流自动化教程|附配置文件
在过去几年里,AI 编程工具从“代码补全助手”快速演进为“研发流程协作伙伴”。它们不再只是帮你补全一行函数,而是可以参与需求拆解、代码生成、单元测试、文档编写、代码审查、CI/CD 检查、Issue 归类、自动发布等完整研发流程。
但很多团队在使用 AI 编程时,仍然停留在“打开聊天窗口,复制粘贴代码”的阶段。这种方式当然有效,但效率不稳定、上下文容易丢失、输出质量依赖个人经验,也很难沉淀成团队标准。
真正高效的做法,是把 AI 编程能力嵌入到日常开发工作流中,让 AI 在固定节点自动完成固定任务,例如:
- 新需求进入仓库后,自动生成开发计划;
- 提交代码时,自动检查代码风格和潜在问题;
- 创建 Pull Request 时,自动生成变更摘要;
- 合并前,自动执行测试、Lint 和安全扫描;
- 发布版本时,自动生成 Changelog;
- 项目文档变更后,自动同步更新 README 或接口说明;
- 团队成员提 Issue 后,自动分类、打标签、补充复现模板。
本文将围绕“AI 编程 + 工作流自动化”展开,介绍一套适合个人开发者、小团队和中型研发团队落地的自动化方案,并附上可直接改造使用的配置文件。
一、为什么要做 AI 编程工作流自动化?
很多人使用 AI 编程工具时,会遇到几个常见问题。
1. AI 输出不稳定
同样的问题,不同开发者问法不同,AI 给出的答案也不同。有的人能得到高质量方案,有的人得到的结果却不可用。问题不在 AI 本身,而在于缺少统一的提示词规范、上下文输入规范和结果验收标准。
通过工作流自动化,可以把提示词、上下文、约束条件写进配置文件,让 AI 每次都按相同标准工作。
2. 人工复制粘贴效率低
如果每次都要手动复制代码、日志、报错信息、文件结构给 AI,再把结果粘回编辑器,效率并不高。尤其在多人协作项目中,这种方式很难规模化。
通过 GitHub Actions、GitLab CI、脚本工具或本地 CLI,可以让 AI 在指定事件触发时自动运行,例如提交 PR、打开 Issue、推送分支等。
3. 缺少团队级知识沉淀
个人使用 AI 的经验往往散落在聊天记录里,很难共享给团队。新人加入后,也不知道应该如何向 AI 描述项目规则。
如果把项目架构说明、代码规范、常用命令、模块边界、测试要求写成仓库内的配置文档,AI 就能基于这些内容辅助开发,新人也能快速了解团队实践。
4. AI 不应该替代流程,而应该增强流程
AI 最适合处理“重复、半结构化、需要理解上下文但不应完全依赖人工判断”的任务。比如 PR 摘要、代码初审、测试建议、文档草稿、Issue 分类等。
而最终合并、架构决策、安全放行等关键节点,仍然应该由人负责。好的 AI 工作流不是让 AI 完全接管研发,而是让 AI 参与低风险、高频率、标准化的任务。
二、推荐的整体架构
一个比较实用的 AI 编程自动化工作流,可以分为五层。
开发者输入层
├─ Issue
├─ Pull Request
├─ Commit
├─ 本地 IDE
└─ 命令行脚本
上下文管理层
├─ 项目说明
├─ 代码规范
├─ 架构约束
├─ API 文档
└─ 测试要求
AI 执行层
├─ 需求拆解
├─ 代码审查
├─ 测试生成
├─ 文档生成
└─ 变更摘要
自动化编排层
├─ GitHub Actions
├─ GitLab CI
├─ Husky
├─ Makefile
└─ 自定义脚本
质量控制层
├─ Lint
├─ Type Check
├─ Unit Test
├─ Security Scan
└─ 人工 Review
这套架构的核心思想是:
不要让 AI 随意发挥,而是让 AI 在明确上下文、明确任务、明确输出格式、明确验收标准的环境中工作。
三、项目目录设计
下面是一套推荐的项目目录结构,你可以根据自己的技术栈调整。
my-project/
├─ .github/
│ ├─ workflows/
│ │ ├─ ai-pr-review.yml
│ │ ├─ ci.yml
│ │ └─ release.yml
│ └─ ISSUE_TEMPLATE/
│ ├─ bug_report.yml
│ └─ feature_request.yml
├─ .ai/
│ ├─ project.md
│ ├─ coding-rules.md
│ ├─ review-rules.md
│ ├─ test-rules.md
│ └─ prompts/
│ ├─ pr-review.md
│ ├─ issue-plan.md
│ └─ changelog.md
├─ scripts/
│ ├─ ai-pr-review.mjs
│ ├─ ai-issue-plan.mjs
│ └─ ai-changelog.mjs
├─ src/
├─ tests/
├─ package.json
├─ README.md
└─ .env.example
其中,.ai/ 目录非常关键。它相当于项目的“AI 工作说明书”。你不应该每次都在聊天窗口里重新告诉 AI 项目背景,而应该把稳定信息沉淀到仓库中。
四、编写 AI 项目上下文文件
1. .ai/project.md
这个文件用于告诉 AI 项目的基本情况。
# 项目说明
## 项目名称
My Project
## 项目类型
一个基于 Node.js + TypeScript 的 Web API 服务。
## 技术栈
- Runtime:Node.js 20+
- Language:TypeScript
- Framework:Fastify
- Database:PostgreSQL
- ORM:Prisma
- Test:Vitest
- Package Manager:pnpm
## 项目目标
本项目用于提供用户、订单、支付相关的后端 API 服务,要求接口稳定、可测试、可维护。
## 核心模块
- `src/modules/user`:用户注册、登录、资料管理
- `src/modules/order`:订单创建、查询、取消
- `src/modules/payment`:支付发起、回调处理
- `src/common`:通用工具、错误处理、中间件
## 非功能性要求
- 所有核心业务逻辑必须有单元测试
- API 错误返回格式必须统一
- 不允许在业务代码中直接读取环境变量,应通过配置模块读取
- 不允许在 Controller 中编写复杂业务逻辑
- 所有数据库访问必须通过 Repository 或 Service 层封装
这个文件越清晰,AI 生成代码时越不容易偏离项目结构。
2. .ai/coding-rules.md
这个文件用于定义代码规范。
# 代码规范
## 基本原则
1. 优先保证代码可读性,不追求过度抽象。
2. 函数职责单一,避免超过 80 行。
3. 复杂逻辑必须添加必要注释,但不要写无意义注释。
4. 错误处理必须明确,不允许吞掉异常。
5. 新增功能必须考虑测试用例。
## TypeScript 规范
- 禁止使用 `any`,除非有明确理由并添加注释。
- 优先使用 `type` 定义数据结构。
- 对外暴露的函数必须声明返回类型。
- DTO、Entity、Repository、Service 需要分层清晰。
- 不允许在业务层直接拼接 SQL 字符串。
## 命名规范
- 文件名使用 kebab-case。
- 类名使用 PascalCase。
- 函数和变量使用 camelCase。
- 测试文件以 `.test.ts` 结尾。
## 错误处理
统一使用 `AppError` 抛出业务异常。
示例:
```ts
throw new AppError('USER_NOT_FOUND', '用户不存在', 404);
测试要求
- Service 层必须编写单元测试。
- Repository 层可以使用 Mock 或测试数据库。
- 重要边界条件必须覆盖。
3. .ai/review-rules.md
这个文件用于约束 AI 做代码审查时的关注点。
# 代码审查规则
请重点检查以下内容:
## 安全性
- 是否存在 SQL 注入风险
- 是否泄露敏感信息
- 是否错误输出 token、password、secret
- 是否缺少权限校验
## 可维护性
- 是否存在重复代码
- 是否有过度复杂的函数
- 是否违反项目分层规范
- 是否存在难以测试的实现
## 正确性
- 是否处理空值、异常值、边界值
- 是否存在异步调用未 await
- 是否可能产生竞态条件
- 是否存在错误的状态流转
## 测试
- 新增逻辑是否有测试
- 测试是否覆盖主要分支
- 是否存在只验证 happy path 的测试
## 输出格式
请使用以下格式输出:
### 总体评价
用 3 到 5 句话总结本次变更质量。
### 必须修改
列出阻塞合并的问题。如果没有,请写“暂无”。
### 建议优化
列出非阻塞问题。
### 测试建议
说明还应该补充哪些测试。
### 风险等级
从低、中、高三个等级中选择一个。
五、配置本地开发自动化
在进入远程 CI 之前,我们先配置本地自动化,让问题尽早暴露。
1. 安装基础依赖
以 Node.js 项目为例:
pnpm add -D eslint prettier husky lint-staged typescript vitest
2. 配置 package.json
{
"scripts": {
"dev": "tsx watch src/main.ts",
"build": "tsc -p tsconfig.json",
"lint": "eslint \"src/**/*.ts\"",
"format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
"typecheck": "tsc --noEmit",
"test": "vitest run",
"test:watch": "vitest",
"check": "pnpm lint && pnpm typecheck && pnpm test"
},
"lint-staged": {
"*.{ts,tsx,js,jsx}": [
"eslint --fix",
"prettier --write"
],
"*.{json,md,yml,yaml}": [
"prettier --write"
]
}
}
3. 配置 Husky
pnpm dlx husky init
修改 .husky/pre-commit:
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
pnpm lint-staged
pnpm typecheck
这样,每次提交代码前都会自动执行格式化、Lint 和类型检查。AI 生成的代码如果不符合基础标准,会在提交前被拦截。
六、配置 GitHub Actions 持续集成
.github/workflows/ci.yml
name: CI
on:
pull_request:
branches:
- main
- develop
push:
branches:
- main
- develop
jobs:
check:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: pnpm
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Lint
run: pnpm lint
- name: Type Check
run: pnpm typecheck
- name: Unit Test
run: pnpm test
- name: Build
run: pnpm build
这一步不是 AI 自动化,但非常重要。因为 AI 生成代码后,必须有稳定的工程化检查兜底。没有 CI 的 AI 编程,很容易变成“看起来能用,但实际不可控”。
七、配置 AI PR 自动审查
接下来是核心部分:当有人创建或更新 Pull Request 时,自动调用 AI 对变更内容进行审查,并把结果评论到 PR 中。
下面示例使用 Node.js 脚本调用 AI API。你可以替换为自己使用的模型服务。
1. 环境变量
在 GitHub 仓库的 Settings → Secrets and variables → Actions 中添加:
AI_API_KEY=你的 API Key
AI_BASE_URL=https://api.example.com/v1
AI_MODEL=your-model-name
GITHUB_TOKEN=GitHub 自动提供,也可使用默认值
本地创建 .env.example:
AI_API_KEY=
AI_BASE_URL=https://api.example.com/v1
AI_MODEL=your-model-name
2. .github/workflows/ai-pr-review.yml
name: AI PR Review
on:
pull_request:
types:
- opened
- synchronize
- reopened
permissions:
contents: read
pull-requests: write
jobs:
ai-review:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: npm install @octokit/rest dotenv
- name: Run AI PR Review
env:
AI_API_KEY: ${{ secrets.AI_API_KEY }}
AI_BASE_URL: ${{ secrets.AI_BASE_URL }}
AI_MODEL: ${{ secrets.AI_MODEL }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_REPOSITORY: ${{ github.repository }}
PR_NUMBER: ${{ github.event.pull_request.number }}
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: node scripts/ai-pr-review.mjs
3. scripts/ai-pr-review.mjs
import fs from 'node:fs';
import { execSync } from 'node:child_process';
import { Octokit } from '@octokit/rest';
const {
AI_API_KEY,
AI_BASE_URL,
AI_MODEL,
GITHUB_TOKEN,
GITHUB_REPOSITORY,
PR_NUMBER,
BASE_SHA,
HEAD_SHA
} = process.env;
function readFileSafe(path) {
if (!fs.existsSync(path)) return '';
return fs.readFileSync(path, 'utf8');
}
function getDiff() {
return execSync(`git diff ${BASE_SHA}...${HEAD_SHA} -- . ':!pnpm-lock.yaml' ':!package-lock.json'`, {
encoding: 'utf8',
maxBuffer: 1024 * 1024 * 5
});
}
async function callAI(prompt) {
const response = await fetch(`${AI_BASE_URL}/chat/completions`, {
method: 'POST',
headers: {
Authorization: `Bearer ${AI_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: AI_MODEL,
messages: [
{
role: 'system',
content:
'你是一名资深软件工程师,擅长代码审查、安全审查、TypeScript、Node.js 和后端架构。请使用中文输出。'
},
{
role: 'user',
content: prompt
}
],
temperature: 0.2
})
});
if (!response.ok) {
const text = await response.text();
throw new Error(`AI API request failed: ${response.status} ${text}`);
}
const data = await response.json();
return data.choices?.[0]?.message?.content || 'AI 未返回有效内容。';
}
async function commentPR(body) {
const [owner, repo] = GITHUB_REPOSITORY.split('/');
const octokit = new Octokit({ auth: GITHUB_TOKEN });
await octokit.issues.createComment({
owner,
repo,
issue_number: Number(PR_NUMBER),
body
});
}
async function main() {
const project = readFileSafe('.ai/project.md');
const codingRules = readFileSafe('.ai/coding-rules.md');
const reviewRules = readFileSafe('.ai/review-rules.md');
const diff = getDiff();
if (!diff.trim()) {
await commentPR('## AI PR Review\n\n本次 PR 未检测到有效代码变更。');
return;
}
const prompt = `
请根据以下项目信息、代码规范、审查规则和 Git Diff,对本次 Pull Request 进行代码审查。
# 项目信息
${project}
# 代码规范
${codingRules}
# 审查规则
${reviewRules}
# Git Diff
\`\`\`diff
${diff.slice(0, 60000)}
\`\`\`
请严格按照审查规则中的输出格式返回。
`;
const result = await callAI(prompt);
await commentPR(`## AI PR Review\n\n${result}`);
}
main().catch(async error => {
console.error(error);
process.exit(1);
});
这套脚本实现了几个关键能力:
- 自动读取项目上下文;
- 自动获取 PR 的差异内容;
- 自动把代码规范传给 AI;
- 自动将审查结果写回 PR;
- 限制输出随机性,提高审查稳定性。
八、配置 Issue 自动需求拆解
除了 PR 审查,Issue 也是 AI 工作流自动化的重点。比如用户提交一个 Feature Request 后,AI 可以自动帮你生成开发计划、影响范围、测试建议和风险提醒。
1. .github/ISSUE_TEMPLATE/feature_request.yml
name: Feature Request
description: 提交一个新功能需求
title: "[Feature]: "
labels:
- feature
body:
- type: textarea
id: background
attributes:
label: 背景说明
description: 请说明为什么需要这个功能
validations:
required: true
- type: textarea
id: requirement
attributes:
label: 需求描述
description: 请描述期望实现的功能
validations:
required: true
- type: textarea
id: acceptance
attributes:
label: 验收标准
description: 请列出这个功能完成后应满足的条件
validations:
required: true
2. .ai/prompts/issue-plan.md
# 任务
请根据 Issue 内容生成开发计划。
# 输出格式
## 需求理解
用简洁语言复述需求,确认目标。
## 影响范围
列出可能涉及的模块、接口、数据库表、配置项。
## 技术方案
给出建议实现步骤。
## 任务拆分
使用 Todo List 输出,每个任务必须可执行。
## 测试建议
列出单元测试、集成测试和边界场景。
## 风险点
指出潜在风险和需要人工确认的问题。
你可以使用类似 PR Review 的方式编写 ai-issue-plan.mjs,监听 Issue opened 事件,然后把 AI 的需求拆解结果自动评论到 Issue 下。这样产品、开发和测试都能在同一个地方看到初步方案。
九、配置自动生成 Changelog
发布版本时,团队经常需要整理本次改动。如果完全人工整理,容易遗漏;如果完全依赖 commit,又可能太碎。AI 可以根据合并的 PR、commit message 和 diff 摘要生成更可读的 Changelog。
.ai/prompts/changelog.md
# 任务
请根据版本变更内容生成 Changelog。
# 要求
- 使用中文
- 面向用户和开发者都能理解
- 按类型分组
- 避免过度技术细节
- 如果有破坏性变更,必须单独标出
# 输出格式
## 新增
## 优化
## 修复
## 安全
## 破坏性变更
## 迁移说明
.github/workflows/release.yml
name: Release
on:
push:
tags:
- "v*.*.*"
permissions:
contents: write
jobs:
changelog:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Generate Changelog
env:
AI_API_KEY: ${{ secrets.AI_API_KEY }}
AI_BASE_URL: ${{ secrets.AI_BASE_URL }}
AI_MODEL: ${{ secrets.AI_MODEL }}
run: node scripts/ai-changelog.mjs
实际项目中,你可以在脚本里获取上一个 tag 到当前 tag 的 commit 列表,再传给 AI 生成 Changelog。生成结果可以写入 GitHub Release,也可以提交到 CHANGELOG.md。
十、提示词设计原则
AI 工作流能否稳定,提示词非常关键。推荐遵循以下原则。
1. 明确角色
不要只说“帮我看看代码”,而是要告诉 AI:
你是一名资深后端工程师,擅长 Node.js、TypeScript、系统设计和代码审查。
角色越具体,输出越聚焦。
2. 明确上下文
上下文包括项目技术栈、目录结构、业务规则、代码规范、测试要求等。不要假设 AI 自动知道你的项目约定。
3. 明确任务边界
例如代码审查时,应说明:
- 只审查本次 diff;
- 不要重写整个模块;
- 不要输出无关教程;
- 重点关注安全、正确性、可维护性和测试。
4. 明确输出格式
自动化流程最怕输出不可解析。尽量让 AI 按固定 Markdown 标题输出,必要时也可以要求返回 JSON。
例如:
请按以下 JSON 格式返回,不要添加额外说明:
{
"summary": "",
"risk": "low | medium | high",
"mustFix": [],
"suggestions": [],
"tests": []
}
5. 控制随机性
对于代码审查、测试建议、文档生成等任务,建议把 temperature 设置为 0.1 到 0.3。如果是创意类命名、方案脑暴,可以适当提高。
十一、安全与合规注意事项
AI 编程自动化虽然高效,但一定要注意安全边界。
1. 不要上传敏感信息
不要把以下内容发送给 AI:
- 私钥;
- 数据库密码;
- 用户隐私数据;
- 生产环境 token;
- 内部商业机密;
- 未脱敏日志。
如果必须分析日志,应先做脱敏处理。
2. 控制 Diff 大小
大型 PR 的 diff 可能非常长,不适合直接全部发送给 AI。建议:
- 忽略 lock 文件;
- 忽略构建产物;
- 对超大文件做截断;
- 按文件分批审查;
- 优先审查核心业务代码。
3. 不要让 AI 直接合并代码
AI 可以给建议,但不应该拥有直接合并主分支的权限。尤其是生产系统、支付系统、权限系统等高风险场景,必须保留人工审批。
4. 对 AI 结论进行验证
AI 可能会误报,也可能漏报。它适合作为“第一轮审查助手”,不能替代完整测试、安全扫描和资深工程师 Review。
十二、团队落地建议
如果你准备在团队中推广 AI 编程自动化,建议分阶段进行。
第一阶段:个人效率提升
先在本地使用 AI 辅助完成:
- 代码解释;
- 单元测试生成;
- 重构建议;
- 报错分析;
- 文档草稿。
这一阶段不必追求复杂自动化,重点是让团队成员熟悉 AI 的能力边界。
第二阶段:仓库级上下文建设
建立 .ai/ 目录,沉淀:
- 项目介绍;
- 代码规范;
- Review 规则;
- 测试规则;
- 常用提示词。
这是从“个人经验”走向“团队能力”的关键。
第三阶段:PR 自动审查
把 AI 接入 Pull Request,自动生成审查评论。初期可以只作为参考,不设阻塞规则。
当团队发现 AI 对某些问题识别稳定后,再逐步把规则固化到 Lint、测试或 CI 中。
第四阶段:Issue 和 Release 自动化
继续接入 Issue 需求拆解、Bug 复现分析、Changelog 生成,让 AI 覆盖研发流程上下游。
第五阶段:度量与优化
定期观察:
- AI Review 是否真的减少人工 Review 时间;
- AI 是否频繁误报;
- 哪些规则应该写入静态检查;
- 哪些提示词需要优化;
- 哪些任务不适合 AI 自动化。
AI 工作流不是一次配置后永久不变,而是需要随着项目演进持续优化。
十三、常见问题
1. AI Review 会不会太啰嗦?
会。解决方式是在提示词中限制输出,例如:
只输出与本次 diff 直接相关的问题,不要输出通用建议。
如果没有明确问题,请不要强行提出建议。
2. AI 看不到完整项目,会不会误判?
可能会。因此要提供 .ai/project.md、相关代码片段和目录结构。对于大型项目,可以通过脚本自动读取被修改文件附近的上下文,而不是只传 diff。
3. AI 能不能自动生成测试?
可以,但建议先让 AI 生成测试草稿,再由开发者确认。测试代码同样需要经过 CI 验证,不应该无条件信任。
4. 是否必须使用 GitHub Actions?
不是。GitLab CI、Jenkins、Drone、本地脚本都可以。核心不是使用哪个平台,而是把 AI 能力嵌入固定流程。
5. 小团队是否值得做?
值得。小团队更需要减少重复劳动。即使只配置 AI PR 摘要和基础代码审查,也能显著提升协作效率。
十四、完整落地清单
你可以按照以下清单逐步实施:
- [ ] 创建
.ai/project.md - [ ] 创建
.ai/coding-rules.md - [ ] 创建
.ai/review-rules.md - [ ] 创建
.ai/prompts/目录 - [ ] 配置 ESLint、Prettier、TypeScript
- [ ] 配置 Husky 和 lint-staged
- [ ] 配置 CI 流程
- [ ] 添加 AI API Key 到仓库 Secrets
- [ ] 配置 AI PR Review Workflow
- [ ] 编写
scripts/ai-pr-review.mjs - [ ] 配置 Issue 模板
- [ ] 配置 Issue 自动需求拆解
- [ ] 配置 Release Changelog 自动生成
- [ ] 定期复盘 AI 输出质量
- [ ] 将稳定规则固化为自动化检查
十五、总结
AI 编程的价值,不只是“帮你写几行代码”,而是把软件研发中大量重复、繁琐、需要上下文理解的任务自动化。相比临时打开聊天窗口提问,把 AI 接入 Issue、PR、CI、Release 等工作流,能带来更稳定、更可复用、更团队化的效率提升。
本文提供的方案重点强调三点:
- 上下文工程化:把项目说明、代码规范、审查规则沉淀到仓库;
- 流程自动化:通过 GitHub Actions、脚本和 CI 把 AI 嵌入研发节点;
- 质量可控化:让 AI 做辅助判断,最终仍由测试、静态检查和人工 Review 兜底。
如果你刚开始实践,不必一次性搭建完整系统。可以先从 .ai/ 目录和 AI PR Review 开始,再逐步扩展到 Issue 拆解、测试生成、Changelog 和文档同步。
最好的 AI 编程工作流,不是让开发者变得“懒”,而是让开发者把时间从重复劳动中释放出来,投入到架构设计、业务理解、用户体验和系统质量这些更重要的事情上。