IBM Cloud Docs
在源步骤中构建失败

在源步骤中构建失败

创建并运行构建后,构建未成功完成,并且在源步骤中接收到构建失败的消息。

如果在构建期间接收到源步骤失败的消息,请检查构建的日志以确定问题的根本原因。

示例错误消息

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 是使用 HTTPS 协议提供的,但该存储库是专用的,因此需要 SSH 协议。 使用了错误的协议。
Host key verification failed -源 URL 是使用 SSH 协议提供的,但未提供任何私钥。 使用了错误的协议,或者缺少私钥或私钥不正确。
Permission denied (publickey) -源 URL 是使用 SSH 协议提供的,但密钥缺失或不正确。
Couldn't find remote ref -构建中指定的修订版 (分支名称,标记名称和落实标识) 不存在。
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>
    

构建期间针对错误协议或缺少私钥的解决方案

可以使用 HTTPS 或 SSH 协议来指定 Git 存储库的 URL。 GitHub 和 GitLab 提供了一种在 Git UI 中切换 URL 格式的方法。 HTTPS 协议不需要认证,但仅当存储库为公共时才能使用。 对于专用存储库,必须使用 SSH 协议并为存储库提供私钥。 GitHub Enterprise 设置中的存储库可以是公共存储库,但仍需要认证,并且这些 GitHub Enterprise 存储库也只能通过使用 SSH 协议来使用。

对于公共存储库

如果公共存储库发生故障,请更新现有构建以使用 Git 存储库的 HTTPS URL,然后运行该构建。

  1. 使用 ibmcloud ce build update 命令更新构建配置以使用 Git 存储库的 HTTPS 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 存储库访问私钥。 当使用 Git 存储库提供程序存储相应的公用密钥时,SSH 密钥包含专用密钥。 有关创建密钥对并将公共部件存储在 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 需要指向与帐户中的公用密钥或存储库中的部署密钥相匹配的专用密钥文件。 此命令需要名称和密钥路径,并且还允许其他可选参数,例如已知主机文件的路径。 如果指定 --known-hosts-path 选项,请在已知主机文件中包含 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 和 (可选) 修订版来指定源存储库。 修订版可以是分支或标记的名称,也可以是落实标识。 缺省情况下,将构建 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 密钥的更多信息,请参阅 访问专用代码存储库