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 的速率限制為 API 請求次數,每小時每張 Git 授權憑證。 當即將達到這個限制時,有一個內部管道機制會暫停請求 - 因此也會暫停管道執行 - 以防止管道執行提早中止。 這可能會導致管道運行時間過長。

為了克服 Git 的速率限制問題:

  1. 從 Git 證據櫃遷移至 COS 證據櫃(也稱為僅 COS)。 請參閱 IBM Cloud 文件 中的相應章節。
  2. 為管道和/或觸發器使用不同的 Git 令牌。

儲存器化作業的檢查登錄步驟失敗,發生錯誤

儲存配額錯誤
儲存配額錯誤

IBM Cloud 登錄提供有限配額,推送太多映像檔可以超出。

  1. 移至映像檔並刪除不需要的映像檔。
  2. 重新執行管線。

您可以使用下列指令來檢查配額限制及使用情形:

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 值。

更新artifactory-dockerconfigjson“
更新artifactory-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。

必要條件

必須安裝 kubectljq 指令。

步驟

  1. 開啟以 LF (換行) 字元模式行尾來儲存檔案的文字編輯器。

  2. 建立檔案並複製下列 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
    
  3. 將位置保留元值取代為實際鑑別詳細資料:

    • <artifactory_repo_host> 取代為第一個儲存庫的鏈結。
    • <artifactory_token> 取代為第一個儲存庫的鑑別記號。
    • <email> 取代為與鑑別相關聯的電子郵件。
    • <second_repo_host> 取代為第二個儲存庫的鏈結。
    • <second_artifactory_token> 取代為第二個儲存庫的鑑別記號。
  4. 儲存檔案。

  5. 請確定檔案儲存在具有寫入權的目錄中。

  6. 執行 Script。

  7. 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 管道運行動態掃描階段
失敗 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 助理的協助
  • 如果您仍無法解決問題,則可以開立支援案例。 如需有關開啟支援個案、個案嚴重性和回應時間的資訊,請參閱 處理支援個案升級支援個案