13</Info>13</Info>
14 14
15<Note>15<Note>
16 此整合建立在 [Claude Code CLI and Agent SDK](/zh-TW/agent-sdk/overview) 之上,可在您的 CI/CD 工作和自訂自動化工作流程中以程式設計方式使用 Claude。16 此整合建立在 [Claude Code CLI and Agent SDK](/docs/zh-TW/agent-sdk/overview) 之上,可在您的 CI/CD 工作和自訂自動化工作流程中以程式設計方式使用 Claude。
17</Note>17</Note>
18 18
19<h2 id="why-use-claude-code-with-gitlab">19<h2 id="why-use-claude-code-with-gitlab">
48 Claude 可以做什麼?48 Claude 可以做什麼?
49</h2>49</h2>
50 50
51Claude Code 啟用強大的 CI/CD 工作流程,改變您與程式碼的互動方式:51在 GitLab 管道中,Claude Code 可以:
52 52
53* 從問題描述或評論建立和更新 MR53* 從議題描述或評論建立和更新 MR
54* 分析效能回歸並提出最佳化建議54* 分析效能迴歸並提出最佳化建議
55* 直接在分支中實現功能,然後開啟 MR55* 直接在分支中實現功能,然後開啟 MR
56* 修復由測試或評論識別的錯誤和回歸56* 修復由測試或評論識別的錯誤和迴歸
57* 回應後續評論以反覆進行請求的變更57* 回應後續評論以反覆進行所要求的變更
58 58
59<h2 id="setup">59<h2 id="setup">
60 設定60 設定
64 快速設定64 快速設定
65</h3>65</h3>
66 66
67最快的入門方式是在您的 `.gitlab-ci.yml` 中新增最小工作,並將您的 API 金鑰設定為遮罩變數。67開始使用的最快方式是在您的 `.gitlab-ci.yml` 中新增一個最小化的工作,並將您的 API 金鑰設定為遮罩變數。
68 68
691. **新增遮罩 CI/CD 變數**691. **新增遮罩 CI/CD 變數**
70 * 前往 **Settings** → **CI/CD** → **Variables**70 * 前往 **Settings** → **CI/CD** → **Variables**
71 * 新增 `ANTHROPIC_API_KEY`(遮罩,根據需要保護)71 * 新增 `ANTHROPIC_API_KEY`(遮罩,視需要保護)
72 72
732. **在 `.gitlab-ci.yml` 中新增 Claude 工作**732. **在 `.gitlab-ci.yml` 中新增 Claude 工作**
74 74
82 # 調整規則以符合您想要觸發工作的方式:82 # 調整規則以符合您想要觸發工作的方式:
83 # - 手動執行83 # - 手動執行
84 # - 合併請求事件84 # - 合併請求事件
85 # - 當評論包含 '@claude' 時的 web/API 觸發85 # - 當評論包含 '@claude' 時的網頁/API 觸發
86 rules:86 rules:
87 - if: '$CI_PIPELINE_SOURCE == "web"'87 - if: '$CI_PIPELINE_SOURCE == "web"'
88 - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'88 - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
92 - apk update92 - apk update
93 - apk add --no-cache git curl bash93 - apk add --no-cache git curl bash
94 - curl -fsSL https://claude.ai/install.sh | bash94 - curl -fsSL https://claude.ai/install.sh | bash
95 # 安裝程式將 claude 放在 ~/.local/bin,在此映像中不在 PATH 上
96 - export PATH="$HOME/.local/bin:$PATH"
95 script:97 script:
96 # 選用:如果您的設定提供,啟動 GitLab MCP server98 # 選用:如果您的設定提供 GitLab MCP 伺服器,請啟動它
97 - /bin/gitlab-mcp-server || true99 - /bin/gitlab-mcp-server || true
98 # 透過 web/API 觸發器使用 AI_FLOW_* 變數時,使用上下文負載100 # 透過包含內容承載的網頁/API 觸發時使用 AI_FLOW_* 變數
99 - echo "$AI_FLOW_INPUT for $AI_FLOW_CONTEXT on $AI_FLOW_EVENT"101 - echo "$AI_FLOW_INPUT for $AI_FLOW_CONTEXT on $AI_FLOW_EVENT"
100 - >102 - >
101 claude103 claude
105 --debug107 --debug
106```108```
107 109
108新增工作和您的 `ANTHROPIC_API_KEY` 變數後,透過 **CI/CD** → **Pipelines** 手動執行工作進行測試,或從 MR 觸發它,讓 Claude 在分支中提出更新並在需要時開啟 MR。110新增工作和 `ANTHROPIC_API_KEY` 變數後,可以從 **CI/CD** → **Pipelines** 手動執行工作進行測試,或從 MR 觸發它,讓 Claude 在分支中提議更新並在需要時開啟 MR。
109 111
110<Note>112<Note>
111 若要改為在 Amazon Bedrock 或 Google Cloud 的 Agent Platform 上執行而不是 Claude API,請參閱下方的 [Using with Amazon Bedrock and Google Cloud](#using-with-amazon-bedrock-and-google-cloud) 部分,了解驗證和環境設定。113 若要在 Amazon Bedrock 或 Google Cloud 的 Agent Platform 上執行而不是使用 Claude API,請參閱下方的[使用 Amazon Bedrock 和 Google Cloud](#using-with-amazon-bedrock-and-google-cloud) 部分,了解驗證和環境設定。
112</Note>114</Note>
113 115
114<h3 id="manual-setup-recommended-for-production">116<h3 id="manual-setup-recommended-for-production">
115 手動設定(建議用於生產)117 手動設定(建議用於生產環境)
116</h3>118</h3>
117 119
118如果您偏好更受控的設定或需要企業提供者:120如果您偏好更受控的設定或需要企業提供者:
119 121
1201. **設定提供者存取**:1221. **設定提供者存取**:
121 * **Claude API**:建立並將 `ANTHROPIC_API_KEY` 儲存為遮罩 CI/CD 變數123 * **Claude API**:建立並將 `ANTHROPIC_API_KEY` 儲存為遮罩 CI/CD 變數
122 * **Amazon Bedrock**:**Configure GitLab** → **AWS OIDC** 並為 Amazon Bedrock 建立 IAM 角色124 * **Amazon Bedrock**:**設定 GitLab** → **AWS OIDC** 並為 Amazon Bedrock 建立 IAM 角色
123 * **Google Cloud 的 Agent Platform**:**Configure Workload Identity Federation for GitLab** → **GCP**125 * **Google Cloud 的 Agent Platform**:**為 GitLab 設定工作負載身分識別聯盟** → **GCP**
124 126
1252. **為 GitLab API 操作新增專案認證**:1272. **為 GitLab API 操作新增專案認證**:
126 * 預設使用 `CI_JOB_TOKEN`,或建立具有 `api` 範圍的專案存取令牌128 * 預設使用 `CI_JOB_TOKEN`,或建立具有 `api` 範圍的專案存取權杖
127 * 如果使用 PAT,將其儲存為 `GITLAB_ACCESS_TOKEN`(遮罩)129 * 如果使用 PAT,將其儲存為 `GITLAB_ACCESS_TOKEN`(遮罩)
128 130
1293. **在 `.gitlab-ci.yml` 中新增 Claude 工作**(請參閱下方的範例)1313. **在 `.gitlab-ci.yml` 中新增 Claude 工作**:使用 Claude API 的[快速設定](#quick-setup)工作,或來自[設定範例](#configuration-examples)的提供者工作
130 132
1314. **(選用)啟用提及驅動的觸發器**:1334. **(選用)啟用提及驅動的觸發**:
132 * 為「Comments (notes)」新增專案 webhook 到您的事件監聽器(如果您使用的話)134 * 為「評論(備註)」新增專案 webhook 至您的事件接聽程式(如果您使用的話)
133 * 當評論包含 `@claude` 時,讓監聽器使用 `AI_FLOW_INPUT` 和 `AI_FLOW_CONTEXT` 等變數呼叫管道觸發 API135 * 當評論包含 `@claude` 時,讓接聽程式使用 `AI_FLOW_INPUT` 和 `AI_FLOW_CONTEXT` 等變數呼叫管道觸發 API
134 136
135<h2 id="example-use-cases">137<h2 id="example-use-cases">
136 範例使用案例138 使用案例範例
137</h2>139</h2>
138 140
139<h3 id="turn-issues-into-mrs">141<h3 id="turn-issues-into-mrs">
140 將問題轉變為 MR142 將議題轉換為 MR
141</h3>143</h3>
142 144
143在問題評論中:145在議題評論中:
144 146
145```text theme={null}147```text wrap theme={null}
146@claude implement this feature based on the issue description148@claude implement this feature based on the issue description
147```149```
148 150
149Claude 分析問題和程式碼庫,在分支中寫入變更,並開啟 MR 供審查。151Claude 分析議題和程式碼庫,在分支中寫入變更,並開啟 MR 供審查。
150 152
151<h3 id="get-implementation-help">153<h3 id="get-implementation-help">
152 獲得實現幫助154 取得實作協助
153</h3>155</h3>
154 156
155在 MR 討論中:157在 MR 討論中:
156 158
157```text theme={null}159```text wrap theme={null}
158@claude suggest a concrete approach to cache the results of this API call160@claude suggest a concrete approach to cache the results of this API call
159```161```
160 162
161Claude 提出變更,新增具有適當快取的程式碼,並更新 MR。163Claude 提出變更建議,新增具有適當快取的程式碼,並更新 MR。
162 164
163<h3 id="fix-bugs-quickly">165<h3 id="fix-bugs-quickly">
164 快速修復錯誤166 快速修復錯誤
165</h3>167</h3>
166 168
167在問題或 MR 評論中:169在議題或 MR 評論中:
168 170
169```text theme={null}171```text wrap theme={null}
170@claude fix the TypeError in the user dashboard component172@claude fix the TypeError in the user dashboard component
171```173```
172 174
173Claude 定位錯誤,實現修復,並更新分支或開啟新的 MR。175Claude 定位錯誤,實作修復,並更新分支或開啟新的 MR。
174 176
175<h2 id="using-with-amazon-bedrock-and-google-cloud">177<h2 id="using-with-amazon-bedrock-and-google-cloud">
176 使用 Amazon Bedrock 和 Google Cloud178 搭配 Amazon Bedrock 和 Google Cloud 使用
177</h2>179</h2>
178 180
179對於企業環境,您可以在您的雲端基礎設施上完全執行 Claude Code,具有相同的開發人員體驗。181針對企業環境,您可以在自己的雲端基礎設施上完全執行 Claude Code,並享有相同的開發者體驗。
180 182
181<Tabs>183<Tabs>
182 <Tab title="Amazon Bedrock">184 <Tab title="Amazon Bedrock">
184 186
185 在使用 Amazon Bedrock 設定 Claude Code 之前,您需要:187 在使用 Amazon Bedrock 設定 Claude Code 之前,您需要:
186 188
187 1. 具有 Amazon Bedrock 存取權限的 AWS 帳戶,可存取所需的 Claude 模型189 1. 一個 AWS 帳戶,具有 Amazon Bedrock 對所需 Claude 模型的存取權限
188 2. 在 AWS IAM 中設定為 OIDC 身份提供者的 GitLab190 2. 在 AWS IAM 中將 GitLab 設定為 OIDC 身分提供者
189 3. 具有 Amazon Bedrock 權限和信任政策的 IAM 角色,限制於您的 GitLab 專案/refs191 3. 一個具有 Amazon Bedrock 權限的 IAM 角色,以及限制於您的 GitLab 專案/參考的信任政策
190 4. 用於角色假設的 GitLab CI/CD 變數:192 4. 用於角色假設的 GitLab CI/CD 變數:
191 * `AWS_ROLE_TO_ASSUME`(角色 ARN)193 * `AWS_ROLE_TO_ASSUME`(角色 ARN)
192 * `AWS_REGION`(Amazon Bedrock 區域)194 * `AWS_REGION`(Amazon Bedrock 區域)
195 197
196 設定 AWS 以允許 GitLab CI 工作透過 OIDC 假設 IAM 角色(無靜態金鑰)。198 設定 AWS 以允許 GitLab CI 工作透過 OIDC 假設 IAM 角色(無靜態金鑰)。
197 199
198 **必需的設定:**200 **必要設定:**
199 201
200 1. 啟用 Amazon Bedrock 並請求存取您的目標 Claude 模型202 1. 啟用 Amazon Bedrock 並要求存取您的目標 Claude 模型
201 2. 為 GitLab 建立 IAM OIDC 提供者(如果尚未存在)203 2. 如果尚未存在,請為 GitLab 建立 IAM OIDC 提供者
202 3. 建立由 GitLab OIDC 提供者信任的 IAM 角色,限制於您的專案和受保護的 refs204 3. 建立由 GitLab OIDC 提供者信任的 IAM 角色,限制於您的專案和受保護的參考
203 4. 為 Amazon Bedrock invoke API 附加最小權限205 4. 為 Amazon Bedrock 叫用 API 附加最小權限
204 206
205 **要儲存在 CI/CD 變數中的必需值:**207 使用 [Amazon Bedrock 工作範例](#configuration-examples)在執行時交換工作的 OIDC 令牌以取得暫時 AWS 認證。
206
207 * `AWS_ROLE_TO_ASSUME`
208 * `AWS_REGION`
209
210 在 Settings → CI/CD → Variables 中新增變數:
211
212 ```yaml theme={null}
213 # 對於 Amazon Bedrock:
214 - AWS_ROLE_TO_ASSUME
215 - AWS_REGION
216 ```
217
218 使用上面的 Amazon Bedrock 工作範例在執行時交換 GitLab 工作令牌以取得臨時 AWS 認證。
219 </Tab>208 </Tab>
220 209
221 <Tab title="Google Cloud's Agent Platform">210 <Tab title="Google Cloud's Agent Platform">
223 212
224 在使用 Google Cloud's Agent Platform 設定 Claude Code 之前,您需要:213 在使用 Google Cloud's Agent Platform 設定 Claude Code 之前,您需要:
225 214
226 1. 具有以下內容的 Google Cloud 專案:215 1. 一個 Google Cloud 專案,具有:
227 * 啟用 Google Cloud's Agent Platform API216 * 已啟用 Google Cloud's Agent Platform API
228 * 設定 Workload Identity Federation 以信任 GitLab OIDC217 * 已設定工作負載身分聯盟以信任 GitLab OIDC
229 2. 僅具有所需 Google Cloud's Agent Platform 角色的專用服務帳戶218 2. 一個專用服務帳戶,僅具有所需的 Google Cloud's Agent Platform 角色
230 3. 用於 WIF 的 GitLab CI/CD 變數:219 3. GitLab CI/CD 變數:
231 * `GCP_WORKLOAD_IDENTITY_PROVIDER`(完整資源名稱)220 * `GCP_WORKLOAD_IDENTITY_PROVIDER`(提供者資源名稱,不含 `//iam.googleapis.com/` 前綴,例如 `projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider`)
232 * `GCP_SERVICE_ACCOUNT`(服務帳戶電子郵件)221 * `GCP_SERVICE_ACCOUNT`(服務帳戶電子郵件)
222 * `GCP_PROJECT_ID`(Google Cloud 專案 ID)
233 223
234 ### 設定說明224 ### 設定說明
235 225
236 設定 Google Cloud 以允許 GitLab CI 工作透過 Workload Identity Federation 模擬服務帳戶。226 設定 Google Cloud 以允許 GitLab CI 工作透過工作負載身分聯盟模擬服務帳戶。
237 227
238 **必需的設定:**228 **必要設定:**
239 229
240 1. 啟用 IAM Credentials API、STS API 和 Google Cloud's Agent Platform API230 1. 啟用 IAM 認證 API、STS API 和 Google Cloud's Agent Platform API
241 2. 為 GitLab OIDC 建立 Workload Identity Pool 和提供者231 2. 為 GitLab OIDC 建立工作負載身分池和提供者
242 3. 建立具有 Google Cloud's Agent Platform 角色的專用服務帳戶232 3. 建立具有 Google Cloud's Agent Platform 角色的專用服務帳戶
243 4. 授予 WIF 主體權限以模擬服務帳戶233 4. 授予 WIF 主體權限以模擬服務帳戶
244 234
245 **要儲存在 CI/CD 變數中的必需值:**235 使用 [Agent Platform 工作範例](#configuration-examples)進行驗證,無需儲存金鑰。
246
247 * `GCP_WORKLOAD_IDENTITY_PROVIDER`
248 * `GCP_SERVICE_ACCOUNT`
249
250 在 Settings → CI/CD → Variables 中新增變數:
251
252 ```yaml theme={null}
253 # 對於 Google Cloud's Agent Platform:
254 - GCP_WORKLOAD_IDENTITY_PROVIDER
255 - GCP_SERVICE_ACCOUNT
256 - CLOUD_ML_REGION (例如,us-east5)
257 ```
258
259 使用上面的 Google Cloud's Agent Platform 工作範例在不儲存金鑰的情況下進行驗證。
260 </Tab>236 </Tab>
261</Tabs>237</Tabs>
262 238
264 設定範例240 設定範例
265</h2>241</h2>
266 242
267以下是您可以調整到您的管道的現成程式碼片段。243以下是您可以調整以適應您的管道的現成程式碼片段。
268
269<h3 id="basic-gitlab-ci-yml-claude-api">
270 基本 .gitlab-ci.yml (Claude API)
271</h3>
272
273```yaml theme={null}
274stages:
275 - ai
276
277claude:
278 stage: ai
279 image: node:24-alpine3.21
280 rules:
281 - if: '$CI_PIPELINE_SOURCE == "web"'
282 - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
283 variables:
284 GIT_STRATEGY: fetch
285 before_script:
286 - apk update
287 - apk add --no-cache git curl bash
288 - curl -fsSL https://claude.ai/install.sh | bash
289 script:
290 - /bin/gitlab-mcp-server || true
291 - >
292 claude
293 -p "${AI_FLOW_INPUT:-'Summarize recent changes and suggest improvements'}"
294 --permission-mode acceptEdits
295 --allowedTools "Bash Read Edit Write mcp__gitlab"
296 --debug
297 # Claude Code 將使用 CI/CD 變數中的 ANTHROPIC_API_KEY
298```
299 244
300<h3 id="amazon-bedrock-job-example-oidc">245<h3 id="amazon-bedrock-job-example-oidc">
301 Amazon Bedrock 工作範例 (OIDC)246 Amazon Bedrock 工作範例 (OIDC)
303 248
304**先決條件:**249**先決條件:**
305 250
306* 啟用 Amazon Bedrock 並存取您選擇的 Claude 模型251* Amazon Bedrock 已啟用,可存取您選擇的 Claude 模型
307* 在 AWS 中設定 GitLab OIDC,具有信任您的 GitLab 專案和 refs 的角色252* GitLab OIDC 已在 AWS 中設定,具有信任您的 GitLab 專案和 refs 的角色
308* 具有 Amazon Bedrock 權限的 IAM 角色(建議最小權限)253* 具有 Amazon Bedrock 權限的 IAM 角色(建議最小權限)
309 254
310**必需的 CI/CD 變數:**255**必需的 CI/CD 變數:**
311 256
312* `AWS_ROLE_TO_ASSUME`:Amazon Bedrock 存取的 IAM 角色的 ARN257* `AWS_ROLE_TO_ASSUME`:用於 Amazon Bedrock 存取的 IAM 角色 ARN
313* `AWS_REGION`:Amazon Bedrock 區域(例如,`us-west-2`)258* `AWS_REGION`:Amazon Bedrock 區域(例如 `us-west-2`)
259
260GitLab 從 `id_tokens:` 區塊鑄造工作的 OIDC 令牌,並將其公開為 `GITLAB_OIDC_TOKEN`。將 `aud` 設定為您在 AWS 的 IAM OIDC 身分提供者上設定的對象值,例如您的 GitLab 執行個體 URL。
314 261
315```yaml theme={null}262```yaml theme={null}
263stages:
264 - ai
265
316claude-bedrock:266claude-bedrock:
317 stage: ai267 stage: ai
318 image: node:24-alpine3.21268 image: node:24-alpine3.21
319 rules:269 rules:
320 - if: '$CI_PIPELINE_SOURCE == "web"'270 - if: '$CI_PIPELINE_SOURCE == "web"'
271 id_tokens:
272 GITLAB_OIDC_TOKEN:
273 aud: https://gitlab.example.com
321 before_script:274 before_script:
322 - apk add --no-cache bash curl jq git python3 py3-pip275 - apk add --no-cache bash curl jq git aws-cli
323 - pip install --no-cache-dir awscli
324 - curl -fsSL https://claude.ai/install.sh | bash276 - curl -fsSL https://claude.ai/install.sh | bash
325 # 交換 GitLab OIDC 令牌以取得 AWS 認證277 # The installer places claude in ~/.local/bin, which isn't on PATH in this image
326 - export AWS_WEB_IDENTITY_TOKEN_FILE="${CI_JOB_JWT_FILE:-/tmp/oidc_token}"278 - export PATH="$HOME/.local/bin:$PATH"
327 - if [ -n "${CI_JOB_JWT_V2}" ]; then printf "%s" "$CI_JOB_JWT_V2" > "$AWS_WEB_IDENTITY_TOKEN_FILE"; fi279 # Exchange the job's OIDC token for AWS credentials
280 - export AWS_WEB_IDENTITY_TOKEN_FILE="/tmp/oidc_token"
281 - printf "%s" "$GITLAB_OIDC_TOKEN" > "$AWS_WEB_IDENTITY_TOKEN_FILE"
328 - >282 - >
329 aws sts assume-role-with-web-identity283 aws sts assume-role-with-web-identity
330 --role-arn "$AWS_ROLE_TO_ASSUME"284 --role-arn "$AWS_ROLE_TO_ASSUME"
344 --debug298 --debug
345 variables:299 variables:
346 AWS_REGION: "us-west-2"300 AWS_REGION: "us-west-2"
301 CLAUDE_CODE_USE_BEDROCK: "1"
347```302```
348 303
349<Note>304<Note>
350 Amazon Bedrock 的模型 ID 包括區域特定的前綴(例如,`us.anthropic.claude-sonnet-4-6`)。如果您的工作流程支援,透過您的工作設定或提示傳遞所需的模型。305 Amazon Bedrock 的模型 ID 包含區域特定的前綴(例如 `us.anthropic.claude-sonnet-4-6`)。如果您的工作流程支援,請透過您的工作設定或提示傳遞所需的模型。
351</Note>306</Note>
352 307
353<h3 id="agent-platform-job-example-workload-identity-federation">308<h3 id="agent-platform-job-example-workload-identity-federation">
354 Agent Platform 工作範例 (Workload Identity Federation)309 Agent Platform 工作範例(工作負載身分聯盟)
355</h3>310</h3>
356 311
357**先決條件:**312**先決條件:**
358 313
359* 在您的 GCP 專案中啟用 Google Cloud 的 Agent Platform API314* Google Cloud 的 Agent Platform API 已在您的 GCP 專案中啟用
360* 設定 Workload Identity Federation 以信任 GitLab OIDC315* 工作負載身分聯盟已設定為信任 GitLab OIDC
361* 具有 Google Cloud 的 Agent Platform 權限的服務帳戶316* 具有 Google Cloud Agent Platform 權限的服務帳戶
362 317
363**必需的 CI/CD 變數:**318**必需的 CI/CD 變數:**
364 319
365* `GCP_WORKLOAD_IDENTITY_PROVIDER`:完整提供者資源名稱320* `GCP_WORKLOAD_IDENTITY_PROVIDER`:提供者資源名稱,不含 `//iam.googleapis.com/` 前綴,例如 `projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider`
366* `GCP_SERVICE_ACCOUNT`:服務帳戶電子郵件321* `GCP_SERVICE_ACCOUNT`:服務帳戶電子郵件
367* `CLOUD_ML_REGION`:Google Cloud 的 Agent Platform 區域(例如,`us-east5`)322* `GCP_PROJECT_ID`:Google Cloud 專案 ID
323* `CLOUD_ML_REGION`:Google Cloud Agent Platform 區域(例如 `us-east5`)
324
325GitLab 從 `id_tokens:` 區塊鑄造工作的 OIDC 令牌,並將其公開為 `GITLAB_OIDC_TOKEN`。將 `aud` 設定為您在工作負載身分池提供者上設定的對象值,例如您的 GitLab 執行個體 URL。工作將令牌寫入檔案,認證設定的 `credential_source` 項目告訴 Google 的驗證程式庫從該處讀取它。將 `GOOGLE_APPLICATION_CREDENTIALS` 設定為認證設定檔案使其可透過[應用程式預設認證](/docs/zh-TW/google-vertex-ai#3-configure-gcp-credentials)供 Claude Code 使用。
368 326
369```yaml theme={null}327```yaml theme={null}
328stages:
329 - ai
330
370claude-vertex:331claude-vertex:
371 stage: ai332 stage: ai
372 image: gcr.io/google.com/cloudsdktool/google-cloud-cli:slim333 image: gcr.io/google.com/cloudsdktool/google-cloud-cli:slim
373 rules:334 rules:
374 - if: '$CI_PIPELINE_SOURCE == "web"'335 - if: '$CI_PIPELINE_SOURCE == "web"'
336 id_tokens:
337 GITLAB_OIDC_TOKEN:
338 aud: https://gitlab.example.com
375 before_script:339 before_script:
376 - apt-get update && apt-get install -y git && apt-get clean340 - apt-get update && apt-get install -y git && apt-get clean
377 - curl -fsSL https://claude.ai/install.sh | bash341 - curl -fsSL https://claude.ai/install.sh | bash
378 # 透過 WIF 驗證到 Google Cloud(無下載的金鑰)342 # The installer places claude in ~/.local/bin, which isn't on PATH in this image
379 - >343 - export PATH="$HOME/.local/bin:$PATH"
380 gcloud auth login --cred-file=<(cat <<EOF344 # Write the job's OIDC token where credential_source expects it
345 - printf "%s" "$GITLAB_OIDC_TOKEN" > /tmp/oidc_token
346 # Write the WIF credential configuration to a file (no downloaded keys)
347 - |
348 cat > /tmp/cred.json <<EOF
381 {349 {
382 "type": "external_account",350 "type": "external_account",
383 "audience": "${GCP_WORKLOAD_IDENTITY_PROVIDER}",351 "audience": "//iam.googleapis.com/${GCP_WORKLOAD_IDENTITY_PROVIDER}",
384 "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",352 "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
385 "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${GCP_SERVICE_ACCOUNT}:generateAccessToken",353 "token_url": "https://sts.googleapis.com/v1/token",
386 "token_url": "https://sts.googleapis.com/v1/token"354 "credential_source": {
355 "file": "/tmp/oidc_token"
356 },
357 "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${GCP_SERVICE_ACCOUNT}:generateAccessToken"
387 }358 }
388 EOF359 EOF
389 )360 # Expose the credentials to Claude Code via Application Default Credentials
390 - gcloud config set project "$(gcloud projects list --format='value(projectId)' --filter="name:${CI_PROJECT_NAMESPACE}" | head -n1)" || true361 - export GOOGLE_APPLICATION_CREDENTIALS=/tmp/cred.json
362 # Authenticate the gcloud CLI with the same credential configuration
363 - gcloud auth login --cred-file=/tmp/cred.json
364 - gcloud config set project "$GCP_PROJECT_ID"
391 script:365 script:
392 - /bin/gitlab-mcp-server || true366 - /bin/gitlab-mcp-server || true
393 - >367 - >
399 --debug373 --debug
400 variables:374 variables:
401 CLOUD_ML_REGION: "us-east5"375 CLOUD_ML_REGION: "us-east5"
376 CLAUDE_CODE_USE_VERTEX: "1"
377 ANTHROPIC_VERTEX_PROJECT_ID: "$GCP_PROJECT_ID"
402```378```
403 379
404<Note>380<Note>
405 使用 Workload Identity Federation,您不需要儲存服務帳戶金鑰。使用儲存庫特定的信任條件和最小權限服務帳戶。381 使用工作負載身分聯盟,您不需要儲存服務帳戶金鑰。使用存放庫特定的信任條件和最小權限服務帳戶。
406</Note>382</Note>
407 383
408<h2 id="best-practices">384<h2 id="best-practices">
413 CLAUDE.md 設定389 CLAUDE.md 設定
414</h3>390</h3>
415 391
416在儲存庫根目錄建立 `CLAUDE.md` 檔案以定義編碼標準、審查標準和專案特定規則。Claude 在執行期間讀取此檔案並在提出變更時遵循您的慣例。392在儲存庫根目錄建立 `CLAUDE.md` 檔案,以定義編碼標準、審查條件和專案特定規則。Claude 在執行期間會讀取此檔案,並在提出變更時遵循您的慣例。
417 393
418<h3 id="security-considerations">394<h3 id="security-considerations">
419 安全考量395 安全考量
420</h3>396</h3>
421 397
422**永遠不要將 API 金鑰或雲端認證提交到您的儲存庫**。始終使用 GitLab CI/CD 變數:398**絕不將 API 金鑰或雲端認證提交到您的儲存庫**。請務必使用 GitLab CI/CD 變數:
423 399
424* 將 `ANTHROPIC_API_KEY` 新增為遮罩變數(並根據需要保護它)400* 將 `ANTHROPIC_API_KEY` 新增為遮罩變數(如需要可保護它)
425* 盡可能使用提供者特定的 OIDC(無長期金鑰)401* 盡可能使用提供者特定的 OIDC(無長期金鑰)
426* 限制工作權限和網路出口402* 限制工作權限和網路出口
427* 像審查任何其他貢獻者一樣審查 Claude 的 MR403* 像審查任何其他貢獻者一樣審查 Claude 的 MR
430 最佳化效能406 最佳化效能
431</h3>407</h3>
432 408
433* 保持 `CLAUDE.md` 專注和簡潔409* 保持 `CLAUDE.md` 專注且簡潔
434* 提供清晰的問題/MR 描述以減少反覆410* 提供清晰的議題/MR 描述以減少迭代
435* 設定合理的工作逾時以避免失控執行411* 在執行器中盡可能快取 npm 和套件安裝
436* 在可能的情況下在 runners 中快取 npm 和套件安裝
437 412
438<h3 id="ci-costs">413<h3 id="ci-costs">
439 CI 成本414 CI 成本
440</h3>415</h3>
441 416
442使用 Claude Code 與 GitLab CI/CD 時,請注意相關成本:417使用 Claude Code 搭配 GitLab CI/CD 時,請注意相關成本:
443 418
444* **GitLab Runner 時間**:419* **GitLab Runner 時間**:
445 * Claude 在您的 GitLab runners 上執行並消耗計算分鐘數420 * Claude 在您的 GitLab 執行器上執行,並消耗計算分鐘數
446 * 有關詳細資訊,請參閱您的 GitLab 計畫的 runner 計費421 * 請參閱您的 GitLab 方案的執行器計費詳細資訊
447 422
448* **API 成本**:423* **API 成本**:
449 * 每次 Claude 互動根據提示和回應大小消耗令牌424 * 每次 Claude 互動根據提示和回應大小消耗權杖
450 * 令牌使用量因任務複雜性和程式碼庫大小而異425 * 權杖使用量因任務複雜性和程式碼庫大小而異
451 * 有關詳細資訊,請參閱 [Anthropic 定價](https://platform.claude.com/docs/zh-TW/about-claude/pricing)426 * 詳細資訊請參閱 [Anthropic 定價](https://platform.claude.com/docs/en/about-claude/pricing)
452 427
453* **成本最佳化提示**:428* **成本最佳化提示**:
454 * 使用特定的 `@claude` 命令以減少不必要的轉換429 * 使用特定的 `@claude` 命令以減少不必要的回合
455 * 設定適當的 `max_turns` 和工作逾時值430 * 設定適當的 `--max-turns` 和工作 `timeout` 值
456 * 限制並行以控制平行執行431 * 限制並行以控制平行執行
457 432
458<h2 id="security-and-governance">
459 安全和治理
460</h2>
461
462* 每個工作都在具有受限網路存取的隔離容器中執行
463* Claude 的變更透過 MR 流動,以便審查者看到每個差異
464* 分支保護和核准規則適用於 AI 生成的程式碼
465* Claude Code 使用工作區範圍的權限以限制寫入
466* 成本保持在您的控制下,因為您帶來自己的提供者認證
467
468<h2 id="troubleshooting">433<h2 id="troubleshooting">
469 疑難排解434 疑難排解
470</h2>435</h2>
471 436
472<h3 id="claude-not-responding-to-claude-commands">437<h3 id="claude-not-responding-to-claude-commands">
473 Claude 不回應 @claude 命令438 Claude 未回應 @claude 指令
474</h3>439</h3>
475 440
476* 驗證您的管道正在被觸發(手動、MR 事件或透過 note 事件監聽器/webhook)441* 驗證您的管道是否被觸發(手動、MR 事件或透過筆記事件監聽器/webhook)
477* 確保 CI/CD 變數(`ANTHROPIC_API_KEY` 或雲端提供者設定)存在且未遮罩442* 確保您的 `ANTHROPIC_API_KEY` 或雲端提供者變數存在
478* 檢查評論是否包含 `@claude`(不是 `/claude`)以及您的提及觸發器是否已設定443* 檢查評論是否包含 `@claude`(不是 `/claude`),以及您的提及觸發器是否已設定
479 444
480<h3 id="job-can’t-write-comments-or-open-mrs">445<h3 id="job-can’t-write-comments-or-open-mrs">
481 工作無法寫入評論或開啟 MR446 工作無法寫入評論或開啟 MR
483 448
484* 確保 `CI_JOB_TOKEN` 對專案具有足夠的權限,或使用具有 `api` 範圍的專案存取令牌449* 確保 `CI_JOB_TOKEN` 對專案具有足夠的權限,或使用具有 `api` 範圍的專案存取令牌
485* 檢查 `mcp__gitlab` 工具是否在 `--allowedTools` 中啟用450* 檢查 `mcp__gitlab` 工具是否在 `--allowedTools` 中啟用
486* 確認工作在 MR 的上下文中執行或透過 `AI_FLOW_*` 變數有足夠的上下文451* 確認工作在 MR 的上下文中執行,或透過 `AI_FLOW_*` 變數有足夠的上下文
487 452
488<h3 id="authentication-errors">453<h3 id="authentication-errors">
489 驗證錯誤454 驗證錯誤
490</h3>455</h3>
491 456
492* **對於 Claude API**:確認 `ANTHROPIC_API_KEY` 有效且未過期457* **針對 Claude API**:確認 `ANTHROPIC_API_KEY` 有效且未過期
493* **對於 Amazon Bedrock 或 Google Cloud 的 Agent Platform**:驗證 OIDC/WIF 設定、角色模擬和祕密名稱;確認區域和模型可用性458* **針對 Amazon Bedrock 或 Google Cloud 的 Agent Platform**:驗證 OIDC/WIF 設定、角色模擬和密碼名稱;確認區域和模型可用性
494 459
495<h2 id="advanced-configuration">460<h2 id="advanced-configuration">
496 進階設定461 進階設定
500 常見參數和變數465 常見參數和變數
501</h3>466</h3>
502 467
503Claude Code 支援這些常用輸入:468使用這些 CLI 旗標、GitLab 關鍵字和變數來控制您工作中的 Claude Code 執行:
504 469
505* `prompt` / `prompt_file`:內聯提供說明(`-p`)或透過檔案470* `-p`:提供內聯指示,例如 `claude -p "Review this MR"`
506* `max_turns`:限制來回反覆的次數471* `--max-turns`:限制往返迭代的次數
507* `timeout_minutes`:限制總執行時間472* `timeout`:使用 GitLab 的工作層級 `timeout` 關鍵字限制總工作執行時間,例如 `timeout: 30m`
508* `ANTHROPIC_API_KEY`:Claude API 所需(不用於 Amazon Bedrock 或 Google Cloud 的 Agent Platform)473* `ANTHROPIC_API_KEY`:Claude API 所需(不用於 Amazon Bedrock 或 Google Cloud 的 Agent Platform)
509* 提供者特定環境:`AWS_REGION`、Google Cloud 的 Agent Platform 的專案/區域變數474* 提供者特定環境:`AWS_REGION`、Google Cloud 的 Agent Platform 的專案/區域變數
510 475
516 自訂 Claude 的行為481 自訂 Claude 的行為
517</h3>482</h3>
518 483
519您可以透過兩種主要方式指導 Claude:484您可以透過兩種主要方式引導 Claude:
520 485
5211. **CLAUDE.md**:定義編碼標準、安全要求和專案慣例。Claude 在執行期間讀取此檔案並遵循您的規則。4861. **CLAUDE.md**:定義編碼標準、安全性需求和專案慣例。Claude 在執行期間讀取此檔案並遵循您的規則。
5222. **自訂提示**:透過工作中的 `prompt`/`prompt_file` 傳遞任務特定的說明。為不同的工作使用不同的提示(例如,審查、實現、重構)。4872. **自訂提示**:透過工作中的 `-p` 傳遞特定任務的指示。為不同的工作使用不同的提示(例如,審查、實作、重構)。