DevSecOps故障排除
使用這些技巧來協助排除您在使用 DevSecOps 時可能遇到的問題。
一般疑難排解方法
-
如果使用者介面緩慢或日誌無法載入,請重新載入頁面。
-
在 狀態頁面 上檢查服務中斷
-
重新執行管線。
手動升級觸發器
IBM 環境問題
由於 Git 的速率限制,管道執行速度較慢
管道執行看起來較慢,管道執行需要較長時間來執行、完成。
此外,在日誌的各個地方都可以找到下列項目:
Unable to use this tool because the git API rate limit is exceeded. Please try again in <n> minutes.
管道內部使用 Git API 請求 (設定 Git 狀態、建立/更新問題...)。 Git 的速率限制為
為了克服 Git 的速率限制問題:
- 從 Git 證據櫃遷移至 COS 證據櫃(也稱為僅 COS)。 請參閱 IBM Cloud 文件 中的相應章節。
- 為管道和/或觸發器使用不同的 Git 令牌。
儲存器化作業的檢查登錄步驟失敗,發生錯誤
IBM Cloud 登錄提供有限配額,推送太多映像檔可以超出。
- 移至映像檔並刪除不需要的映像檔。
- 重新執行管線。
您可以使用下列指令來檢查配額限制及使用情形:
ibmcloud cr quota
未顯示步驟的日誌
這是 Tekton 環境的問題。
請嘗試重新載入頁面。 使用下載按鈕來下載日誌。
範本及管線問題
作業已取消,因為無法存取基本映像檔
請檢查 artifactory 認證是否正確。 可在這裡建立新的 artifactory 記號。 您可以執行下列指令來手動建立密鑰:
kubectl create secret docker-registry mysecret \
--dry-run \
--docker-server=<artifactory-server-domain> \
--docker-username=<username> \
--docker-password=<artifactory token> \
--docker-email=<email> \
-o yaml
它會輸出類似下列的內容:
apiVersion: v1
data:
.dockerconfigjson: <your secret>
kind: Secret
metadata:
creationTimestamp: null
name: regcred
type: kubernetes.io/dockerconfigjson
在管線內容中,將 artifactory-dockerconfigjson 參數更新為 .dockerconfigjson 值。
如需相關資訊,請參閱 kubectl documentation on creating a secret(: external)。
管線提早失敗
當管線提早失敗時,出現下列訊息:
Pipeline could not run, resource failed to apply - Kind: "Secret", Name: "pipeline-pull-secret" ResourceError
在此情況下,管線中發生失敗,因為它未啟動。 因此,沒有日誌可用。
此管道所使用的從 IBM 擷取 Docker 影像的 dockerconfig.json 秘訣 Container Registry 並不正確。
此密鑰可能不正確,或與此密鑰相關聯的 API 金鑰已輪替或撤銷。
產生一個新的密鑰 dockerconfig.json,然後在您的管道中使用此新密鑰值(可作為管道參數,或儲存於 Secrets Manager )。
若要產生新的 dockerconfig.json,請執行下列指令:
kubectl create secret docker-registry my-registry-secret \
-o json \
--dry-run=client \
--docker-server=icr.io \
--docker-username=iamapikey \
--docker-email=john-doe@ibm.com \
--docker-password=<apikey> \
| jq -r '.data[".dockerconfigjson"]'
其中 <apikey> 是您的 IBM Cloud 雲端 API 金鑰或服務 ID API 金鑰。
管線無法從多個 artifactory 儲存庫取回映像檔
管線已順利從一個儲存庫取回映像檔,但未從另一個儲存庫取回映像檔。
管線失敗,因為它配置為從單一儲存庫取回映像檔。
手動建立新的 artifactory dockerconfigjson 密鑰,以支援對多個儲存庫進行鑑別。
若要支援鑑別從 Artifactory中的多個儲存庫取回映像檔,請產生新的 dockerconfigjson,並將密鑰類型 artifactory-dockerconfigjson 環境內容新增至一個以上管線。
下列 Script 是用來產生 artifactory dockerconfigjson 的範例,它提供兩個不同 artifactory 儲存庫的鑑別詳細資料。 這是可自訂的 Script。
必要條件
必須安裝 kubectl 和 jq 指令。
步驟
-
開啟以 LF (換行) 字元模式行尾來儲存檔案的文字編輯器。
-
建立檔案並複製下列 Script 的內容:
dockerconfig_1=$(kubectl create secret docker-registry my-registry-secret \ --output json \ --dry-run=client \ --docker-server="<artifactory_repo_host>" \ --docker-username="<email>" \ --docker-email="<email>" \ --docker-password="<artifactory_token>" \ | jq -r '.data[".dockerconfigjson"]') dockerconfig_2=$(kubectl create secret docker-registry my-registry-secret \ --output json \ --dry-run=client \ --docker-server="<second_repo_host>" \ --docker-username="<email>" \ --docker-email="<email>" \ --docker-password="<second_artifactory_token>" \ | jq -r '.data[".dockerconfigjson"]') echo $dockerconfig_1 | base64 -d > first_secret.json echo $dockerconfig_2 | base64 -d > second_secret.json new_dockerconfig=$(jq -s '.[0] * .[1]' first_secret.json second_secret.json | base64 -w0) echo ${new_dockerconfig} > final_dockerconfig.txt -
將位置保留元值取代為實際鑑別詳細資料:
- 將
<artifactory_repo_host>取代為第一個儲存庫的鏈結。 - 將
<artifactory_token>取代為第一個儲存庫的鑑別記號。 - 將
<email>取代為與鑑別相關聯的電子郵件。 - 將
<second_repo_host>取代為第二個儲存庫的鏈結。 - 將
<second_artifactory_token>取代為第二個儲存庫的鑑別記號。
- 將
-
儲存檔案。
-
請確定檔案儲存在具有寫入權的目錄中。
-
執行 Script。
-
在
artifactory-dockerconfigjson的管線環境內容中,新增final_dockerconfig.txt的內容作為密鑰。 如果您使用 Secrets Manager 或 Key Protect,請使用適當的技術來儲存此檔案的內容。
由於缺少子模組檔案,CRA 或 Docker 建立失敗
當 CRA 或 Docker 等管道階段建立失敗時,您可能會看到類似的錯誤訊息:
failed to calculate checksum of ref moby::...: failed to walk /var/lib/docker/tmp/buildkit-mount.../common-dev-assets/module-assets/ci: lstat ... no such file or directory
此錯誤發生是因為您的儲存庫包含 Git 子模組,但管道預設不會複製子模組。 每個管道階段都在自己的容器中執行,並對 repository 執行全新的 checkout,因此除非明確初始化,否則會遺失子模組的內容。
為了解決此問題,您必須確保在每個需要 Git 子模組的階段中,該子模組皆已完成初始化。 針對 CRA,您可以將子模組初始化加入自訂的 CRA 指令碼。
例如,更新您的腳本以包含:
git submodule update --init --recursive
這可確保子模組在 CRA 建立程序執行前可用。
映像檔簽署問題
如果映像檔簽署作業失敗,請參閱 映像檔簽署文件,以驗證已正確產生並儲存簽署金鑰。
在管線配置中未定義「動態掃描階段」的相關問題
「CI 管線」執行失敗,發生錯誤。
當 CI 管線配置不包含執行動態掃描的作業定義時,會發生錯誤。 在 .pipeline-config.yaml 中新增下列 Snippet,並自訂步驟以符合您的應用程式。
dynamic-scan:
dind: true
abort_on_failure: false
image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
script: |
#!/usr/bin/env bash
echo "Please insert script to invoke/execute dynamic scan tool like OWASP ZAP on the built and deployed application."
如需階段的相關資訊,請參閱 自訂 Script。
取得支援
- 您可以檢閱 Stack Overflow,看看其他使用者是否遇到相同的問題。 使用論壇提問時,請標記您的問題為 "ibm-cloud",並 "DevSecOps",以便 IBM Cloud 開發團隊看到。
- IBM Cloud 的 AI 助手,它由 IBM 的 watsonx 驅動,旨在幫助您瞭解如何在 IBM Cloud 工作,以及如何利用可用的產品目錄建立解決方案。 請參閱 取得 AI 助理的協助。
- 如果您仍無法解決問題,則可以開立支援案例。 如需有關開啟支援個案、個案嚴重性和回應時間的資訊,請參閱 處理支援個案 或 升級支援個案。