Logo
본문으로 이동
고급12분 소요ci-cdautomationgithub-actions

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 코멘트만 가능

모범 사례

  1. 논블록킹: 리뷰가 파이프라인을 막지 않게
  2. 시간 제한: 실행 시간 제한 설정
  3. 재시용성: 공통 워크플로우 템플릿화
  4. 모니터링: 실패 시 알림

요약

CI/CD에 Claude Code를 통합하면:

  • 자동 코드 리뷰
  • 테스트 실패 분석
  • 문서 자동 생성
  • 배포 전 검증

이 섹션이 도움이 되셨나요?

다음으로 가이드의 모든 내용을 마쳤습니다. 이제 레퍼런스를 확인하거나 으로 돌아가세요.

관련 가이드

CI/CD 및 자동화 | Claude Code 가이드 | GodDaeHee | GodDaeHee