SpyBara
Go Premium

gitlab-ci-cd.md 2026-05-02 18:14 UTC to 2026-05-04 22:58 UTC

466 added, 0 removed.

2026
Sun 31 06:39 Sat 30 06:23 Fri 29 06:38 Thu 28 06:37 Wed 27 06:42 Tue 26 06:33 Sun 24 06:25 Sat 23 06:18 Fri 22 06:33 Thu 21 06:36 Wed 20 06:35 Tue 19 06:34 Mon 18 23:59 Sun 17 01:01 Fri 15 22:58 Thu 14 17:02 Wed 13 23:01 Tue 12 22:57 Mon 11 23:00 Sun 10 23:03 Sat 9 04:57 Fri 8 22:00 Thu 7 22:59 Tue 5 23:00 Mon 4 22:58 Sat 2 18:14 Fri 1 18:19

Claude Code GitLab CI/CD

Claude Code๋ฅผ GitLab CI/CD์™€ ํ•จ๊ป˜ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค

GitLab์—์„œ Claude Code๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • ์ฆ‰์‹œ MR ์ƒ์„ฑ: ํ•„์š”ํ•œ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•˜๋ฉด Claude๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ์„ค๋ช…์ด ํฌํ•จ๋œ ์™„์ „ํ•œ MR์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค
  • ์ž๋™ํ™”๋œ ๊ตฌํ˜„: ๋‹จ์ผ ๋ช…๋ น ๋˜๋Š” ์–ธ๊ธ‰์œผ๋กœ ์ด์Šˆ๋ฅผ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค
  • ํ”„๋กœ์ ํŠธ ์ธ์‹: Claude๋Š” CLAUDE.md ์ง€์นจ๊ณผ ๊ธฐ์กด ์ฝ”๋“œ ํŒจํ„ด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค
  • ๊ฐ„๋‹จํ•œ ์„ค์ •: .gitlab-ci.yml์— ํ•˜๋‚˜์˜ ์ž‘์—…๊ณผ ๋งˆ์Šคํ‚น๋œ CI/CD ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
  • ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ค€๋น„: Claude API, Amazon Bedrock ๋˜๋Š” Google Vertex AI๋ฅผ ์„ ํƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๊ฑฐ์ฃผ์ง€ ๋ฐ ์กฐ๋‹ฌ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ˆ์ „: GitLab ๋Ÿฌ๋„ˆ์—์„œ ์‹คํ–‰๋˜๋ฉฐ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๋ฐ ์Šน์ธ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค

์ž‘๋™ ๋ฐฉ์‹

Claude Code๋Š” GitLab CI/CD๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฉ๋ฆฌ๋œ ์ž‘์—…์—์„œ AI ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  MR์„ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค:

  1. ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜: GitLab์€ ์„ ํƒํ•œ ํŠธ๋ฆฌ๊ฑฐ(์˜ˆ: ์ด์Šˆ, MR ๋˜๋Š” ๊ฒ€ํ†  ์Šค๋ ˆ๋“œ์—์„œ @claude๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” ๋Œ“๊ธ€)๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์€ ์Šค๋ ˆ๋“œ ๋ฐ ์ €์žฅ์†Œ์—์„œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ํ•ด๋‹น ์ž…๋ ฅ์—์„œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , Claude Code๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ณต๊ธ‰์ž ์ถ”์ƒํ™”: ํ™˜๊ฒฝ์— ๋งž๋Š” ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

    • Claude API (SaaS)
    • Amazon Bedrock (IAM ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค, ๊ต์ฐจ ์ง€์—ญ ์˜ต์…˜)
    • Google Vertex AI (GCP ๋„ค์ดํ‹ฐ๋ธŒ, Workload Identity Federation)
  3. ์ƒŒ๋“œ๋ฐ•์Šค ์‹คํ–‰: ๊ฐ ์ƒํ˜ธ ์ž‘์šฉ์€ ์—„๊ฒฉํ•œ ๋„คํŠธ์›Œํฌ ๋ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ทœ์น™์ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Claude Code๋Š” ์“ฐ๊ธฐ๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—… ๊ณต๊ฐ„ ๋ฒ”์œ„ ๊ถŒํ•œ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ MR์„ ํ†ตํ•ด ํ๋ฅด๋ฏ€๋กœ ๊ฒ€ํ† ์ž๊ฐ€ diff๋ฅผ ๋ณด๊ณ  ์Šน์ธ์ด ์—ฌ์ „ํžˆ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ง€์—ญ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์„ ํƒํ•˜์—ฌ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ๊ธฐ์กด ํด๋ผ์šฐ๋“œ ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ์ฃผ๊ถŒ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

Claude๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

Claude Code๋Š” ์ฝ”๋“œ ์ž‘์—… ๋ฐฉ์‹์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ CI/CD ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค:

  • ์ด์Šˆ ์„ค๋ช… ๋˜๋Š” ๋Œ“๊ธ€์—์„œ MR ์ƒ์„ฑ ๋ฐ ์—…๋ฐ์ดํŠธ
  • ์„ฑ๋Šฅ ํšŒ๊ท€ ๋ถ„์„ ๋ฐ ์ตœ์ ํ™” ์ œ์•ˆ
  • ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ํ›„ MR ์—ด๊ธฐ
  • ํ…Œ์ŠคํŠธ ๋˜๋Š” ๋Œ“๊ธ€๋กœ ์‹๋ณ„๋œ ๋ฒ„๊ทธ ๋ฐ ํšŒ๊ท€ ์ˆ˜์ •
  • ํ›„์† ๋Œ“๊ธ€์— ์‘๋‹ตํ•˜์—ฌ ์š”์ฒญ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต

์„ค์ •

๋น ๋ฅธ ์„ค์ •

๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ์ž‘ ๋ฐฉ๋ฒ•์€ .gitlab-ci.yml์— ์ตœ์†Œ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•˜๊ณ  API ํ‚ค๋ฅผ ๋งˆ์Šคํ‚น๋œ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ๋งˆ์Šคํ‚น๋œ CI/CD ๋ณ€์ˆ˜ ์ถ”๊ฐ€

    • ์„ค์ • โ†’ CI/CD โ†’ ๋ณ€์ˆ˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค
    • ANTHROPIC_API_KEY ์ถ”๊ฐ€ (๋งˆ์Šคํ‚น๋จ, ํ•„์š”์— ๋”ฐ๋ผ ๋ณดํ˜ธ๋จ)
  2. .gitlab-ci.yml์— Claude ์ž‘์—… ์ถ”๊ฐ€

stages:
  - ai

claude:
  stage: ai
  image: node:24-alpine3.21
  # ์ž‘์—…์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋งž๊ฒŒ ๊ทœ์น™์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค:
  # - ์ˆ˜๋™ ์‹คํ–‰
  # - ๋ณ‘ํ•ฉ ์š”์ฒญ ์ด๋ฒคํŠธ
  # - '@claude'๋ฅผ ํฌํ•จํ•˜๋Š” ๋Œ“๊ธ€์ด ์žˆ์„ ๋•Œ ์›น/API ํŠธ๋ฆฌ๊ฑฐ
  rules:
    - if: '$CI_PIPELINE_SOURCE == "web"'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
  variables:
    GIT_STRATEGY: fetch
  before_script:
    - apk update
    - apk add --no-cache git curl bash
    - curl -fsSL https://claude.ai/install.sh | bash
  script:
    # ์„ ํƒ ์‚ฌํ•ญ: ์„ค์ •์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ GitLab MCP ์„œ๋ฒ„ ์‹œ์ž‘
    - /bin/gitlab-mcp-server || true
    # ์›น/API ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํ†ตํ•ด ์ปจํ…์ŠคํŠธ ํŽ˜์ด๋กœ๋“œ๋กœ ํ˜ธ์ถœํ•  ๋•Œ AI_FLOW_* ๋ณ€์ˆ˜ ์‚ฌ์šฉ
    - echo "$AI_FLOW_INPUT for $AI_FLOW_CONTEXT on $AI_FLOW_EVENT"
    - >
      claude
      -p "${AI_FLOW_INPUT:-'Review this MR and implement the requested changes'}"
      --permission-mode acceptEdits
      --allowedTools "Bash Read Edit Write mcp__gitlab"
      --debug

์ž‘์—…๊ณผ ANTHROPIC_API_KEY ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ CI/CD โ†’ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ž‘์—…์„ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•˜๊ฑฐ๋‚˜, MR์—์„œ ํŠธ๋ฆฌ๊ฑฐํ•˜์—ฌ Claude๊ฐ€ ๋ธŒ๋žœ์น˜์—์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ์•ˆํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ MR์„ ์—ด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜๋™ ์„ค์ • (ํ”„๋กœ๋•์…˜์— ๊ถŒ์žฅ)

๋” ์ œ์–ด๋œ ์„ค์ •์„ ์„ ํ˜ธํ•˜๊ฑฐ๋‚˜ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ณต๊ธ‰์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ:

  1. ๊ณต๊ธ‰์ž ์•ก์„ธ์Šค ๊ตฌ์„ฑ:

    • Claude API: ANTHROPIC_API_KEY๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋งˆ์Šคํ‚น๋œ CI/CD ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
    • Amazon Bedrock: GitLab ๊ตฌ์„ฑ โ†’ AWS OIDC๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  Bedrock์šฉ IAM ์—ญํ• ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
    • Google Vertex AI: GitLab์šฉ Workload Identity Federation ๊ตฌ์„ฑ โ†’ GCP
  2. GitLab API ์ž‘์—…์„ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ ์ž๊ฒฉ ์ฆ๋ช… ์ถ”๊ฐ€:

    • ๊ธฐ๋ณธ์ ์œผ๋กœ CI_JOB_TOKEN์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ api ๋ฒ”์œ„๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
    • PAT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ GITLAB_ACCESS_TOKEN (๋งˆ์Šคํ‚น๋จ)์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
  3. Claude ์ž‘์—…์„ .gitlab-ci.yml์— ์ถ”๊ฐ€ (์•„๋ž˜ ์˜ˆ์ œ ์ฐธ์กฐ)

  4. (์„ ํƒ ์‚ฌํ•ญ) ์–ธ๊ธ‰ ๊ธฐ๋ฐ˜ ํŠธ๋ฆฌ๊ฑฐ ํ™œ์„ฑํ™”:

    • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— "๋Œ“๊ธ€ (๋…ธํŠธ)"์— ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ ์›นํ›…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค (์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ)
    • ๋Œ“๊ธ€์— @claude๊ฐ€ ํฌํ•จ๋  ๋•Œ AI_FLOW_INPUT ๋ฐ AI_FLOW_CONTEXT์™€ ๊ฐ™์€ ๋ณ€์ˆ˜๋กœ ํŒŒ์ดํ”„๋ผ์ธ ํŠธ๋ฆฌ๊ฑฐ API๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋ฆฌ์Šค๋„ˆ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค

์˜ˆ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€

์ด์Šˆ๋ฅผ MR๋กœ ๋ณ€ํ™˜

์ด์Šˆ ๋Œ“๊ธ€์—์„œ:

@claude implement this feature based on the issue description

Claude๋Š” ์ด์Šˆ ๋ฐ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ถ„์„ํ•˜๊ณ , ๋ธŒ๋žœ์น˜์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž‘์„ฑํ•˜๊ณ , ๊ฒ€ํ† ๋ฅผ ์œ„ํ•ด MR์„ ์—ฝ๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋„์›€ ๋ฐ›๊ธฐ

MR ํ† ๋ก ์—์„œ:

@claude suggest a concrete approach to cache the results of this API call

Claude๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ์•ˆํ•˜๊ณ , ์ ์ ˆํ•œ ์บ์‹ฑ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , MR์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„๊ทธ ๋น ๋ฅด๊ฒŒ ์ˆ˜์ •

์ด์Šˆ ๋˜๋Š” MR ๋Œ“๊ธ€์—์„œ:

@claude fix the TypeError in the user dashboard component

Claude๋Š” ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ณ , ์ˆ˜์ •์„ ๊ตฌํ˜„ํ•˜๊ณ , ๋ธŒ๋žœ์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ์ƒˆ MR์„ ์—ฝ๋‹ˆ๋‹ค.

Amazon Bedrock & Google Vertex AI ์‚ฌ์šฉ

์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ ๋™์ผํ•œ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์œผ๋กœ ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ์—์„œ ์™„์ „ํžˆ Claude Code๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ์กฐ๊ฑด

Amazon Bedrock์œผ๋กœ Claude Code๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  1. ์›ํ•˜๋Š” Claude ๋ชจ๋ธ์— ๋Œ€ํ•œ Amazon Bedrock ์•ก์„ธ์Šค๊ฐ€ ์žˆ๋Š” AWS ๊ณ„์ •
  2. AWS IAM์—์„œ OIDC ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž๋กœ ๊ตฌ์„ฑ๋œ GitLab
  3. Bedrock ๊ถŒํ•œ์ด ์žˆ๋Š” IAM ์—ญํ•  ๋ฐ GitLab ํ”„๋กœ์ ํŠธ/์ฐธ์กฐ๋กœ ์ œํ•œ๋œ ์‹ ๋ขฐ ์ •์ฑ…
  4. ์—ญํ•  ๊ฐ€์ •์„ ์œ„ํ•œ GitLab CI/CD ๋ณ€์ˆ˜:
  • AWS_ROLE_TO_ASSUME (์—ญํ•  ARN)
  • AWS_REGION (Bedrock ์ง€์—ญ)

์„ค์ • ์ง€์นจ

OIDC๋ฅผ ํ†ตํ•ด GitLab CI ์ž‘์—…์ด IAM ์—ญํ• ์„ ๊ฐ€์ •ํ•˜๋„๋ก AWS๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค (์ •์  ํ‚ค ์—†์Œ).

ํ•„์ˆ˜ ์„ค์ •:

  1. Amazon Bedrock์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋Œ€์ƒ Claude ๋ชจ๋ธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค
  2. ์•„์ง ์—†๋Š” ๊ฒฝ์šฐ GitLab์šฉ IAM OIDC ๊ณต๊ธ‰์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
  3. GitLab OIDC ๊ณต๊ธ‰์ž๋ฅผ ์‹ ๋ขฐํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ๋ฐ ๋ณดํ˜ธ๋œ ์ฐธ์กฐ๋กœ ์ œํ•œ๋œ IAM ์—ญํ• ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
  4. Bedrock ํ˜ธ์ถœ API์— ๋Œ€ํ•œ ์ตœ์†Œ ๊ถŒํ•œ ๊ถŒํ•œ์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค

CI/CD ๋ณ€์ˆ˜์— ์ €์žฅํ•  ํ•„์ˆ˜ ๊ฐ’:

  • AWS_ROLE_TO_ASSUME
  • AWS_REGION

์„ค์ • โ†’ CI/CD โ†’ ๋ณ€์ˆ˜์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

# Amazon Bedrock์˜ ๊ฒฝ์šฐ:
- AWS_ROLE_TO_ASSUME
- AWS_REGION

์œ„์˜ Amazon Bedrock ์ž‘์—… ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„์— GitLab ์ž‘์—… ํ† ํฐ์„ ์ž„์‹œ AWS ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์˜ˆ์ œ

ํŒŒ์ดํ”„๋ผ์ธ์— ๋งž๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šค๋‹ˆํŽซ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ .gitlab-ci.yml (Claude API)

stages:
  - ai

claude:
  stage: ai
  image: node:24-alpine3.21
  rules:
    - if: '$CI_PIPELINE_SOURCE == "web"'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
  variables:
    GIT_STRATEGY: fetch
  before_script:
    - apk update
    - apk add --no-cache git curl bash
    - curl -fsSL https://claude.ai/install.sh | bash
  script:
    - /bin/gitlab-mcp-server || true
    - >
      claude
      -p "${AI_FLOW_INPUT:-'Summarize recent changes and suggest improvements'}"
      --permission-mode acceptEdits
      --allowedTools "Bash Read Edit Write mcp__gitlab"
      --debug
  # Claude Code๋Š” CI/CD ๋ณ€์ˆ˜์—์„œ ANTHROPIC_API_KEY๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

Amazon Bedrock ์ž‘์—… ์˜ˆ์ œ (OIDC)

ํ•„์ˆ˜ ์กฐ๊ฑด:

  • Amazon Bedrock์ด ํ™œ์„ฑํ™”๋˜๊ณ  ์„ ํƒํ•œ Claude ๋ชจ๋ธ์— ์•ก์„ธ์Šค ๊ฐ€๋Šฅ
  • GitLab OIDC๊ฐ€ AWS์— ๊ตฌ์„ฑ๋˜๊ณ  GitLab ํ”„๋กœ์ ํŠธ ๋ฐ ์ฐธ์กฐ๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ์—ญํ• 
  • Bedrock ๊ถŒํ•œ์ด ์žˆ๋Š” IAM ์—ญํ•  (์ตœ์†Œ ๊ถŒํ•œ ๊ถŒ์žฅ)

ํ•„์ˆ˜ CI/CD ๋ณ€์ˆ˜:

  • AWS_ROLE_TO_ASSUME: Bedrock ์•ก์„ธ์Šค์šฉ IAM ์—ญํ• ์˜ ARN
  • AWS_REGION: Bedrock ์ง€์—ญ (์˜ˆ: us-west-2)
claude-bedrock:
  stage: ai
  image: node:24-alpine3.21
  rules:
    - if: '$CI_PIPELINE_SOURCE == "web"'
  before_script:
    - apk add --no-cache bash curl jq git python3 py3-pip
    - pip install --no-cache-dir awscli
    - curl -fsSL https://claude.ai/install.sh | bash
    # GitLab OIDC ํ† ํฐ์„ AWS ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ๊ตํ™˜
    - export AWS_WEB_IDENTITY_TOKEN_FILE="${CI_JOB_JWT_FILE:-/tmp/oidc_token}"
    - if [ -n "${CI_JOB_JWT_V2}" ]; then printf "%s" "$CI_JOB_JWT_V2" > "$AWS_WEB_IDENTITY_TOKEN_FILE"; fi
    - >
      aws sts assume-role-with-web-identity
      --role-arn "$AWS_ROLE_TO_ASSUME"
      --role-session-name "gitlab-claude-$(date +%s)"
      --web-identity-token "file://$AWS_WEB_IDENTITY_TOKEN_FILE"
      --duration-seconds 3600 > /tmp/aws_creds.json
    - export AWS_ACCESS_KEY_ID="$(jq -r .Credentials.AccessKeyId /tmp/aws_creds.json)"
    - export AWS_SECRET_ACCESS_KEY="$(jq -r .Credentials.SecretAccessKey /tmp/aws_creds.json)"
    - export AWS_SESSION_TOKEN="$(jq -r .Credentials.SessionToken /tmp/aws_creds.json)"
  script:
    - /bin/gitlab-mcp-server || true
    - >
      claude
      -p "${AI_FLOW_INPUT:-'Implement the requested changes and open an MR'}"
      --permission-mode acceptEdits
      --allowedTools "Bash Read Edit Write mcp__gitlab"
      --debug
  variables:
    AWS_REGION: "us-west-2"

Google Vertex AI ์ž‘์—… ์˜ˆ์ œ (Workload Identity Federation)

ํ•„์ˆ˜ ์กฐ๊ฑด:

  • GCP ํ”„๋กœ์ ํŠธ์—์„œ Vertex AI API ํ™œ์„ฑํ™”๋จ
  • GitLab OIDC๋ฅผ ์‹ ๋ขฐํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ Workload Identity Federation
  • Vertex AI ๊ถŒํ•œ์ด ์žˆ๋Š” ์„œ๋น„์Šค ๊ณ„์ •

ํ•„์ˆ˜ CI/CD ๋ณ€์ˆ˜:

  • GCP_WORKLOAD_IDENTITY_PROVIDER: ์ „์ฒด ๊ณต๊ธ‰์ž ๋ฆฌ์†Œ์Šค ์ด๋ฆ„
  • GCP_SERVICE_ACCOUNT: ์„œ๋น„์Šค ๊ณ„์ • ์ด๋ฉ”์ผ
  • CLOUD_ML_REGION: Vertex ์ง€์—ญ (์˜ˆ: us-east5)
claude-vertex:
  stage: ai
  image: gcr.io/google.com/cloudsdktool/google-cloud-cli:slim
  rules:
    - if: '$CI_PIPELINE_SOURCE == "web"'
  before_script:
    - apt-get update && apt-get install -y git && apt-get clean
    - curl -fsSL https://claude.ai/install.sh | bash
    # WIF๋ฅผ ํ†ตํ•ด Google Cloud์— ์ธ์ฆ (๋‹ค์šด๋กœ๋“œ๋œ ํ‚ค ์—†์Œ)
    - >
      gcloud auth login --cred-file=<(cat <<EOF
      {
        "type": "external_account",
        "audience": "${GCP_WORKLOAD_IDENTITY_PROVIDER}",
        "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
        "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${GCP_SERVICE_ACCOUNT}:generateAccessToken",
        "token_url": "https://sts.googleapis.com/v1/token"
      }
      EOF
      )
    - gcloud config set project "$(gcloud projects list --format='value(projectId)' --filter="name:${CI_PROJECT_NAMESPACE}" | head -n1)" || true
  script:
    - /bin/gitlab-mcp-server || true
    - >
      CLOUD_ML_REGION="${CLOUD_ML_REGION:-us-east5}"
      claude
      -p "${AI_FLOW_INPUT:-'Review and update code as requested'}"
      --permission-mode acceptEdits
      --allowedTools "Bash Read Edit Write mcp__gitlab"
      --debug
  variables:
    CLOUD_ML_REGION: "us-east5"

๋ชจ๋ฒ” ์‚ฌ๋ก€

CLAUDE.md ๊ตฌ์„ฑ

์ €์žฅ์†Œ ๋ฃจํŠธ์— CLAUDE.md ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ์ฝ”๋”ฉ ํ‘œ์ค€, ๊ฒ€ํ†  ๊ธฐ์ค€ ๋ฐ ํ”„๋กœ์ ํŠธ๋ณ„ ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Claude๋Š” ์‹คํ–‰ ์ค‘์— ์ด ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ์•ˆํ•  ๋•Œ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

๋ณด์•ˆ ๊ณ ๋ ค ์‚ฌํ•ญ

API ํ‚ค ๋˜๋Š” ํด๋ผ์šฐ๋“œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ €์žฅ์†Œ์— ์ปค๋ฐ‹ํ•˜์ง€ ๋งˆ์„ธ์š”. ํ•ญ์ƒ GitLab CI/CD ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

  • ANTHROPIC_API_KEY๋ฅผ ๋งˆ์Šคํ‚น๋œ ๋ณ€์ˆ˜๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค (ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ณดํ˜ธ)
  • ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ณต๊ธ‰์ž๋ณ„ OIDC๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (์žฅ๊ธฐ ํ‚ค ์—†์Œ)
  • ์ž‘์—… ๊ถŒํ•œ ๋ฐ ๋„คํŠธ์›Œํฌ ์†ก์‹  ์ œํ•œ
  • ๋‹ค๋ฅธ ๊ธฐ์—ฌ์ž์ฒ˜๋Ÿผ Claude์˜ MR์„ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค

์„ฑ๋Šฅ ์ตœ์ ํ™”

  • CLAUDE.md๋ฅผ ์ง‘์ค‘์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค
  • ๋ช…ํ™•ํ•œ ์ด์Šˆ/MR ์„ค๋ช…์„ ์ œ๊ณตํ•˜์—ฌ ๋ฐ˜๋ณต์„ ์ค„์ž…๋‹ˆ๋‹ค
  • ์ž‘์—… ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์‹คํ–‰ ์ค‘๋‹จ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค
  • ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋Ÿฌ๋„ˆ์—์„œ npm ๋ฐ ํŒจํ‚ค์ง€ ์„ค์น˜๋ฅผ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค

CI ๋น„์šฉ

GitLab CI/CD์™€ ํ•จ๊ป˜ Claude Code๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ด€๋ จ ๋น„์šฉ์„ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค:

  • GitLab Runner ์‹œ๊ฐ„:

    • Claude๋Š” GitLab ๋Ÿฌ๋„ˆ์—์„œ ์‹คํ–‰๋˜๊ณ  ์ปดํ“จํŒ… ๋ถ„์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค
    • GitLab ํ”Œ๋žœ์˜ ๋Ÿฌ๋„ˆ ์ฒญ๊ตฌ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”
  • API ๋น„์šฉ:

    • ๊ฐ Claude ์ƒํ˜ธ ์ž‘์šฉ์€ ํ”„๋กฌํ”„ํŠธ ๋ฐ ์‘๋‹ต ํฌ๊ธฐ์— ๋”ฐ๋ผ ํ† ํฐ์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค
    • ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰์€ ์ž‘์—… ๋ณต์žก๋„ ๋ฐ ์ฝ”๋“œ๋ฒ ์ด์Šค ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค
    • Anthropic ๊ฐ€๊ฒฉ ์ฑ…์ • ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”
  • ๋น„์šฉ ์ตœ์ ํ™” ํŒ:

    • ํŠน์ • @claude ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ํ„ด์„ ์ค„์ž…๋‹ˆ๋‹ค
    • ์ ์ ˆํ•œ max_turns ๋ฐ ์ž‘์—… ์‹œ๊ฐ„ ์ดˆ๊ณผ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค
    • ๋™์‹œ์„ฑ์„ ์ œํ•œํ•˜์—ฌ ๋ณ‘๋ ฌ ์‹คํ–‰์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค

๋ณด์•ˆ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค

  • ๊ฐ ์ž‘์—…์€ ์ œํ•œ๋œ ๋„คํŠธ์›Œํฌ ์•ก์„ธ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฉ๋ฆฌ๋œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค
  • Claude์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ MR์„ ํ†ตํ•ด ํ๋ฅด๋ฏ€๋กœ ๊ฒ€ํ† ์ž๊ฐ€ ๋ชจ๋“  diff๋ฅผ ๋ด…๋‹ˆ๋‹ค
  • ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๋ฐ ์Šน์ธ ๊ทœ์น™์ด AI ์ƒ์„ฑ ์ฝ”๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค
  • Claude Code๋Š” ์“ฐ๊ธฐ๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—… ๊ณต๊ฐ„ ๋ฒ”์œ„ ๊ถŒํ•œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค
  • ์ž์‹ ์˜ ๊ณต๊ธ‰์ž ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋น„์šฉ์ด ์ œ์–ด๋ฉ๋‹ˆ๋‹ค

๋ฌธ์ œ ํ•ด๊ฒฐ

Claude๊ฐ€ @claude ๋ช…๋ น์— ์‘๋‹ตํ•˜์ง€ ์•Š์Œ

  • ํŒŒ์ดํ”„๋ผ์ธ์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค (์ˆ˜๋™, MR ์ด๋ฒคํŠธ ๋˜๋Š” ๋…ธํŠธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ/์›นํ›…์„ ํ†ตํ•ด)
  • CI/CD ๋ณ€์ˆ˜ (ANTHROPIC_API_KEY ๋˜๋Š” ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž ์„ค์ •)๊ฐ€ ์žˆ๊ณ  ๋งˆ์Šคํ‚น ํ•ด์ œ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
  • ๋Œ“๊ธ€์— @claude (not /claude)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ์–ธ๊ธ‰ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

์ž‘์—…์ด ๋Œ“๊ธ€์„ ์“ฐ๊ฑฐ๋‚˜ MR์„ ์—ด ์ˆ˜ ์—†์Œ

  • CI_JOB_TOKEN์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ถฉ๋ถ„ํ•œ ๊ถŒํ•œ์ด ์žˆ๊ฑฐ๋‚˜ api ๋ฒ”์œ„๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
  • mcp__gitlab ๋„๊ตฌ๊ฐ€ --allowedTools์—์„œ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
  • ์ž‘์—…์ด MR์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ AI_FLOW_* ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ถฉ๋ถ„ํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

์ธ์ฆ ์˜ค๋ฅ˜

  • Claude API์˜ ๊ฒฝ์šฐ: ANTHROPIC_API_KEY๊ฐ€ ์œ ํšจํ•˜๊ณ  ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
  • Bedrock/Vertex์˜ ๊ฒฝ์šฐ: OIDC/WIF ๊ตฌ์„ฑ, ์—ญํ•  ๊ฐ€์žฅ ๋ฐ ๋น„๋ฐ€ ์ด๋ฆ„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ญ ๋ฐ ๋ชจ๋ธ ๊ฐ€์šฉ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

๊ณ ๊ธ‰ ๊ตฌ์„ฑ

์ผ๋ฐ˜์ ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ๋ณ€์ˆ˜

Claude Code๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ž…๋ ฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

  • prompt / prompt_file: ์ธ๋ผ์ธ (-p) ๋˜๋Š” ํŒŒ์ผ์„ ํ†ตํ•ด ์ง€์นจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค
  • max_turns: ์™•๋ณต ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค
  • timeout_minutes: ์ด ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค
  • ANTHROPIC_API_KEY: Claude API์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค (Bedrock/Vertex์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ)
  • ๊ณต๊ธ‰์ž๋ณ„ ํ™˜๊ฒฝ: AWS_REGION, Vertex์šฉ ํ”„๋กœ์ ํŠธ/์ง€์—ญ ๋ณ€์ˆ˜

Claude์˜ ๋™์ž‘ ์‚ฌ์šฉ์ž ์ •์˜

๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฐฉ๋ฒ•์œผ๋กœ Claude๋ฅผ ์•ˆ๋‚ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. CLAUDE.md: ์ฝ”๋”ฉ ํ‘œ์ค€, ๋ณด์•ˆ ์š”๊ตฌ ์‚ฌํ•ญ ๋ฐ ํ”„๋กœ์ ํŠธ ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Claude๋Š” ์‹คํ–‰ ์ค‘์— ์ด๋ฅผ ์ฝ๊ณ  ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กฌํ”„ํŠธ: ์ž‘์—…์—์„œ prompt/prompt_file์„ ํ†ตํ•ด ์ž‘์—…๋ณ„ ์ง€์นจ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ž‘์—…์— ๋‹ค์–‘ํ•œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: ๊ฒ€ํ† , ๊ตฌํ˜„, ๋ฆฌํŒฉํ† ๋ง).