在來源步驟中建置失敗
建立並執行建置之後,您的建置未順利完成,且您在來源步驟中收到建置失敗的訊息。
如果您在建置期間收到來源步驟失敗的訊息,請檢查建置的日誌,以判斷問題的主要原因。
錯誤訊息範例
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"}
[...]
錯誤文字會根據發生的錯誤而不同。 下表說明此實務範例的錯誤文字及潛在主要原因。
| 錯誤訊息包含 | 潛在主要原因 |
|---|---|
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 來疑難排解您的建置問題。
- 執行
ibmcloud ce buildrun get --name BUILDRUN_NAME指令,以顯示建置執行的詳細資料。 - 檢閱指令輸出中的
Reason。
在檢查日誌並識別潛在主要原因之後,請使用下列解決動作來協助您解決問題。
在建置期間解析不存在的儲存庫
使用下列指令來更新現有建置,以參照 Git 儲存庫來源並提交建置執行。
-
使用
ibmcloud ce build update指令來更新建置配置; 例如:ibmcloud ce build update --name <BUILD_NAME> --source <GIT_REPO> -
使用
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,然後執行建置。
-
使用
ibmcloud ce build update指令來更新建置配置,以使用 Git 儲存庫的 HTTP URL; 例如,ibmcloud ce build update --name <BUILD_NAME> --source <GIT_REPO> -
使用
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 通訊協定,
-
執行
ibmcloud ce secret create --format ssh指令。 SSH 密鑰也用作 Git 儲存庫存取密鑰。SSH_KEY_PATH需要指向符合帳戶中公開金鑰或儲存庫中部署金鑰的私密金鑰檔。 這個指令需要名稱和金鑰路徑,也容許其他選用引數,例如已知 hosts 檔的路徑。 如果您指定--known-hosts-path選項,請在已知 hosts 檔中包含 Git 儲存庫的主機,例如github.com或gitlab.com。 如需相關資訊,請參閱 存取專用程式碼儲存庫。ibmcloud ce secret create --format ssh --name <GIT_REPO_SECRET> --key-path <SSH_KEY_PATH> --known-hosts-path <PATH_TO_KNOWN_HOSTS_FILE> -
使用
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 分支。 請檢閱錯誤訊息,以取得已指定但不存在之內容的相關資訊。
-
使用
ibmcloud ce build update指令來更新建置配置,以使用正確的修訂 (或確定); 例如,ibmcloud ce build update --name <BUILD_NAME> --commit <COMMIT> -
使用
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 金鑰。
-
在 GitLab中,使用 SSH 公開金鑰來建立部署金鑰或使用者金鑰。
-
在 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 金鑰的相關資訊,請參閱 存取專用程式碼儲存庫。