GitHub Actions에서 Claude Code를 사용하는 방법 (2026)
CI/CD 환경에서 AI 기반 코드 리뷰 및 생성 자동화하기
Hypereal로 구축 시작하기
단일 API를 통해 Kling, Flux, Sora, Veo 등에 액세스하세요. 무료 크레딧으로 시작하고 수백만으로 확장하세요.
신용카드 불필요 • 10만 명 이상의 개발자 • 엔터프라이즈 지원
GitHub Actions에서 Claude Code를 사용하는 방법 (2026)
Claude Code는 Claude를 터미널과 코드베이스로 직접 가져오는 Anthropic의 CLI 도구입니다. 이를 GitHub Actions에 통합하면 AI 기반 코드 리뷰 자동화, PR 요약 생성, 자동 리팩토링 실행, CI/CD 파이프라인에 지능형 품질 검사 추가 등을 수행할 수 있습니다. 이 가이드에서는 이를 설정하는 단계를 차근차근 보여줍니다.
CI/CD에서 Claude Code로 무엇을 할 수 있나요?
GitHub Actions에서 Claude Code를 활용하는 가장 실용적인 사례는 다음과 같습니다:
| 유즈 케이스 | 설명 | 트리거 |
|---|---|---|
| PR 코드 리뷰 | 제안 사항이 포함된 자동 리뷰 | Pull request open/updated |
| PR 요약 | diff를 사용하여 설명 생성 | Pull request open |
| 버그 탐지 | 변경된 파일에서 일반적인 버그 스캔 | Pull request, push |
| 문서화 | 새 함수에 대한 문서 자동 생성 | Pull request |
| 테스트 생성 | 변경된 코드에 대한 테스트 케이스 생성 | Pull request |
| 마이그레이션 지원 | 종속성 변경 시 업데이트 제안 | 일정 예약(Scheduled), 수동 |
사전 요구 사항
- GitHub 리포지토리
- Anthropic API key (console.anthropic.com에서 발급)
- GitHub Actions YAML 구문에 대한 기본적인 이해
1단계: API Key를 Secret으로 저장하기
워크플로우 파일에 API 키를 절대 하드코딩하지 마세요. Anthropic API 키를 GitHub 리포지토리 secret으로 추가합니다:
1. GitHub 리포지토리로 이동합니다.
2. Settings > Secrets and variables > Actions를 클릭합니다.
3. "New repository secret"을 클릭합니다.
4. Name: ANTHROPIC_API_KEY
5. Value: sk-ant-xxxxx (본인의 키)
6. "Add secret"을 클릭합니다.
2단계: 기본 Claude Code 워크플로우
.github/workflows/claude-review.yml 위치에 워크플로우 파일을 생성합니다:
name: Claude Code Review
on:
pull_request:
types: [opened, synchronize]
permissions:
contents: read
pull-requests: write
jobs:
claude-review:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # diff를 위한 전체 히스토리
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code
- name: Get PR diff
id: diff
run: |
git diff origin/${{ github.base_ref }}...HEAD > pr_diff.txt
echo "diff_size=$(wc -c < pr_diff.txt)" >> $GITHUB_OUTPUT
- name: Run Claude Code Review
if: steps.diff.outputs.diff_size > 0
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
claude -p --output-format text "$(cat <<'PROMPT'
Review the following pull request diff. Focus on:
1. Potential bugs or logic errors
2. Security concerns
3. Performance issues
4. Code style and readability
Be concise. Only mention real issues, not style nitpicks.
Format your response as a markdown list.
Diff:
$(cat pr_diff.txt)
PROMPT
)" > review_output.md
- name: Post review comment
if: steps.diff.outputs.diff_size > 0
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const review = fs.readFileSync('review_output.md', 'utf8');
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `## Claude Code Review\n\n${review}\n\n---\n*Automated review by Claude Code*`
});
3단계: PR 요약 생성기
코드 변경 사항으로부터 PR 설명을 자동으로 생성합니다:
name: Claude PR Summary
on:
pull_request:
types: [opened]
permissions:
contents: read
pull-requests: write
jobs:
generate-summary:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code
- name: Generate PR summary
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
# Get the diff
DIFF=$(git diff origin/${{ github.base_ref }}...HEAD)
# Get commit messages
COMMITS=$(git log origin/${{ github.base_ref }}...HEAD --oneline)
claude -p --output-format text "$(cat <<PROMPT
Generate a pull request summary based on these changes.
Format:
## Summary
(2-3 sentences describing what this PR does)
## Changes
(Bulleted list of key changes)
## Testing
(Suggested testing steps)
Commits:
$COMMITS
Diff:
$DIFF
PROMPT
)" > summary.md
- name: Update PR description
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const summary = fs.readFileSync('summary.md', 'utf8');
await github.rest.pulls.update({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number,
body: summary
});
4단계: 자동 테스트 생성
새로 추가되거나 수정된 파일에 대한 테스트를 생성합니다:
name: Claude Test Generator
on:
pull_request:
types: [opened, synchronize]
paths:
- "src/**/*.ts"
- "src/**/*.js"
- "!src/**/*.test.*"
- "!src/**/*.spec.*"
permissions:
contents: write
pull-requests: write
jobs:
generate-tests:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.head_ref }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
- name: Install dependencies
run: |
npm ci
npm install -g @anthropic-ai/claude-code
- name: Find changed files without tests
id: changed
run: |
FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD \
| grep -E '^src/.*\.(ts|js)$' \
| grep -v -E '\.(test|spec)\.' \
| head -5)
echo "files=$FILES" >> $GITHUB_OUTPUT
- name: Generate tests with Claude
if: steps.changed.outputs.files != ''
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
for FILE in ${{ steps.changed.outputs.files }}; do
TEST_FILE="${FILE%.ts}.test.ts"
if [ ! -f "$TEST_FILE" ]; then
echo "Generating tests for $FILE..."
claude -p --output-format text \
"Read the file $FILE and generate comprehensive unit tests for it. \
Use the existing test framework in this project. \
Output only the test file content, no explanations." \
> "$TEST_FILE"
fi
done
- name: Commit generated tests
run: |
git config user.name "claude-code[bot]"
git config user.email "claude-code[bot]@users.noreply.github.com"
git add "src/**/*.test.ts"
git diff --staged --quiet || git commit -m "test: add AI-generated tests for changed files"
git push
5단계: 보안 스캔 워크플로우
Claude를 사용하여 코드 변경 사항의 보안 문제를 식별합니다:
name: Claude Security Scan
on:
pull_request:
types: [opened, synchronize]
permissions:
contents: read
pull-requests: write
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code
- name: Run security analysis
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
DIFF=$(git diff origin/${{ github.base_ref }}...HEAD)
claude -p --output-format text "$(cat <<PROMPT
Analyze this code diff for security vulnerabilities.
Check for:
- SQL injection
- XSS vulnerabilities
- Hardcoded secrets or credentials
- Insecure deserialization
- Path traversal
- Missing input validation
- Insecure dependencies
If no issues found, respond with "No security issues detected."
If issues found, list each with severity (HIGH/MEDIUM/LOW),
the file and line, and a suggested fix.
Diff:
$DIFF
PROMPT
)" > security_report.md
- name: Post security report
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const report = fs.readFileSync('security_report.md', 'utf8');
if (!report.includes('No security issues detected')) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `## Security Scan Results\n\n${report}\n\n---\n*Scanned by Claude Code*`
});
}
비용 관리
CI/CD에서 Claude Code를 사용하면 API 크레딧이 빠르게 소모될 수 있습니다. 다음은 비용을 제어하기 위한 전략입니다:
| 전략 | 구현 방법 |
|---|---|
| diff 크기 제한 | 10,000줄 이상의 diff 자르기 |
| Draft PR 건너뛰기 | if: github.event.pull_request.draft == false 추가 |
| 파일 유형별 필터링 | 트리거에 paths 필터 사용 |
| 캐싱 사용 | Claude Code의 npm install 캐싱 |
| 속도 제한 | 모든 push가 아닌 최신 커밋에서만 실행 |
--max-turns 1 사용 |
멀티 턴 에이전트 루프 방지 |
Diff 크기 가드
- name: Check diff size
id: size_check
run: |
DIFF_LINES=$(git diff origin/${{ github.base_ref }}...HEAD | wc -l)
if [ "$DIFF_LINES" -gt 5000 ]; then
echo "skip=true" >> $GITHUB_OUTPUT
echo "Diff too large ($DIFF_LINES lines), skipping AI review"
else
echo "skip=false" >> $GITHUB_OUTPUT
fi
- name: Run Claude review
if: steps.size_check.outputs.skip == 'false'
# ... 나머지 단계
트러블슈팅
| 문제 | 원인 | 해결책 |
|---|---|---|
| "API key not found" | Secret이 설정되지 않음 | 리포지토리 secret에 ANTHROPIC_API_KEY 추가 |
| 워크플로우 타임아웃 | 대규모 diff 또는 느린 응답 | Job에 timeout-minutes: 10 추가 |
| 리뷰 출력이 비어 있음 | diff가 컨텍스트에 비해 너무 큼 | diff를 자르거나 특정 파일만 리뷰 |
| PR 코멘트 권한 거부 | 권한 부족 | permissions에 pull-requests: write 추가 |
| Claude Code를 찾을 수 없음 | 설치 실패 | npm 버전 고정: npm install -g @anthropic-ai/claude-code@latest |
베스트 프랙티스
- 타임아웃 설정. 워크플로우가 무한정 실행되는 것을 방지하기 위해
timeout-minutes: 10을 추가하세요. --print모드 사용. 대화형 프롬프트를 피하기 위해 CI에서는 항상claude -p를 사용하세요.- 컨텍스트 제한. 전체 코드베이스가 아닌 diff와 관련 파일만 전송하세요.
- 실패에 유연하게 대처. AI 리뷰가 머지를 차단하지 않도록
continue-on-error: true를 사용하세요. - AI 출력 검토. Claude의 의견을 절대적인 판결이 아닌 제안으로 취급하세요.
- 버전 고정. 재현 가능한 빌드를 위해 Claude Code 및 action 버전을 고정하세요.
결론
Claude Code를 GitHub Actions에 통합하면 CI/CD 파이프라인에 지능적인 레이어를 추가할 수 있습니다. 코드 리뷰, PR 요약, 테스트 생성, 보안 스캔 중 무엇을 위해 사용하든 설정은 간단합니다. Claude Code를 설치하고, diff를 전달하고, 결과를 게시하면 됩니다. 핵심은 트리거 필터링과 diff 크기 제한을 통해 비용을 관리하는 것입니다.
AI로 생성된 미디어(비디오, 이미지, 말하는 아바타 등)를 사용하여 애플리케이션을 개발하는 팀이라면, 자동화된 에셋 생성 및 테스트를 위해 CI/CD 파이프라인에 자연스럽게 통합되는 Hypereal AI의 프로덕션 레디 API를 확인해 보세요.
