在來源步驟中建置失敗

建立並執行建置之後,您的建置未順利完成,且您在來源步驟中收到建置失敗的訊息。

如果您在建置期間收到來源步驟失敗的訊息,請檢查建置的日誌,以判斷問題的主要原因。

錯誤訊息範例

Summary:  Failed to execute build run
Status:   Failed
Reason:   buildrun step step-source-default failed in pod <BUILDRUN_NAME>-zvcc9-pod-trsq2, for detailed information: ibmcloud ce buildrun logs -n <BUILDRUN_NAME>

執行 ibmcloud ce buildrun logs 指令。 聚焦於失敗步驟的日誌,

ibmcloud ce buildrun logs -n <BUILDRUN_NAME>
[...]
<BUILDRUN_NAME>-zvcc9-pod-trsq2/step-source-default:
{"level":"info","ts":1625217529.370393,"logger":"git","msg":"ssh","path":"/usr/bin/ssh","version":"OpenSSH_8.0p1, OpenSSL 1.1.1g FIPS  21 Apr 2020"}
{"level":"info","ts":1625217529.3847454,"logger":"git","msg":"git","path":"/usr/bin/git","version":"git version 2.27.0"}
{"level":"info","ts":1625217529.3940003,"logger":"git","msg":"git-lfs","path":"/usr/bin/git-lfs","version":"git-lfs/2.11.0 (GitHub; linux amd64; go 1.14.4)"}
{"level":"debug","ts":1625217529.3940916,"logger":"git","msg":"/usr/bin/git clone --quiet --no-tags --branch main --depth 1 --single-branch -- https://github.com/IBM/CodeEngineX /workspace/source"}
{"level":"error","ts":1625217529.58695,"logger":"git","msg":"git command failed","command":"/usr/bin/git clone --quiet --no-tags --branch main --depth 1 --single-branch -- https://github.com/IBM/CodeEngineX /workspace/source","output":"fatal: could not read Username for 'https://github.com': terminal prompts disabled","error":"fatal: could not read Username for 'https://github.com': terminal prompts disabled (exit code 128)","stacktrace":"main.git\n\tgithub.com/shipwright-io/build/cmd/git/main.go:324\nmain.clone\n\tgithub.com/shipwright-io/build/cmd/git/main.go:277\nmain.runGitClone\n\tgithub.com/shipwright-io/build/cmd/git/main.go:115\nmain.Execute\n\tgithub.com/shipwright-io/build/cmd/git/main.go:98\nmain.checkAndRun\n\tgithub.com/shipwright-io/build/cmd/git/main.go:90\nmain.main\n\tgithub.com/shipwright-io/build/cmd/git/main.go:70\nruntime.main\n\truntime/proc.go:204"}
{"level":"error","ts":1625217529.587297,"logger":"git","msg":"program failed with an error","error":"fatal: could not read Username for 'https://github.com': terminal prompts disabled (exit code 128)","stacktrace":"main.Execute\n\tgithub.com/shipwright-io/build/cmd/git/main.go:100\nmain.checkAndRun\n\tgithub.com/shipwright-io/build/cmd/git/main.go:90\nmain.main\n\tgithub.com/shipwright-io/build/cmd/git/main.go:70\nruntime.main\n\truntime/proc.go:204"}
[...]

錯誤文字會根據發生的錯誤而不同。 下表說明此實務範例的錯誤文字及潛在主要原因。

Git 來源失敗步驟的錯誤文字及根案例。
錯誤訊息包含 潛在主要原因
terminal prompts disabled -儲存庫不存在。
-來源 URL 是使用 HTTP 通訊協定所提供,但儲存庫是專用的,因此需要 SSH 通訊協定。 使用了錯誤的通訊協定。
Host key verification failed -已使用 SSH 通訊協定提供來源 URL,但未提供任何密鑰。 使用了錯誤的通訊協定,或密鑰遺漏或不正確。
Permission denied (publickey) -已使用 SSH 通訊協定提供來源 URL,但密鑰遺漏或不正確。
Couldn't find remote ref -建置中指定的修訂 (分支名稱、標籤名稱、確定 ID) 不存在。
Your SSH key has expired. -SSH 金鑰已過期。

請嘗試下列其中一個解決方案。

不論您是在主控台或 CLI 中執行建置,請使用 CLI 來疑難排解您的建置問題。

  1. 執行 ibmcloud ce buildrun get --name BUILDRUN_NAME 指令,以顯示建置執行的詳細資料。
  2. 檢閱指令輸出中的 Reason

在檢查日誌並識別潛在主要原因之後,請使用下列解決動作來協助您解決問題。

在建置期間解析不存在的儲存庫

使用下列指令來更新現有建置,以參照 Git 儲存庫來源並提交建置執行。

  1. 使用 ibmcloud ce build update 指令來更新建置配置; 例如:

    ibmcloud ce build update --name <BUILD_NAME> --source <GIT_REPO>
    
  2. 使用 ibmcloud ce buildrun submit 指令來提交新的建置執行。 對於 buildrun submit 指令,您必須指定 --build 選項,以提供建置配置的名稱。 您可以選擇性地指定 --name 選項,以提供這項建置執行的名稱。 如果您指定 --name 選項,請確定您使用的建置執行名稱與失敗的建置執行名稱不同,或確定您使用 ibmcloud ce buildrun delete 指令來刪除失敗的建置執行。 例如,

    ibmcloud ce buildrun submit --build <BUILD_NAME> --name <BUILDRUN_NAME>
    

解決建置期間的通訊協定錯誤或遺漏密鑰

Git 儲存庫的 URL 可以使用 HTTP 或 SSH 通訊協定來指定。 GitHub 和 GitLab 提供一種在 Git 使用者介面中切換 URL 格式的方式。 HTTP 通訊協定不需要鑑別,但只能在儲存庫為公用時使用。 對於專用儲存庫,您必須使用 SSH 通訊協定,並為儲存庫提供密鑰。 GitHub Enterprise 設定中的儲存庫可以是公用的,但仍需要鑑別,而且那些 GitHub Enterprise 儲存庫也只能使用 SSH 通訊協定。

對於公用儲存庫

如果公用儲存庫失敗,請更新現有建置以使用 Git 儲存庫的 HTTP URL,然後執行建置。

  1. 使用 ibmcloud ce build update 指令來更新建置配置,以使用 Git 儲存庫的 HTTP URL; 例如,

    ibmcloud ce build update --name <BUILD_NAME> --source <GIT_REPO>
    
  2. 使用 ibmcloud ce buildrun submit 指令來提交新的建置執行。 對於 buildrun submit 指令,您必須指定 --build 選項,以提供建置配置的名稱。 您可以選擇性地指定 --name 選項,以提供這項建置執行的名稱。 如果您指定 --name 選項,請確定您使用的建置執行名稱與失敗的建置執行名稱不同,或確定您使用 ibmcloud ce buildrun delete 指令來刪除失敗的建置執行。 例如,

    ibmcloud ce buildrun submit --build <BUILD_NAME> --name <BUILDRUN_NAME>
    

對於專用儲存庫

如果專用儲存庫發生失敗,請建立 SSH 密鑰並使用 SSH 通訊協定。 SSH 密鑰包含用來存取專用儲存庫的認證,該專用儲存庫包含用來建置容器映像檔的原始碼。 SSH 密鑰也用作 Git 儲存庫存取密鑰。 SSH 密鑰包含私密金鑰,而對應的公開金鑰與 Git 儲存庫提供者一起儲存。 如需建立金鑰組並將公用組件儲存在 GitHub 或 GitLab中的相關資訊,請參閱 存取專用程式碼儲存庫。 在您可以將私密金鑰檔案上傳至 Code Engine之前,請務必不要使用通行詞組來加密私密金鑰檔案。 私密金鑰檔的格式可能不同,這使得評量檔案是否已加密變得很複雜。 視用來建立金鑰組的 ssh-keygen 工具版本而定,檔案可能具有下列其中一個標頭:

  • 如果檔案以 -----BEGIN RSA PRIVATE KEY----- 開頭,則會使用 PEM 格式,並以舊版 ssh-keygen 建立。 如果檔案使用通行詞組進行加密,則通常會包含如下所示的行: Proc-Type: 4,ENCRYPTED

  • 如果檔案以 -----BEGIN OPENSSH PRIVATE KEY----- 開頭,則會以較新 ssh-keygen 版本來建立。 若要驗證是否使用通行詞組來加密,請執行 ssh-keygen -p -f <ID_FILE> 指令。

    ssh-keygen -p -f <ID_FILE>   
        Enter old passphrase:
    
    ssh-keygen -p -f <ID_FILE>
        Key has comment '<COMMENT>'
    Enter new passphrase (empty for no passphrase):
    

    您可以使用 Ctrl+C 來跳出指令。 如果指令需要舊的通行詞組 (第一個範例),則原始檔案已加密,否則它會直接要求新檔案的通行詞組 (第二個範例)。

    若要解密已加密的私密金鑰檔,請執行下列指令,並將新的通行詞組留空。

    $ ssh-keygen -p -f <ID_FILE>
    
    Enter old passphrase: <PASSPHRASE>
    Key has comment '<COMMENT>'
    Enter new passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved with the new passphrase.
    

    這個指令會修改私密金鑰檔。 如果您需要保留加密版本,請先建立副本。

若要建立 SSH 密鑰並使用 SSH 通訊協定,

  1. 執行 ibmcloud ce secret create --format ssh 指令。 SSH 密鑰也用作 Git 儲存庫存取密鑰。 SSH_KEY_PATH 需要指向符合帳戶中公開金鑰或儲存庫中部署金鑰的私密金鑰檔。 這個指令需要名稱和金鑰路徑,也容許其他選用引數,例如已知 hosts 檔的路徑。 如果您指定 --known-hosts-path 選項,請在已知 hosts 檔中包含 Git 儲存庫的主機,例如 github.comgitlab.com。 如需相關資訊,請參閱 存取專用程式碼儲存庫

    ibmcloud ce secret create --format ssh --name <GIT_REPO_SECRET> --key-path <SSH_KEY_PATH> --known-hosts-path  <PATH_TO_KNOWN_HOSTS_FILE>
    
  2. 使用 ibmcloud ce build update 指令來更新建置配置,以使用 Git 儲存庫的 SSH URL 並參照 SSH 密鑰 <GIT_REPO_SECRET>。 例如,

    ibmcloud ce build update --name <BUILD_NAME> --source <GIT_REPO> --git-repo-secret <GIT_REPO_SECRET>
    

    在前一個範例中,使用來源的 git@ 字首 (例如 --source git@github.com:IBM/CodeEngine.git) 來指定 SSH URL。

建置期間錯誤修訂的解決方案

建置配置會使用來源儲存庫的 URL 及選擇性地使用修訂來指定來源儲存庫。 修訂可以是分支或標籤的名稱,也可以是確定 ID。 依預設,會建置 main 分支。 請檢閱錯誤訊息,以取得已指定但不存在之內容的相關資訊。

  1. 使用 ibmcloud ce build update 指令來更新建置配置,以使用正確的修訂 (或確定); 例如,

    ibmcloud ce build update --name <BUILD_NAME> --commit <COMMIT>
    
  2. 使用 ibmcloud ce buildrun submit 指令來提交新的建置執行。 對於 buildrun submit 指令,您必須指定 --build 選項,以提供建置配置的名稱。 您可以選擇性地指定 --name 選項,以提供這項建置執行的名稱。 如果您指定 --name 選項,請確定您使用的建置執行名稱與失敗的建置執行名稱不同,或確定您使用 ibmcloud ce buildrun delete 指令來刪除失敗的建置執行。 例如,

    ibmcloud ce buildrun submit --build <BUILD_NAME> --name <BUILDRUN_NAME>
    

建置期間過期 SSH 金鑰的解決方案

當您使用 SSH 金鑰來連接至來源儲存庫,且收到指出 SSH 金鑰已過期的錯誤時,請務必檢查您在建置失敗時用作程式碼儲存庫存取密鑰之 SSH 金鑰的設定。

您必須知道如何建立 SSH 金鑰,是否為特定使用者建立金鑰,或 SSH 金鑰是否為儲存庫的 Git 部署金鑰。 可能您已指定金鑰的有效期限。 設定金鑰的有效期限是 GitLab的功能。

IBM Cloud® Continuous Delivery 基於 GitLab。 如需相關資訊,請參閱 Continuous Delivery Git 儲存庫及問題追蹤

若要解決此錯誤,請採取下列動作。

  • 如果您知道您在 Code Engine中使用的 SSH 金鑰,請在 GitLab中使用相同的 SSH 公開金鑰來更新部署或使用者金鑰。 使用更新時,請不要使用有效期限或更新至不同的到期日。 因為您在 Code Engine的密鑰中使用相同的 SSH 金鑰,所以您不需要在 Code Engine中更新程式碼儲存庫存取密鑰。

  • 更新程式碼儲存庫存取密鑰以使用新的 SSH 金鑰。

    1. 在 GitLab中,使用 SSH 公開金鑰來建立部署金鑰或使用者金鑰。

    2. 在 Code Engine中,更新程式碼儲存庫存取密鑰以使用新的 SSH 私密金鑰。

      例如,假設您想要更新 mysecret-ssh 程式碼儲存庫存取密鑰。 使用 ibmcloud ce secret update --format ssh 指令來更新密鑰,以鑑別 Git 儲存庫。

      ibmcloud ce secret update --format ssh --name mysecret-ssh --key-path $HOME/.ssh/id_rsa --known-hosts-path $HOME/.ssh/known_hosts
      

如需使用程式碼儲存庫的 SSH 金鑰的相關資訊,請參閱 存取專用程式碼儲存庫