가이드

CI/CD 통합: AI 지원 워크플로우 자동화

자동화된 코드 리뷰, 테스트 생성 및 문서 업데이트를 위해 CCJK를 CI/CD 파이프라인에 통합하세요.

C
CCJK Team
2025년 1월 3일14 분 소요1,085 회 조회
CI/CD 통합: AI 지원 워크플로우 자동화

CI/CD 통합: AI 지원 워크플로우 자동화

AI 지원을 CI/CD 파이프라인에 통합하면 강력한 자동화 기능이 잠금 해제됩니다. 자동화된 코드 리뷰부터 지능형 테스트 생성까지 CCJK는 개발 워크플로우의 모든 단계를 향상시킬 수 있습니다.

개요

무엇을 자동화할 수 있나요?

단계AI 기능
프리커밋코드 포맷팅, 린팅 제안
Pull Request자동화된 코드 리뷰, 보안 스캔
빌드문서 생성
테스트테스트 커버리지 분석, 테스트 생성
배포릴리스 노트, 변경 로그 생성

GitHub Actions 통합

기본 설정

워크플로우 파일을 생성하세요:

# .github/workflows/ai-review.yml
name: AI 코드 리뷰

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  ai-review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Node.js 설정
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: CCJK 설치
        run: npm install -g ccjk

      - name: AI 리뷰 실행
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          ccjk review --ci --output github-pr

고급 리뷰 워크플로우

# .github/workflows/comprehensive-review.yml
name: 포괄적인 AI 리뷰

on:
  pull_request:
    types: [opened, synchronize, ready_for_review]

jobs:
  code-review:
    runs-on: ubuntu-latest
    if: github.event.pull_request.draft == false
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: 설정
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - run: npm ci
      - run: npm install -g ccjk

      - name: 코드 품질 리뷰
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          ccjk review \
            --focus quality \
            --severity-threshold minor \
            --output review-quality.md

      - name: 보안 리뷰
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          ccjk review \
            --focus security \
            --severity-threshold critical \
            --output review-security.md

      - name: 성능 리뷰
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          ccjk review \
            --focus performance \
            --output review-performance.md

      - name: 리뷰 코멘트 게시
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const reviews = [
              'review-quality.md',
              'review-security.md',
              'review-performance.md'
            ];

            let body = '## AI 코드 리뷰 요약\n\n';
            for (const file of reviews) {
              if (fs.existsSync(file)) {
                body += fs.readFileSync(file, 'utf8') + '\n\n';
              }
            }

            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              body: body
            });

자동화된 테스트 생성

새 코드에 대해

# .github/workflows/test-generation.yml
name: AI 테스트 생성

on:
  pull_request:
    paths:
      - 'src/**/*.ts'
      - 'src/**/*.tsx'

jobs:
  generate-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: 설정
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - run: npm ci
      - run: npm install -g ccjk

      - name: 변경된 파일 식별
        id: changed
        run: |
          FILES=$(git diff --name-only origin/main...HEAD | grep -E '\.(ts|tsx)$' | grep -v '\.test\.' | tr '\n' ' ')
          echo "files=$FILES" >> $GITHUB_OUTPUT

      - name: 테스트 생성
        if: steps.changed.outputs.files != ''
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          for file in ${{ steps.changed.outputs.files }}; do
            ccjk test generate "$file" --output "${file%.ts}.test.ts"
          done

      - name: 생성된 테스트 실행
        run: npm test -- --passWithNoTests

      - name: 테스트로 PR 생성
        uses: peter-evans/create-pull-request@v5
        with:
          title: "test: AI 생성 테스트 추가"
          body: "새 코드에 대한 자동화된 테스트 생성"
          branch: ai-tests-${{ github.event.pull_request.number }}

문서 자동화

API 문서 자동 생성

# .github/workflows/docs-generation.yml
name: 문서 생성

on:
  push:
    branches: [main]
    paths:
      - 'src/api/**'

jobs:
  generate-docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: 설정
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - run: npm ci
      - run: npm install -g ccjk

      - name: API 문서 생성
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          ccjk docs generate \
            --input src/api/ \
            --output docs/api/ \
            --format markdown

      - name: OpenAPI 스펙 생성
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          ccjk docs openapi \
            --input src/api/ \
            --output docs/openapi.yaml

      - name: 문서 커밋
        uses: stefanzweifel/git-auto-commit-action@v5
        with:
          commit_message: "docs: API 문서 업데이트"
          file_pattern: "docs/**"

변경 로그 생성

# .github/workflows/changelog.yml
name: 변경 로그 생성

on:
  release:
    types: [created]

jobs:
  changelog:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: 설정
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - run: npm install -g ccjk

      - name: 변경 로그 생성
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          PREV_TAG=$(git describe --tags --abbrev=0 HEAD^)
          ccjk changelog generate \
            --from $PREV_TAG \
            --to ${{ github.ref_name }} \
            --output CHANGELOG_ENTRY.md

      - name: 릴리스 노트 업데이트
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const changelog = fs.readFileSync('CHANGELOG_ENTRY.md', 'utf8');

            await github.rest.repos.updateRelease({
              owner: context.repo.owner,
              repo: context.repo.repo,
              release_id: ${{ github.event.release.id }},
              body: changelog
            });

GitLab CI 통합

# .gitlab-ci.yml
stages:
  - review
  - test
  - docs

variables:
  ANTHROPIC_API_KEY: $ANTHROPIC_API_KEY

ai-review:
  stage: review
  image: node:20
  script:
    - npm install -g ccjk
    - ccjk review --ci --output gitlab-mr
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"

ai-test-coverage:
  stage: test
  image: node:20
  script:
    - npm ci
    - npm install -g ccjk
    - npm test -- --coverage
    - ccjk analyze coverage --input coverage/lcov.info --suggest-tests
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage/cobertura-coverage.xml

ai-docs:
  stage: docs
  image: node:20
  script:
    - npm install -g ccjk
    - ccjk docs generate --input src/ --output public/docs/
  artifacts:
    paths:
      - public/docs/
  rules:
    - if: $CI_COMMIT_BRANCH == "main"

프리커밋 훅

Husky로 설정

# husky 설치
npm install -D husky
npx husky init
# .husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

# AI 지원 프리커밋 검사 실행
npx ccjk precommit --staged-only

프리커밋 구성

# .claude/precommit.yaml
checks:
  - name: "코드 품질"
    command: ccjk lint --fix
    on: ["*.ts", "*.tsx", "*.js", "*.jsx"]

  - name: "보안 스캔"
    command: ccjk security --quick
    on: ["*.ts", "*.tsx"]
    block: true  # 문제가 발견되면 커밋 차단

  - name: "커밋 메시지"
    command: ccjk commit --validate
    on: commit-msg

모범 사례

1. 속도 제한

과도한 API 호출 방지:

# 중요한 변경에만 실행
on:
  pull_request:
    paths:
      - 'src/**'
      - '!src/**/*.test.*'
      - '!src/**/*.spec.*'
      - '!**/*.md'

2. 캐싱

적절한 경우 AI 응답 캐시:

- name: AI 응답 캐시
  uses: actions/cache@v3
  with:
    path: .ccjk-cache
    key: ccjk-${{ hashFiles('src/**') }}

3. 비용 관리

지출 한도 설정:

- name: AI 리뷰
  env:
    CCJK_MAX_TOKENS: 10000
    CCJK_MAX_COST: 0.50
  run: ccjk review --ci

4. 폴백 처리

API 실패를 우아하게 처리:

- name: AI 리뷰
  continue-on-error: true
  id: ai-review
  run: ccjk review --ci

- name: 폴백 알림
  if: steps.ai-review.outcome == 'failure'
  run: echo "AI 리뷰를 사용할 수 없습니다. 수동 리뷰가 필요합니다"

보안 고려 사항

비밀 관리

# GitHub secrets 사용
env:
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

# 비밀을 절대 로깅하지 마세요
- name: 리뷰
  run: |
    ccjk review --ci 2>&1 | grep -v "API"

코드 프라이버시

AI로 전송되는 내용 구성:

# .claude/ci-config.yaml
privacy:
  exclude:
    - "**/*.env*"
    - "**/secrets/**"
    - "**/credentials/**"

  redact:
    - pattern: "api[_-]?key"
      replacement: "[REDACTED]"
    - pattern: "password"
      replacement: "[REDACTED]"

모니터링 및 메트릭

AI CI 성능 추적

- name: 메트릭 기록
  run: |
    echo "review_duration=${{ steps.review.outputs.duration }}" >> metrics.txt
    echo "issues_found=${{ steps.review.outputs.issues }}" >> metrics.txt
    echo "tokens_used=${{ steps.review.outputs.tokens }}" >> metrics.txt

- name: 모니터링으로 전송
  run: |
    curl -X POST ${{ secrets.METRICS_ENDPOINT }} \
      -d @metrics.txt

결론

CI/CD 통합은 AI 지원을 개발자 도구에서 팀 전체 품질 게이트로 변환합니다. 간단한 리뷰 자동화로 시작한 다음 점차 더 정교한 워크플로우를 추가하세요.

주요 이점:

  • 모든 PR에서 일관된 코드 품질
  • 수동 리뷰 부담 감소
  • 더 빠른 피드백 루프
  • 자동화된 문서화

다음: 원활한 개발 경험을 위한 VS Code 통합에 대해 알아보세요.

태그

#cicd#automation#github-actions#devops#pipeline

이 아티클 공유

관련 아티클