Agentic CI와 Buildkite: 실용적인 예시 세 가지
Source: Dev.to
이전 글에서 AI가 CI를 어떻게 재구성하고 있는지 읽어보셨다면, Buildkite 플랫폼에 추가된 새로운 빌딩 블록에 대해 이미 알고 계실 겁니다. 우리는 이를 agentic workflow components(에이전시 워크플로우 구성 요소)라고 부릅니다—플랫폼 팀이 AI‑지원 프로세스를 CI/CD 워크플로우에 도입할 수 있도록 하는 조합 가능한 기본 요소들입니다.
이번 글에서는 AI 에이전트를 활용해 실제로 흔히 마주치는 문제들을 해결하는 세 가지 실용적인 예시를 보여드립니다:
- GitHub 풀 리퀘스트 리뷰
- 깨진 PR 빌드 자동 수정
- Linear 이슈에서 초안 PR 생성
각 예시는 완전하게 동작하는 GitHub 레포지토리와 Buildkite 파이프라인 템플릿을 포함하고 있어, 포크하고, 설정하고, 실행하고, 팀의 필요에 맞게 조정할 수 있습니다.
워크플로우 구성 요소 요약
- Buildkite MCP server – 특화된 MCP 도구를 통해 에이전트에게 Buildkite REST API에 대한 세밀한 접근 권한을 부여합니다.
- Buildkite model providers – 자체 API 자격 증명이나 Buildkite가 관리하는 호스팅 키를 사용해 Frontier 모델(예: Anthropic의 Claude Code)에 연결합니다.
- Buildkite pipeline triggers – 외부 이벤트에 응답해 Buildkite 파이프라인을 호출하는 인바운드 웹훅(GitHub, Linear 등에 대한 1급 지원).
- Buildkite SDK – JavaScript, TypeScript, Python, Go, Ruby 등 다양한 언어로 런타임에 파이프라인 정의를 동적으로 구성하고 생성합니다.
- AI‑powered plugins – Claude, Codex, Amazon Bedrock 등으로 구동되며, CI 작업에 풍부한 빌드 요약을 쉽게 주석 달 수 있게 합니다.
이 빌딩 블록들을 조합하면, AI 에이전트를 자체적인 조건에 맞게 CI/CD 프로세스에 통합하는 유연하고 적응 가능한 워크플로우를 만들 수 있습니다.
예시 1: GitHub 코드‑리뷰 봇
코드 리뷰는 필수이지만 시간이 많이 소요됩니다. 특히 AI 에이전트가 인간이 검토해야 할 코드를 점점 더 많이 생성하면서 그 부담이 커집니다. AI‑기반 리뷰어는 1차 리뷰를 제공하고, 눈에 잘 띄지 않는 버그를 찾아내며, 소중한 시간을 절약해 줍니다.
예시 레포지토리는 GitHub의 buildkite-agentic-examples/github-code-review-bot 에서 확인할 수 있습니다.
작동 방식
- PR에 라벨이 추가되면 파이프라인 트리거(특정 파이프라인에 연결된 인바운드 웹훅 URL)를 통해 Buildkite 파이프라인이 실행됩니다.
- 파이프라인은 웹훅 페이로드를 파싱하고 검증하는 스크립트를 실행합니다.
- 스크립트는 실행 중인 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를 Docker 컨테이너 안에서 실행합니다. 컨테이너에는 해당 작업에 필요한 도구들—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와 직접 통신하지 않습니다. 대신 Anthropic API를 프록시하는 Buildkite‑관리 모델‑제공자 엔드포인트를 사용합니다. 스크립트는 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(또는 지원되는 다른 모델 제공자)를 손쉽게 사용할 수 있습니다. 자세한 내용은 model providers 문서를 참고하세요.