본문 바로가기
관심 기술/etc

Github Actions with Claude Code - 준비편

by se-dong 2025. 9. 12.

2025.09.12 - [관심 기술/etc] - Github Actions with Claude Code - 이론편

이전 글에서는 Claude Code 를 Github Actions 에 통합하여 사용하는 새로운 방식의 AI Workflow 를 확인했습니다.

이번엔 실제 테스트를 했던 과정과 해당 테스트를 통해 제가 생각한 점에 대해서 공유하도록 하겠습니다.


테스트 1 - @claude 기본 기능 테스트                    

1. Test 위한 Github Repository 를 생성했습니다. (https://github.com/hippo-an/claude-action-integration-test)

소스 코드는 Gemini 에게 창의력을 발휘하여 애플리케이션을 작성하라고 지시했고 Digital pet 이라는 다마고치와 비슷한 컨셉의 무언가를 소스코드로 제공해주었습니다 😅

해당 소스코드로 간단한 사용에 대해서 테스트를 진행해보도록 하겠습니다.

 

2. @claude 멘션 기능 사용을 위한 워크플로우 추가

# .github/workflows/claude.yml
name: Claude Code

on:
  issues:
    types: [opened, assigned]
  issue_comment:
    types: [created]
  pull_request_review:
    types: [submitted]
  pull_request_review_comment:
    types: [created]

permissions:
  contents: write
  pull-requests: write
  issues: write
  actions: read
  id-token: write

jobs:
  claude:
    if: |
      (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
      (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 1

      - name: Run Claude Code
        id: claude
        uses: anthropics/claude-code-action@beta
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

이 설정에서 눈여겨 보셔야 할 부분은 `anthropic_api_key` 부분입니다. 

저는 라이센스를 별도로 사용하고 있지 않기 때문에 API key 방식을 사용했습니다.

 

3. Repository 에 App 을 추가합니다.

위처럼 워크플로우를 설정하고 워크플로우를 실행하는 경우 claude 가 repository 의 app 에 등록되어 있지 않기 때문에 workflow 가 실패하게 됩니다.

 

https://github.com/apps/claude 로 들어가셔서 claude 를 사용할 repository 를 github app 에 추가합니다. 

 

4. 멘션 기능을 통해 명령을 하고 답변을 기다립니다.

 

해당 명령을 수행하면서 발생한 각종 지표들은 다음과 같습니다.

  • Actions Running 시간 → 1m 30s
  • 토큰 사용 → 약 21.5만 token
  • 토큰 비용 → 약 0.15 $
  • model → claude-sonnet-4-20250514

테스트 2- 자동 pr review 테스트 (#5)                    

1. auto review 를 위한 workflow 를 추가합니다.

name: Claude Auto Review
on:
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  review:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
      id-token: write
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 1

      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          track_progress: true
          prompt: |
            REPO: ${{ github.repository }}
            PR NUMBER: ${{ github.event.pull_request.number }}

            이번에 올라온 PR 에 대해서 다음 사항에 집중하여 리뷰를 진행해줘:
            - 코드 퀄리티와 코드 모범 사례
            - 잠재된 버그 사항 혹은 이슈 사항
            - 보안적으로 위험이 있을 수 있는 부분
            - 성능상 고려 사항
            - 크리티컬한 이슈가 있다면 반드시 지적

            참고: 현재 작업 디렉토리에는 이미 PR 브랜치가 체크아웃되어 있습니다.

            상위 수준 피드백은 `gh pr comment`를 사용하세요.  
            특정 코드 이슈를 강조하려면 `mcp__github_inline_comment__create_inline_comment`를 사용하세요.
            리뷰에 대한 피드백을 적절하게 해당 pr 의 comment 에 추가
            리뷰는 한국어로 작성해줘.
            토큰이 너무 많이 사용되지 않게 내용을 적절하게 조절하고, 중간에 필요하면 내용 압축 및 결과도 간략하고 핵심적인 내용만 포함해.

          claude_args: |
            --allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*)"
            --max-turns 10
            --model claude-3-5-haiku-20241022

여기서 주요하게 볼 수 있는 사항은 다음과 같습니다.

  • track progress: true: claude 의 작업 상황을 확인할 수 있습니다.
  • prompt: claude 가 수행해야할 작업을 명세합니다.
  • max-turns 10: 션당 도구 호출 횟수를 제한하여 무한 루프와 토큰 낭비를 방지합니다.
  • model: claude-3-5-haiku-20241022 로 sonnet model 이 아닌 haiku 모델을 사용하도록 지정
--max-turns 는 세션당 도구 호출 횟수를 제한하여 무한 루프와 토큰 낭비를 방지한다고 합니다.
복잡한 작업에서는 적절한 턴 수를 설정하는게 중요하다고 하네요. (참조)

 

2. pr 을 통해 자동으로 생성되는 comment 를 확인합니다.

해당 명령을 수행하면서 발생한 각종 지표들은 다음과 같습니다.

  • Actions Running 시간 → 1m
  • 토큰 사용 → 약 3만 token
  • 토큰 비용 → 약 0.08 $

테스트 3- 해당 pr 에서 내용 변경 commit + auto review 트리거 (#5)                    

1. 동일한 PR 에 이미지와 같은 comment 를 추가합니다.

이번 코멘트에선 claude 가 직접 코드를 확인하고 수정할 수 있도록 요청했습니다.

 

 

2. Claude 가 작업하는 목록이 나오고 Commit 까지 PR 에 추가되는 걸 확인할 수 있습니다.

 

3. Claude Bot 이 추가한 Commit 에 대해서 Synchronize 액션이 트리거되어 auto review workflow 가 실패한 에러는 다음과 같습니다.

 

위 에러는 claude-code-actions 의 allowed bot 에 대한 옵션으로 해당 옵션에 대한 내용은 다음 URL 에서 확인가능합니다.

https://github.com/anthropics/claude-code-action/pull/117

해당 링크에서는 flexible bot access control 을 할 수 있는 allowed_bot 액션을 추가한 PR 입니다. allowed_bot 은 아래와 같이 사용할 수 있습니다.

  - uses: anthropics/claude-code-action@v1
    with:
      allowed_bots: "claude"  # 추가 내용
      anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

 

4. 해당 설정을 추가하면 Bot 이 수행한 actions 에 대해 성공을 확인할 수 있습니다.

해당 명령을 수행하면서 발생한 각종 지표들은 다음과 같습니다.

  • Actions Running 시간 → 2m 45s
  • 토큰 사용 → 약 52만 token
  • 토큰 비용 → 약 0.46 $
  • Model claude-sonnet-4-20250514 + claude-3-5-haiku-20241022

이번 테스트에선 claude sonnet 4.0 모델을 사용하면서 비용이 늘었습니다.

요청이 전체 코드를 읽고, readme file 을 수정하고, 다시 수정된 코드를 읽고 코드 리뷰를 하는 요청을 연속적으로 수행해서 사용량이 늘었을것으로 생각됩니다. 그리고 전체적으로 토큰의 사용량이 급격하게 증가했습니다.

의문점은 2가지입니다.

  • Claude 3.5 haiku 모델을 사용하라고 명시했는데 sonnet 4.0 모델을 사용한 이유는?
  • 전체 파일 10개 미만의 작은 프로젝트에 이정도 토큰과 비용이 발생하는데 더 큰 프로젝트를 한다면?

테스트 4 - 자동 코드 리뷰 스크립트 수정 (#6)                    

1. 아래 두 가지 내용을 변경한 후 테스트를 진행했습니다.

  • ci 파이프라인의 build, test, image 취약점 스캔 등 추가
  • 해당 결과들을 바탕으로 마지막 step 에 claude 가 코드 리뷰
name: Go CI/CD & Dynamic Claude Review

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

jobs:
  full-review:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
      id-token: write
      security-events: write

    steps:
      - name: 1. Checkout Code
        uses: actions/checkout@v4

      - name: 2. Setup Go Environment
        uses: actions/setup-go@v5
        with:
          go-version: '1.24.5'

      - name: 3. Install dependencies & Build Go Binary
        id: go_build # 스텝의 성공 여부를 확인할 ID 부여
        run: |
          go mod tidy
          CGO_ENABLED=0 GOOS=linux go build -o main .

      - name: 4. Run Go Tests
        id: go_test # 스텝의 성공 여부를 확인할 ID 부여
        run: go test ./...

      - name: 5. Build Docker Image
        run: |
          docker build -t my-go-app:latest .
        # 도커파일이 현재 디렉터리에 있으므로 '.' 사용

      - name: 6. Run Trivy Vulnerability Scan & Capture Output
        id: trivy_scan
        run: |
          # Trivy를 실행하고 결과를 환경 변수로 저장
          echo "TRIVY_REPORT<<EOF" >> $GITHUB_ENV
          docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:latest image my-go-app:latest >> $GITHUB_ENV
          echo "EOF" >> $GITHUB_ENV

      - name: 7. Claude Code Action with Dynamic Results
        uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          track_progress: true
          allowed_bots: "claude"
          prompt: |
            REPO: ${{ github.repository }}
            PR NUMBER: ${{ github.event.pull_request.number }}

            너는 Go 언어 기반의 시니어 백엔드 엔지니어이자 CI/CD 전문가야. 아래의 **실제 CI 파이프라인 실행 결과**를 기반으로 이 PR을 종합적으로 리뷰해줘.

            ### 🚀 **CI 파이프라인 실행 결과 요약**
            - **빌드 상태:** ${{ steps.go_build.outcome }}
            - **테스트 상태:** ${{ steps.go_test.outcome }}
            
            ### 🔐 **빌드된 이미지의 취약점 분석 보고서 (Trivy)**
            - **보고서 내용:**
              ${{ env.TRIVY_REPORT }}

            ---

            **코드 리뷰 지시 사항:**
            - **Go 코드 분석:** Go의 코딩 표준 및 모범 사례(예: 에러 핸들링, 동시성)를 준수하는지 검토해줘.
            - **보안적 관점:** Trivy 보고서에 나타난 취약점을 토대로, 해당 취약점이 코드의 어떤 부분에서 비롯되었는지 추론하고, 코드 레벨에서 해결할 수 있는 방안을 제안해.
            - **종합 의견:** `gh pr comment`를 사용해 전체 리뷰와 최종적인 승인/수정 요청 판단을 한국어로 작성해줘.
            - **세부 지적:** 특정 코드 라인에 대한 수정 제안은 `mcp__github_inline_comment__create_inline_comment`를 사용해 인라인 코멘트로 남겨줘.

          claude_args: |
            --allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*)"
            --max-turns 20
            --model claude-3-5-haiku-20241022

 

2. 기존 작성된 코드에 의도적으로 약간의 잠재적 오류를 포함할 수 있도록 코드 수정하였습니다. 

# gemini-cli 를 로컬에서 실행했습니다.
.github/workflows/claude-auto-review.yml 워크플로우를 테스트하기 위해, 
 제가 프로젝트의 Go 코드 일부를 약간의 잠재적 오류를 포함하도록 수정하겠습니다.

 

3. 해당 코드와 함께 auto review 를 진행 → 버그에 대한 확인 및 보안 취약점에 대한 권장 사항 제안 확인했습니다.

해당 명령을 수행하면서 발생한 각종 지표들은 다음과 같습니다.

  • Actions Running 시간 → 3m 20s
  • 토큰 사용 → 약 45만 token
  • 토큰 비용 → 0.05 $
  • Model  claude-3-5-haiku-20241022 

 

4. 추가적으로 수정이 필요한 사항에 PR mention 기능을 이용하여 수정을 요청합니다.

@claude 너가 댓글에서 제안해준 권장조치에 대해서 조치를 해주고, 이 커밋에 내용을 포함해줘.

 

5. 권장조치 구현 및 commit 완료

해당 명령을 수행하면서 발생한 각종 지표들은 다음과 같습니다.

  • Actions Running 시간 → 2m 30s
  • 토큰 사용 → 약 39만 token
  • 토큰 비용 → 0.25 $
  • Model → claude-3-5-haiku-20241022 + claude-sonnet-4-20250514

테스트 결과 코드를 직접 수정하는 경우 claude sonnet 4.0 모델을 사용하는 듯 합니다. 앞선 테스트 3번에서도 코드의 직접적인 수정을 요청했을 때 claude 3.5 haiku 모델을 지정했음에도 claude 4.0 sonnet 모델을 사용하는 것을 확인했습니다.

이는 내부적인 작동 방식과 연관이 있을것으로 생각되는데, github actions 의 실행 내역을 확인합니다.

prepare stage 에서는 분명 haiku 3.5 모델이 arg 로 넘어가는 것이 확인됩니다.

 

하지만 installation complete 이후 실행되는 내용을 chat 의 system init 단계부터 claude sonnet 4.0 모델을 사용하는 것을 확인할 수 있습니다.

 

이 부분은 github 에 issue 를 등록해서 문의를 해봐야 할 것 같습니다.


Claude 통합의 한계와 고려해야 할 점                    

1. 비용

Claude Code는 API 사용량에 따라 비용이 발생하는 구조입니다. 사용된 토큰의 양과 선택한 모델 종류에 따라 요금이 청구되는데, 여기서 예상치 못한 상황이 발생할 수 있습니다. 앞선 테스트에서 확인해보았듯이 특정 모델을 지정했음에도 불구하고 내부적으로 다른 모델이 사용되는 경우가 있고, 코드베이스가 크거나 PR이 자주 발생하는 프로젝트라면 비용이 급격히 늘어날 수 있습니다.

2. 정확성 및 신뢰성

AI 리뷰의 또 다른 문제는 정확성입니다. Claude Code는 문맥에 맞지 않는 제안이나 잘못된 피드백을 생성할 수 있는데, 이를 흔히 “Hallucination”이라고 부릅니다. 또한 AI가 답변을 만들기 위해 내부적으로 여러 차례 질의응답 과정을 거치는데, 이 과정에서 요청 횟수와 리소스 소모량을 예측하기 어렵습니다.

따라서 Claude Code는 인간 리뷰어를 대체하는 도구가 아니라, 보조 도구로 자리 잡는 것이 바람직합니다.

3. 성능

Claude Code를 연동하면 AI 모델의 응답을 기다려야 하므로, 전체 워크플로우 실행 시간이 길어질 수 있습니다. 이는 단순히 개발 피드백 속도 저하뿐만 아니라, Github Actions의 실행 시간 증가로 인한 추가 비용 부담까지 연결됩니다.

4. 보안 및 정보 보호

Claude Code를 사용하면 내부 소스 코드가 외부 AI 서비스(Anthropic)로 전송됩니다. 이는 곧 민감한 비즈니스 로직이나 개인 정보가 외부 서비스에 노출될 수 있다는 의미이기도 합니다. 


테스트를 이리저리 해보면서 느낀것은 품질 향상에 도움을 줄 수 있는 도구는 맞지만, AI 는 결국 확률과 통계에 기반한 응답을 하기 때문에 코드나 시스템처럼 매번 정확한 수행능력을 보이지 못하기 때문에 어느정도의 위험성을 가지고 있다고 생각이 들었습니다. 그에 따른 비용, 정확성, 성능, 보안이라는 큰 네가지 축에서 현실적인 운영 환경에서 사용은 한계점이 있을 것으로 생각이 됩니다.

결국 AI 기술이라고 무조건 적인 도입보다는 상황에 맞게 균형잡힌 도입 전략을 세우는 것이 좋은 방법이 아닐까 생각이 들었습니다.

마지막으로 글을 작성하면서 참고했던 링크입니다.