使用 Buildkite 的 Agentic CI:三个实用示例
Source: Dev.to
如果你阅读了我们之前关于 AI 如何重塑 CI 的文章,你已经了解了我们在 Buildkite 平台上新增的构建块。我们将这些称为 agentic 工作流组件——可组合的原语,为平台团队提供将 AI 辅助流程引入 CI/CD 工作流所需的工具。
在本文中,我们展示了三个使用 AI 代理解决常见实际问题的实用示例:
- 审核 GitHub Pull Request
- 自动修复破损的 PR 构建
- 从 Linear 任务生成首稿 PR
每个示例都有一个完整运行的 GitHub 仓库,包含可供你 fork、设置、运行并根据团队需求进行适配的 Buildkite 流水线模板。
工作流组件回顾
- Buildkite MCP 服务器 – 通过专用的 MCP 工具,为代理提供对 Buildkite REST API 的细粒度访问。
- Buildkite 模型提供商 – 使用你自己的 API 凭证或托管的 Buildkite 管理密钥,连接前沿模型(例如 Anthropic 的 Claude Code)。
- Buildkite 流水线触发器 – 入站 webhook,可在任何外部事件触发时调用 Buildkite 流水线(对 GitHub、Linear 等提供一等支持)。
- Buildkite SDK – 使用 JavaScript、TypeScript、Python、Go、Ruby 等语言,在运行时动态组合并生成流水线定义。
- AI 驱动插件 – 由 Claude、Codex、Amazon Bedrock 等提供支持,轻松为 CI 作业添加丰富的构建摘要。
这些构建块共同让你能够构建灵活、可适配的工作流,以自己的方式将 AI 代理引入 CI/CD 流程。
示例 1:GitHub 代码审查机器人
代码审查是必不可少的,但也耗时,尤其是当 AI 代理生成更多代码供人类审查时。AI 驱动的审查员可以提供第一轮审查,发现不易察觉的 bug,节省宝贵时间。
示例仓库位于 GitHub,路径为 buildkite-agentic-examples/github-code-review-bot。
工作原理
- 给 PR 打上标签,触发通过 流水线触发器(绑定到特定流水线的入站 webhook URL)的 Buildkite 流水线。
- 流水线运行脚本,解析并验证 webhook 负载。
- 脚本向正在运行的 Buildkite 流水线追加一步,以启动 AI 代理。
- 代理完成审查任务并在 PR 上发布评论。
本文的所有三个示例都遵循这一通用模式。
处理脚本 (scripts/handler.ts)
核心逻辑位于用 TypeScript 编写的 Node.js 程序中。它使用 Buildkite 和 GitHub SDK 运行 Claude Code,并传入任务特定的提示。
import { execSync } from "child_process";
import { Pipeline } from "@buildkite/buildkite-sdk";
import { Octokit } from "octokit";
// ...
// Generate the pipeline with the Buildkite SDK.
function generateCodeReviewPipeline(
webhookPullRequestUrl: string,
agentBuildUrl: string
): string {
const pipeline = new Pipeline();
const tokenArgs = [
`PullRequestURL=${webhookPullRequestUrl}`,
`AgentBuildURL=${agentBuildUrl}`,
];
pipeline.addStep({
label: ":buildkite: Reviewing the code",
commands: [...runAgent(tokenArgs)],
plugins: {
docker: {
image: "buildkite-agentic-example-tools:latest",
"mount-checkout": false,
"mount-buildkite-agent": true,
environment: [
// ...
"TRIGGER_ON_LABEL",
"MODEL_PROVIDER",
],
},
},
// ...
});
return pipeline.toYAML();
}
async function main() {
// Fetch the incoming payload from Buildkite.
const event = buildkiteAgent("meta-data", "get", "buildkite:webhook").trim();
const payload = JSON.parse(event);
// ...
// Exit unless the payload has a label matching the one we're listening for.
const labelName = payload.label.name;
if (labelName !== process.env.TRIGGER_ON_LABEL) {
console.log(`Label is not '${process.env.TRIGGER_ON_LABEL}', exiting`);
process.exit(0);
}
// ...
// Generate and upload a new pipeline step to run the AI agent.
const pipelineYaml = generateCodeReviewPipeline(pullRequestUrl);
execSync("buildkite-agent pipeline upload", {
input: pipelineYaml,
encoding: "utf-8",
});
}
main().catch((error) => {
console.error("Error:", error.message);
process.exit(1);
});
该步骤在 Docker 容器中运行 Claude(通过 Buildkite Docker 插件),容器仅包含 Claude 完成此任务所需的工具:Node.js、GitHub CLI、本地 Buildkite MCP 服务器、Claude Code CLI 以及所需的脚本、提示和环境变量。在容器中运行代理可提供隔离和安全性,虽然并非强制要求。
在容器内部,Claude 会:
- 克隆 PR 所在的仓库
- 检出 PR 分支
- 分析代码变更
- 在 PR 上发布审查评论
- 使用 MCP 服务器的注解工具对 Buildkite 构建进行标注
流水线配置 (.buildkite/pipeline.yml)
所有设置——包括模型提供商和触发标签——均可在流水线 YAML 中配置:
secrets:
GITHUB_TOKEN: GITHUB_TOKEN
BUILDKITE_API_TOKEN: API_TOKEN_BUILDKITE
env:
GITHUB_CLI_VERSION: "2.83.0"
BUILDKITE_MCP_SERVER_VERSION: "0.7.3"
TRIGGER_ON_LABEL: "buildkite-review"
MODEL_PROVIDER: "anthropic"
steps:
- label: ":node: Generate the pipeline"
command: |
# Generate and upload the pipeline to handle the webhook.
echo "--- :webhook: Run the webhook handler"
npm install && npm run build
node dist/handler
Claude CLI 配置 (scripts/claude.sh)
Claude CLI 不直接与 Anthropic API 通信。相反,它使用 Buildkite 托管的模型提供商端点来代理 Anthropic API。脚本从 Buildkite 运行时值中设置所需的环境变量:
#!/bin/bash
# ...
# Set up Buildkite Hosted Models
export ANTHROPIC_BASE_URL="$BUILDKITE_AGENT_ENDPOINT/ai/anthropic"
export ANTHROPIC_API_KEY="$BUILDKITE_AGENT_ACCESS_TOKEN"
# ...
echo "--- :robot_face: Starting Claude Code"
echo "$prompt" | claude -p --mcp-config mcp.json
这些值由 Buildkite 在运行时自动注入,为你提供一种无缝使用 Claude(或任何受支持的模型提供商)而无需泄露自有凭证的方式。有关更多细节,请参阅 模型提供商 文档。