Claude Code로 개발 워크플로를 자동화하는 실전 가이드
Claude Code로 Issue 정리, PR 리뷰, 정기 점검, 로그, 재시도, 승인 지점을 안전하게 자동화합니다.
Claude Code 워크플로 자동화는 에이전트에게 모든 권한을 주고 알아서 머지하게 만드는 일이 아닙니다. 실무에서 안정적인 방식은 반복되고 검증 가능한 작업을 작게 맡기는 것입니다. Issue를 요약하고, 작은 수정안을 만들고, PR을 리뷰하고, 정기 점검 보고서를 만들되, 제품 판단이나 릴리스 판단이 필요한 지점에서는 사람에게 멈춰야 합니다.
이 글은 gh, git, node, npm, claude 명령으로 바로 실행할 수 있는 예제를 다룹니다. 핵심은 자동화를 “에이전트의 발판”처럼 다루는 것입니다. 입력, 허용 도구, 로그, 재시도, 롤백, 사람의 승인 지점을 먼저 정하면 Claude Code는 위험한 무인 작업자가 아니라 반복 업무를 줄이는 보조자가 됩니다.
자동화 경계를 먼저 정하기
| 단계 | Claude Code가 맡을 일 | 사람이 남겨야 할 결정 |
|---|---|---|
| 분류 | Issue, diff, 실패 로그 요약 | 우선순위와 제품 판단 |
| 변경 | 작은 수정, 테스트 추가, 문서 업데이트 | 범위 변경과 릴리스 판단 |
| 리뷰 | 버그, 보안 위험, 누락 테스트 지적 | 어떤 지적을 반영할지 |
| 운영 | 정기 점검, 오래된 TODO, 의존성 확인 | 머지, 삭제, 배포, 과금 영향 |
flowchart LR
A["Issue / PR"] --> B["작은 프롬프트"]
B --> C["Claude Code"]
C --> D["diff와 로그"]
D --> E["테스트"]
E --> F["사람 승인"]
F --> G["PR / 릴리스"]
전체 CI/CD 흐름은 Claude Code CI/CD 구축 가이드와 Claude Code Hooks 가이드를 함께 보면 정리하기 쉽습니다.
사용 사례 1: Issue에서 안전한 작업 브랜치 만들기
아래 스크립트는 GitHub Issue를 읽고, 고정된 브랜치를 만들거나 다시 사용한 뒤, Claude Code에 최소 변경을 요청합니다. 테스트까지 실행하지만 commit은 사람이 직접 합니다.
scripts/claude-issue-work.sh로 저장합니다.
#!/usr/bin/env bash
set -euo pipefail
ISSUE_NUMBER="${1:-}"
if [ -z "$ISSUE_NUMBER" ]; then
echo "Usage: ./scripts/claude-issue-work.sh <issue-number>"
exit 1
fi
for command_name in git gh claude npm; do
if ! command -v "$command_name" >/dev/null 2>&1; then
echo "Missing command: $command_name"
exit 1
fi
done
: "${ANTHROPIC_API_KEY:?Set ANTHROPIC_API_KEY before running this script}"
mkdir -p .claude-logs
ISSUE_FILE=".claude-logs/issue-${ISSUE_NUMBER}.md"
LOG_FILE=".claude-logs/issue-${ISSUE_NUMBER}-$(date +%Y%m%d-%H%M%S).log"
BRANCH="claude/issue-${ISSUE_NUMBER}"
gh issue view "$ISSUE_NUMBER" --json title,body,labels --jq '
"# " + .title + "\n\n" + (.body // "") + "\n\nLabels: " + ([.labels[].name] | join(", "))
' > "$ISSUE_FILE"
if git show-ref --verify --quiet "refs/heads/$BRANCH"; then
git switch "$BRANCH"
else
git switch -c "$BRANCH"
fi
PROMPT=$(cat <<PROMPT
당신은 이 저장소의 개발 보조자입니다.
아래 Issue를 읽고 가장 작은 유용한 변경만 적용하세요.
제약:
- 먼저 관련 파일을 조사한 뒤 수정하세요.
- 기존 구조, 이름, 테스트 스타일을 우선하세요.
- 요구사항이 모호하면 큰 설계를 추측하지 말고 TODO나 질문을 남기세요.
- 비밀 정보, 환경 파일, 관련 없는 글은 건드리지 마세요.
- 수정 후 npm test를 실행할 수 있는 상태로 두세요.
- commit, push, PR 생성, merge는 하지 마세요.
Issue:
$(cat "$ISSUE_FILE")
PROMPT
)
claude -p "$PROMPT" \
--max-turns 8 \
--permission-mode acceptEdits \
--output-format text 2>&1 | tee "$LOG_FILE"
npm test 2>&1 | tee -a "$LOG_FILE"
git diff --stat | tee -a "$LOG_FILE"
echo "Review the diff, then commit manually if it is correct."
echo "Log: $LOG_FILE"
안전장치는 단순하지만 효과가 큽니다. ANTHROPIC_API_KEY가 없으면 시작 단계에서 멈춥니다. 브랜치 이름이 고정되어 있어 재실행해도 중복 브랜치가 생기지 않습니다. .claude-logs에 요청과 테스트 결과가 남기 때문에 다음 날에도 원인을 추적할 수 있습니다.
사용 사례 2: GitHub Actions에 PR 리뷰 게이트 넣기
공식 Claude Code GitHub Action은 PR 이벤트에서 실행할 수 있습니다. 아래 워크플로는 리뷰만 요청하며 코드 수정, push, merge를 금지합니다.
.github/workflows/claude-review.yml로 저장합니다.
name: Claude Review Gate
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
contents: read
pull-requests: write
issues: write
concurrency:
group: claude-review-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: |
이 Pull Request를 리뷰하세요.
버그, 보안, 테스트 부족, 하위 호환성, 운영 로그를 중점적으로 보세요.
각 지적에는 high / medium / low 심각도를 붙이고 수정 제안을 구체적으로 쓰세요.
코드를 수정하거나 push 또는 merge하지 마세요.
claude_args: |
--max-turns 6
--permission-mode plan
권한은 좁게 유지하세요. 리뷰만 한다면 보통 contents: read와 pull-requests: write가 중심입니다. Issue에도 댓글을 남기는 운영이라면 issues: write를 추가합니다.
오래된 예제를 복사하기 전에 Claude Code CLI 공식 참고서, Claude Code GitHub Actions 공식 문서, GitHub Actions 워크플로 문법을 확인하세요. 예전 @beta나 direct_prompt 예제는 현재의 @v1과 prompt 형식으로 바꿔야 합니다.
사용 사례 3: Node.js로 정기 점검 보고서 만들기
정기 점검은 파일을 바꾸지 않아도 가치가 있습니다. 실패한 테스트, 큰 diff, 오래된 TODO, 부족한 로그, 롤백 위험을 매일 또는 매주 요약하는 것만으로도 재작업을 줄일 수 있습니다.
scripts/claude-maintenance.mjs로 저장합니다.
#!/usr/bin/env node
import { spawnSync } from "node:child_process";
import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
import { join } from "node:path";
const logDir = ".claude-logs";
const lockFile = join(logDir, "maintenance.lock");
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
const logFile = join(logDir, `maintenance-${stamp}.log`);
function fail(message) {
console.error(message);
process.exit(1);
}
function run(command, args, options = {}) {
const result = spawnSync(command, args, {
encoding: "utf8",
shell: process.platform === "win32",
...options,
});
const output = `${result.stdout || ""}${result.stderr || ""}`;
if (result.status !== 0) {
writeFileSync(logFile, output);
fail(`Command failed: ${command} ${args.join(" ")}. See ${logFile}`);
}
return output;
}
if (!process.env.ANTHROPIC_API_KEY) {
fail("Set ANTHROPIC_API_KEY before running this script.");
}
mkdirSync(logDir, { recursive: true });
if (existsSync(lockFile)) {
fail(`Another maintenance run is active: ${lockFile}`);
}
writeFileSync(lockFile, String(process.pid));
try {
const status = run("git", ["status", "--short"]);
const tests = run("npm", ["test", "--", "--runInBand"]);
const prompt = [
"당신은 이 저장소의 유지보수 리뷰어입니다.",
"git status와 테스트 출력을 읽고 오늘 확인할 위험을 요약하세요.",
"어떤 파일도 수정, 삭제, commit, push하지 마세요.",
"credentials / idempotency / retry / rollback / logs / human approval 기준으로 묶어 주세요.",
"",
"git status:",
status || "(clean)",
"",
"test output:",
tests.slice(-12000),
].join("\n");
const review = run("claude", [
"-p",
prompt,
"--max-turns",
"5",
"--permission-mode",
"plan",
"--output-format",
"text",
]);
writeFileSync(logFile, review);
console.log(`Maintenance report written to ${logFile}`);
} finally {
rmSync(lockFile, { force: true });
}
Jest가 아니라면 npm test -- --runInBand를 프로젝트의 테스트 명령으로 바꾸세요. 테스트 로그 전체를 넘기지 않고 마지막 12000자만 전달하는 이유는 프롬프트가 너무 길어질 때 중요한 실패 줄이 묻히기 때문입니다.
사용 사례 4: cron 또는 작업 스케줄러로 실행하기
Linux와 macOS는 cron을 쓰고, Windows는 작업 스케줄러를 쓰면 됩니다. GitHub Actions schedule도 가능하지만 로컬 데이터베이스, VPN, 내부 자격 증명이 필요하다면 로컬 실행이 더 현실적입니다.
# 평일 08:15에 실행
15 8 * * 1-5 cd /path/to/repo && /usr/bin/node scripts/claude-maintenance.mjs >> .claude-logs/cron.log 2>&1
# 매일 실행되는 Windows 작업 등록
schtasks /Create /TN "ClaudeMaintenance" /SC DAILY /ST 08:15 /F /TR "powershell -NoProfile -ExecutionPolicy Bypass -Command \"cd C:\path\to\repo; node scripts\claude-maintenance.mjs\""
정기 실행에서는 멱등성이 중요합니다. 같은 작업을 두 번 실행해도 중복 PR, 중복 댓글, 중복 브랜치가 생기지 않아야 합니다. 잠금 파일, 고정 브랜치 이름, 기존 PR 확인, 로그 저장을 넣어 두세요.
사용 사례 5: 사람 승인 지점을 프롬프트에 쓰기
짧은 프롬프트가 항상 안전한 것은 아닙니다. 좋은 워크플로 프롬프트는 허용, 금지, 승인 필요 조건을 명확히 말합니다.
claude -p "
목표:
PR #123의 리뷰 의견을 반영한다.
허용:
- 관련 구현 파일과 테스트 파일 수정
- npm test 실행
- 실패 로그 요약
금지:
- git push
- gh pr merge
- .env 또는 비밀 정보 표시
- 관련 없는 리팩터링
사람 승인이 필요한 경우:
- API 응답 호환성을 바꾸는 경우
- 데이터베이스 마이그레이션을 추가하는 경우
- 기존 테스트를 삭제하는 경우
마지막 보고:
- 변경 파일
- 실행한 테스트
- 남은 위험
- 롤백 방법
" --max-turns 6 --permission-mode acceptEdits
리뷰 형식을 정리하려면 Claude Code 리뷰 체크리스트와 검증 기록 워크플로를 참고하세요.
미리 설계해야 할 실패 모드
| 실패 모드 | 어떤 일이 생기는가 | 실전 대책 |
|---|---|---|
| 프롬프트가 너무 김 | 제약이 묻히고 실행이 느려짐 | 관련 파일과 로그 끝부분만 전달 |
| 자격 증명 없음 | CI가 ANTHROPIC_API_KEY 또는 GH_TOKEN에서 실패 | 시작 시 환경 변수 검사 |
| 멱등성 없음 | 중복 PR, 댓글, 브랜치 생성 | 고정 이름, 잠금, 상태 확인 |
| 로그 없음 | 에이전트가 무엇을 했는지 추적 불가 | .claude-logs나 GitHub artifacts 저장 |
| 재시도 설계 부족 | 일시 오류가 중복 쓰기로 이어짐 | 읽기만 재시도하고 쓰기 전 상태 재확인 |
| 롤백 불가 | 큰 commit 하나를 되돌리기 어려움 | 작은 PR과 롤백 메모 요구 |
| 승인 게이트 없음 | 에이전트가 제품 또는 릴리스 결정을 함 | 호환성, 데이터, 과금, 삭제, merge는 사람 승인 |
관련 안전 주제는 Claude Code 보안 감사, Claude Code 테스트 전략, Git 워크플로 자동화에서 더 볼 수 있습니다.
수익화 CTA와 AdSense 주의점
이 주제의 자연스러운 전환은 과장된 약속이 아니라 실무 지원입니다. 혼자 시작한다면 Claude Code 무료 치트시트로 기본 명령과 안전 습관을 잡으세요. 팀 저장소에 맞춘 프롬프트, 리뷰 게이트, 승인 정책, 도입 교육이 필요하다면 Claude Code 교육 및 상담을 참고하세요. 바로 쓸 수 있는 설정 자료가 필요하면 Claude Code 설정 가이드를 선택할 수 있습니다.
광고와 CTA는 명령 순서 중간에 끼워 넣지 않는 것이 좋습니다. AdSense 품질 관점에서도 실행 가능한 코드, 실제 실패 모드, 공식 링크, 내부 링크, 직접 검증 결과가 있는 글이 단순 요약보다 안전합니다.
정리
Claude Code 워크플로 자동화는 멈출 지점을 먼저 설계할 때 안정됩니다. Issue 분류와 PR 리뷰에서 시작하고, 그다음 작은 수정, 마지막으로 정기 점검과 사람 승인 조건이 있는 CI 게이트로 넓히는 순서가 현실적입니다.
Masa가 실제로 테스트했을 때 가장 큰 효과는 PR 완전 자동 생성이 아니라 반복 가능한 Issue 로그와 고정 PR 리뷰 프롬프트였습니다. ANTHROPIC_API_KEY 누락, 너무 긴 테스트 출력, 같은 브랜치 재실행에서 각각 한 번씩 막혔지만, 환경 변수 검사, 로그 끝부분만 전달하기, 결정적 브랜치 이름을 넣은 뒤에는 다음 실행의 원인 파악이 훨씬 쉬워졌습니다.
무료 PDF: Claude Code 치트시트
이메일을 입력하면 명령, 리뷰 습관, 안전한 워크플로를 정리한 PDF를 받을 수 있습니다.
개인정보를 안전하게 관리하며 스팸을 보내지 않습니다.
작성자 소개
Masa
Claude Code 실무 워크플로와 팀 도입을 검증하는 엔지니어입니다.
관련 글
Obsidian 메모를 CLAUDE.md로 바꾸는 Claude Code 워크플로
Obsidian 작업 메모를 CLAUDE.md 운영 노트로 정리해 Claude Code 세션의 문맥 반복을 줄입니다.
Claude Code Revenue CTA Routing: 글에서 PDF, Gumroad, 상담으로 보내기
독자 의도에 따라 무료 PDF, Gumroad 상품, 상담으로 나누는 Claude Code CTA 설계입니다.
Claude Code 팀 인계 규칙: 리뷰 증거, 권한, 롤백, 수익 경로까지 넘기는 법
Claude Code 작업을 팀에 넘길 때 필요한 증거, 권한 규칙, 롤백, 무료 PDF, Gumroad, 상담 경로 체크리스트.