CI/CD 및 자동화
읽는 시간: 12분 | 난이도: 고급
이 섹션에서는 CI/CD 파이프라인에 Claude Code를 통합하는 방법을 알아봅니다.
CI/CD에서의 Claude Code
Claude Code를 CI/CD 파이프라인에 통합하여 다음 작업을 자동화할 수 있습니다:
- 코드 리뷰: PR 자동 리뷰
- 테스트 분석: 실패한 테스트 원인 분석
- 문서 생성: 자동으로 CHANGELOG 작성
- 배포 검증: 배포 전 체크리스트 실행
GitHub Actions
기본 설정
# .github/workflows/claude-review.yml
name: Claude Code Review
on:
pull_request:
types: [opened, synchronize]
permissions:
contents: read
pull-requests: write
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Claude Code
run: |
curl -fsSL https://claude.ai/download/claude-code | bash
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Configure Claude
run: |
mkdir -p ~/.claude
echo '${{ secrets.ANTHROPIC_API_KEY }}' > ~/.claude/api_key
- name: Run Claude Review
run: |
claude --non-interactive --prompt "PR을 리뷰하고 변경사항을 분석해줘" > review.txt
- name: Comment PR
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const review = fs.readFileSync('review.txt', 'utf8');
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: review
});
테스트 실패 분석
# .github/workflows/test-analysis.yml
name: Test Analysis
on:
workflow_run:
workflows: ["Tests"]
types:
- completed
jobs:
analyze-failures:
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download Test Results
uses: dawidd6/action-download-artifact@v2
with:
workflow: Tests.yml
name: test-results
- name: Analyze with Claude
run: |
claude --non-interactive \
--prompt "테스트 실패 원인을 분석하고 해결 방법을 제안해줘" \
--file test-results.xml \
> analysis.txt
- name: Create Issue
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const analysis = fs.readFileSync('analysis.txt', 'utf8');
github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: '테스트 실패 분석',
body: analysis
});
자동 문서 생성
# .github/workflows/auto-docs.yml
name: Auto Documentation
on:
push:
branches: [main]
jobs:
generate-docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Generate CHANGELOG
run: |
claude --non-interactive \
--prompt "마지막 태그 이후의 커밋을 바탕으로 CHANGELOG 항목을 생성해줘" \
> CHANGELOG_NEW.md
- name: Update README
run: |
claude --non-interactive \
--prompt "현재 프로젝트 구조를 분석하고 README를 업데이트해줘" \
--file README.md
- name: Commit Changes
run: |
git config user.name 'Claude Code Bot'
git config user.email 'claude-bot@example.com'
git add CHANGELOG.md README.md
git commit -m "docs: 자동 문서 업데이트" || exit 0
git push
GitLab CI
기본 설정
# .gitlab-ci.yml
stages:
- review
- analyze
claude_review:
stage: review
image: node:20
before_script:
- npm install -g @anthropic-ai/claude-code
- echo $ANTHROPIC_API_KEY > ~/.claude/api_key
script:
- claude --non-interactive --prompt "MR을 리뷰해줘" > review.txt
artifacts:
paths:
- review.txt
expire_in: 1 day
test_analysis:
stage: analyze
image: node:20
dependencies:
- claude_review
before_script:
- npm install -g @anthropic-ai/claude-code
- echo $ANTHROPIC_API_KEY > ~/.claude/api_key
script:
- claude --non-interactive --prompt "테스트 실패를 분석해줘" --file review.txt
only:
- merge_requests
Jenkins
Jenkinsfile
pipeline {
agent any
environment {
ANTHROPIC_API_KEY = credentials('anthropic-api-key')
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Claude Review') {
steps {
sh '''
npm install -g @anthropic-ai/claude-code
claude --non-interactive \
--prompt "PR을 리뷰해줘" \
> review.txt
'''
}
}
stage('Comment PR') {
steps {
script {
def review = readFile('review.txt')
// PR에 코멘트 추가 로직
}
}
}
}
}
Docker 컨테이너
Dockerfile
FROM node:20-slim
# Claude Code 설치
RUN npm install -g @anthropic-ai/claude-code
# 작업 디렉토리
WORKDIR /workspace
# API 키 (런타임에 제공)
ENV ANTHROPIC_API_KEY=""
# 기본 명령
CMD ["claude"]
사용
# 빌드
docker build -t claude-code .
# 실행
docker run -it --rm \
-e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \
-v "$PWD:/workspace" \
claude-code \
--prompt "현재 프로젝트를 리뷰해줘"
Kubernetes
CronJob으로 정기 작업
# k8s/cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: claude-code-review
spec:
schedule: "0 9 * * 1-5" # 평일 오전 9시
jobTemplate:
spec:
template:
spec:
containers:
- name: claude
image: claude-code:latest
env:
- name: ANTHROPIC_API_KEY
valueFrom:
secretKeyRef:
name: claude-secrets
key: api-key
command:
- claude
- --non-interactive
- --prompt
- "주간 코드 리뷰를 수행해줘"
restartPolicy: OnFailure
비용 최적화
캐싱 사용
- name: Cache Claude responses
uses: actions/cache@v3
with:
path: ~/.claude/cache
key: claude-${{ hashFiles('**/*.ts', '**/*.js') }}
조건부 실행
- name: Run Claude
if: github.event.pull_request.additions * github.event.pull_request.deletions < 1000
run: |
# 너무 큰 PR은 스킵
claude --non-interactive --prompt "리뷰해줘"
보안 고려사항
API 키 관리
# 좋음: Secrets 사용
- name: Configure Claude
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
# 나쁨: API 키 하드코딩
- name: Configure Claude
run: echo "sk-xxx" > ~/.claude/api_key
권한 최소화
permissions:
contents: read # 읽기만 가능
pull-requests: write # PR 코멘트만 가능
모범 사례
- 논블록킹: 리뷰가 파이프라인을 막지 않게
- 시간 제한: 실행 시간 제한 설정
- 재시용성: 공통 워크플로우 템플릿화
- 모니터링: 실패 시 알림
요약
CI/CD에 Claude Code를 통합하면:
- 자동 코드 리뷰
- 테스트 실패 분석
- 문서 자동 생성
- 배포 전 검증
이 섹션이 도움이 되셨나요?
