Claude Code GitLab CI/CD
Claude Code๋ฅผ GitLab CI/CD์ ํจ๊ป ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค
Claude Code for GitLab CI/CD๋ ํ์ฌ ๋ฒ ํ ๋ฒ์ ์ ๋๋ค. ๊ฒฝํ์ ๊ฐ์ ํ๋ฉด์ ๊ธฐ๋ฅ๊ณผ ๊ธฐ๋ฅ์ฑ์ด ์งํํ ์ ์์ต๋๋ค.
์ด ํตํฉ์ GitLab์์ ์ ์ง ๊ด๋ฆฌํฉ๋๋ค. ์ง์์ ๋ฐ์ผ๋ ค๋ฉด ๋ค์ GitLab ์ด์๋ฅผ ์ฐธ์กฐํ์ธ์.
์ด ํตํฉ์ Claude Code CLI and Agent SDK ์์ ๊ตฌ์ถ๋์ด ์์ผ๋ฉฐ, CI/CD ์์ ๋ฐ ์ฌ์ฉ์ ์ ์ ์๋ํ ์ํฌํ๋ก์ฐ์์ Claude๋ฅผ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
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์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ปค๋ฐํฉ๋๋ค:
-
์ด๋ฒคํธ ๊ธฐ๋ฐ ์ค์ผ์คํธ๋ ์ด์ : GitLab์ ์ ํํ ํธ๋ฆฌ๊ฑฐ(์: ์ด์, MR ๋๋ ๊ฒํ ์ค๋ ๋์์
@claude๋ฅผ ์ธ๊ธํ๋ ๋๊ธ)๋ฅผ ์์ ํฉ๋๋ค. ์์ ์ ์ค๋ ๋ ๋ฐ ์ ์ฅ์์์ ์ปจํ ์คํธ๋ฅผ ์์งํ๊ณ , ํด๋น ์ ๋ ฅ์์ ํ๋กฌํํธ๋ฅผ ์์ฑํ๊ณ , Claude Code๋ฅผ ์คํํฉ๋๋ค. -
๊ณต๊ธ์ ์ถ์ํ: ํ๊ฒฝ์ ๋ง๋ ๊ณต๊ธ์๋ฅผ ์ฌ์ฉํฉ๋๋ค:
- Claude API (SaaS)
- Amazon Bedrock (IAM ๊ธฐ๋ฐ ์ก์ธ์ค, ๊ต์ฐจ ์ง์ญ ์ต์ )
- Google Vertex AI (GCP ๋ค์ดํฐ๋ธ, Workload Identity Federation)
-
์๋๋ฐ์ค ์คํ: ๊ฐ ์ํธ ์์ฉ์ ์๊ฒฉํ ๋คํธ์ํฌ ๋ฐ ํ์ผ ์์คํ ๊ท์น์ด ์๋ ์ปจํ ์ด๋์์ ์คํ๋ฉ๋๋ค. Claude Code๋ ์ฐ๊ธฐ๋ฅผ ์ ํํ๊ธฐ ์ํด ์์ ๊ณต๊ฐ ๋ฒ์ ๊ถํ์ ์ ์ฉํฉ๋๋ค. ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ MR์ ํตํด ํ๋ฅด๋ฏ๋ก ๊ฒํ ์๊ฐ diff๋ฅผ ๋ณด๊ณ ์น์ธ์ด ์ฌ์ ํ ์ ์ฉ๋ฉ๋๋ค.
์ง์ญ ์๋ํฌ์ธํธ๋ฅผ ์ ํํ์ฌ ์ง์ฐ ์๊ฐ์ ์ค์ด๊ณ ๊ธฐ์กด ํด๋ผ์ฐ๋ ๊ณ์ฝ์ ์ฌ์ฉํ๋ฉด์ ๋ฐ์ดํฐ ์ฃผ๊ถ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํฉ๋๋ค.
Claude๊ฐ ํ ์ ์๋ ๊ฒ
Claude Code๋ ์ฝ๋ ์์ ๋ฐฉ์์ ๋ณํํ๋ ๊ฐ๋ ฅํ CI/CD ์ํฌํ๋ก์ฐ๋ฅผ ํ์ฑํํฉ๋๋ค:
- ์ด์ ์ค๋ช ๋๋ ๋๊ธ์์ MR ์์ฑ ๋ฐ ์ ๋ฐ์ดํธ
- ์ฑ๋ฅ ํ๊ท ๋ถ์ ๋ฐ ์ต์ ํ ์ ์
- ๋ธ๋์น์ ์ง์ ๊ธฐ๋ฅ ๊ตฌํ ํ MR ์ด๊ธฐ
- ํ ์คํธ ๋๋ ๋๊ธ๋ก ์๋ณ๋ ๋ฒ๊ทธ ๋ฐ ํ๊ท ์์
- ํ์ ๋๊ธ์ ์๋ตํ์ฌ ์์ฒญ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ๋ฐ๋ณต
์ค์
๋น ๋ฅธ ์ค์
๊ฐ์ฅ ๋น ๋ฅธ ์์ ๋ฐฉ๋ฒ์ .gitlab-ci.yml์ ์ต์ ์์
์ ์ถ๊ฐํ๊ณ API ํค๋ฅผ ๋ง์คํน๋ ๋ณ์๋ก ์ค์ ํ๋ ๊ฒ์
๋๋ค.
-
๋ง์คํน๋ CI/CD ๋ณ์ ์ถ๊ฐ
- ์ค์ โ CI/CD โ ๋ณ์๋ก ์ด๋ํฉ๋๋ค
ANTHROPIC_API_KEY์ถ๊ฐ (๋ง์คํน๋จ, ํ์์ ๋ฐ๋ผ ๋ณดํธ๋จ)
-
.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์ ์ด๋๋ก ํฉ๋๋ค.
Claude API ๋์ Amazon Bedrock ๋๋ Google Vertex AI์์ ์คํํ๋ ค๋ฉด ์๋์ Amazon Bedrock & Google Vertex AI ์ฌ์ฉ ์น์ ์ ์ฐธ์กฐํ์ฌ ์ธ์ฆ ๋ฐ ํ๊ฒฝ ์ค์ ์ ํ์ธํ์ธ์.
์๋ ์ค์ (ํ๋ก๋์ ์ ๊ถ์ฅ)
๋ ์ ์ด๋ ์ค์ ์ ์ ํธํ๊ฑฐ๋ ์ํฐํ๋ผ์ด์ฆ ๊ณต๊ธ์๊ฐ ํ์ํ ๊ฒฝ์ฐ:
-
๊ณต๊ธ์ ์ก์ธ์ค ๊ตฌ์ฑ:
- Claude API:
ANTHROPIC_API_KEY๋ฅผ ์์ฑํ๊ณ ๋ง์คํน๋ CI/CD ๋ณ์๋ก ์ ์ฅํฉ๋๋ค - Amazon Bedrock: GitLab ๊ตฌ์ฑ โ AWS OIDC๋ฅผ ๊ตฌ์ฑํ๊ณ Bedrock์ฉ IAM ์ญํ ์ ์์ฑํฉ๋๋ค
- Google Vertex AI: GitLab์ฉ Workload Identity Federation ๊ตฌ์ฑ โ GCP
- Claude API:
-
GitLab API ์์ ์ ์ํ ํ๋ก์ ํธ ์๊ฒฉ ์ฆ๋ช ์ถ๊ฐ:
- ๊ธฐ๋ณธ์ ์ผ๋ก
CI_JOB_TOKEN์ ์ฌ์ฉํ๊ฑฐ๋api๋ฒ์๊ฐ ์๋ ํ๋ก์ ํธ ์ก์ธ์ค ํ ํฐ์ ์์ฑํฉ๋๋ค - PAT๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
GITLAB_ACCESS_TOKEN(๋ง์คํน๋จ)์ผ๋ก ์ ์ฅํฉ๋๋ค
- ๊ธฐ๋ณธ์ ์ผ๋ก
-
Claude ์์ ์
.gitlab-ci.yml์ ์ถ๊ฐ (์๋ ์์ ์ฐธ์กฐ) -
(์ ํ ์ฌํญ) ์ธ๊ธ ๊ธฐ๋ฐ ํธ๋ฆฌ๊ฑฐ ํ์ฑํ:
- ์ด๋ฒคํธ ๋ฆฌ์ค๋์ "๋๊ธ (๋ ธํธ)"์ ๋ํ ํ๋ก์ ํธ ์นํ ์ ์ถ๊ฐํฉ๋๋ค (์ฌ์ฉํ๋ ๊ฒฝ์ฐ)
- ๋๊ธ์
@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๋ฅผ ์ค์ ํ๊ธฐ ์ ์ ๋ค์์ด ํ์ํฉ๋๋ค:
- ์ํ๋ Claude ๋ชจ๋ธ์ ๋ํ Amazon Bedrock ์ก์ธ์ค๊ฐ ์๋ AWS ๊ณ์
- AWS IAM์์ OIDC ์๊ฒฉ ์ฆ๋ช ๊ณต๊ธ์๋ก ๊ตฌ์ฑ๋ GitLab
- Bedrock ๊ถํ์ด ์๋ IAM ์ญํ ๋ฐ GitLab ํ๋ก์ ํธ/์ฐธ์กฐ๋ก ์ ํ๋ ์ ๋ขฐ ์ ์ฑ
- ์ญํ ๊ฐ์ ์ ์ํ GitLab CI/CD ๋ณ์:
AWS_ROLE_TO_ASSUME(์ญํ ARN)AWS_REGION(Bedrock ์ง์ญ)
์ค์ ์ง์นจ
OIDC๋ฅผ ํตํด GitLab CI ์์ ์ด IAM ์ญํ ์ ๊ฐ์ ํ๋๋ก AWS๋ฅผ ๊ตฌ์ฑํฉ๋๋ค (์ ์ ํค ์์).
ํ์ ์ค์ :
- Amazon Bedrock์ ํ์ฑํํ๊ณ ๋์ Claude ๋ชจ๋ธ์ ๋ํ ์ก์ธ์ค๋ฅผ ์์ฒญํฉ๋๋ค
- ์์ง ์๋ ๊ฒฝ์ฐ GitLab์ฉ IAM OIDC ๊ณต๊ธ์๋ฅผ ์์ฑํฉ๋๋ค
- GitLab OIDC ๊ณต๊ธ์๋ฅผ ์ ๋ขฐํ๊ณ ํ๋ก์ ํธ ๋ฐ ๋ณดํธ๋ ์ฐธ์กฐ๋ก ์ ํ๋ IAM ์ญํ ์ ์์ฑํฉ๋๋ค
- Bedrock ํธ์ถ API์ ๋ํ ์ต์ ๊ถํ ๊ถํ์ ์ฐ๊ฒฐํฉ๋๋ค
CI/CD ๋ณ์์ ์ ์ฅํ ํ์ ๊ฐ:
AWS_ROLE_TO_ASSUMEAWS_REGION
์ค์ โ CI/CD โ ๋ณ์์์ ๋ณ์๋ฅผ ์ถ๊ฐํฉ๋๋ค:
# Amazon Bedrock์ ๊ฒฝ์ฐ:
- AWS_ROLE_TO_ASSUME
- AWS_REGION
์์ Amazon Bedrock ์์ ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํ์์ GitLab ์์ ํ ํฐ์ ์์ AWS ์๊ฒฉ ์ฆ๋ช ์ผ๋ก ๊ตํํฉ๋๋ค.
ํ์ ์กฐ๊ฑด
Google Vertex AI๋ก Claude Code๋ฅผ ์ค์ ํ๊ธฐ ์ ์ ๋ค์์ด ํ์ํฉ๋๋ค:
- ๋ค์์ด ํฌํจ๋ Google Cloud ํ๋ก์ ํธ:
- Vertex AI API ํ์ฑํ๋จ
- GitLab OIDC๋ฅผ ์ ๋ขฐํ๋๋ก ๊ตฌ์ฑ๋ Workload Identity Federation
- ํ์ํ Vertex AI ์ญํ ๋ง ์๋ ์ ์ฉ ์๋น์ค ๊ณ์
- WIF์ฉ GitLab CI/CD ๋ณ์:
GCP_WORKLOAD_IDENTITY_PROVIDER(์ ์ฒด ๋ฆฌ์์ค ์ด๋ฆ)GCP_SERVICE_ACCOUNT(์๋น์ค ๊ณ์ ์ด๋ฉ์ผ)
์ค์ ์ง์นจ
Workload Identity Federation์ ํตํด GitLab CI ์์ ์ด ์๋น์ค ๊ณ์ ์ ๊ฐ์ฅํ๋๋ก Google Cloud๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
ํ์ ์ค์ :
- IAM Credentials API, STS API ๋ฐ Vertex AI API ํ์ฑํ
- GitLab OIDC์ฉ Workload Identity Pool ๋ฐ ๊ณต๊ธ์ ์์ฑ
- Vertex AI ์ญํ ์ด ์๋ ์ ์ฉ ์๋น์ค ๊ณ์ ์์ฑ
- WIF ์ฃผ์ฒด์ ์๋น์ค ๊ณ์ ์ ๊ฐ์ฅํ ์ ์๋ ๊ถํ ๋ถ์ฌ
CI/CD ๋ณ์์ ์ ์ฅํ ํ์ ๊ฐ:
GCP_WORKLOAD_IDENTITY_PROVIDERGCP_SERVICE_ACCOUNT
์ค์ โ CI/CD โ ๋ณ์์์ ๋ณ์๋ฅผ ์ถ๊ฐํฉ๋๋ค:
# Google Vertex AI์ ๊ฒฝ์ฐ:
- GCP_WORKLOAD_IDENTITY_PROVIDER
- GCP_SERVICE_ACCOUNT
- CLOUD_ML_REGION (์: us-east5)
์์ Google Vertex AI ์์ ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ํค๋ฅผ ์ ์ฅํ์ง ์๊ณ ์ธ์ฆํฉ๋๋ค.
๊ตฌ์ฑ ์์
ํ์ดํ๋ผ์ธ์ ๋ง๊ฒ ์กฐ์ ํ ์ ์๋ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ค๋ํซ์ ๋๋ค.
๊ธฐ๋ณธ .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 ์ญํ ์ ARNAWS_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"
Bedrock์ ๋ชจ๋ธ ID์๋ ์ง์ญ๋ณ ์ ๋์ฌ๊ฐ ํฌํจ๋ฉ๋๋ค (์: us.anthropic.claude-sonnet-4-6). ์ํฌํ๋ก์ฐ์์ ์ง์ํ๋ ๊ฒฝ์ฐ ์์
๊ตฌ์ฑ ๋๋ ํ๋กฌํํธ๋ฅผ ํตํด ์ํ๋ ๋ชจ๋ธ์ ์ ๋ฌํฉ๋๋ค.
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"
Workload Identity Federation์ ์ฌ์ฉํ๋ฉด ์๋น์ค ๊ณ์ ํค๋ฅผ ์ ์ฅํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ฅ์๋ณ ์ ๋ขฐ ์กฐ๊ฑด ๋ฐ ์ต์ ๊ถํ ์๋น์ค ๊ณ์ ์ ์ฌ์ฉํฉ๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก
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์ฉ ํ๋ก์ ํธ/์ง์ญ ๋ณ์
์ ํํ ํ๋๊ทธ ๋ฐ ๋งค๊ฐ๋ณ์๋ @anthropic-ai/claude-code ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์์
์์ claude --help๋ฅผ ์คํํ์ฌ ์ง์๋๋ ์ต์
์ ํ์ธํฉ๋๋ค.
Claude์ ๋์ ์ฌ์ฉ์ ์ ์
๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ๋ฒ์ผ๋ก Claude๋ฅผ ์๋ดํ ์ ์์ต๋๋ค:
- CLAUDE.md: ์ฝ๋ฉ ํ์ค, ๋ณด์ ์๊ตฌ ์ฌํญ ๋ฐ ํ๋ก์ ํธ ๊ท์น์ ์ ์ํฉ๋๋ค. Claude๋ ์คํ ์ค์ ์ด๋ฅผ ์ฝ๊ณ ๊ท์น์ ๋ฐ๋ฆ ๋๋ค.
- ์ฌ์ฉ์ ์ ์ ํ๋กฌํํธ: ์์
์์
prompt/prompt_file์ ํตํด ์์ ๋ณ ์ง์นจ์ ์ ๋ฌํฉ๋๋ค. ๋ค์ํ ์์ ์ ๋ค์ํ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค (์: ๊ฒํ , ๊ตฌํ, ๋ฆฌํฉํ ๋ง).