ソース・ステップでのビルドの失敗
ビルドを作成して実行すると、ビルドが正常に完了せずに、ソース・ステップでビルドが失敗したというメッセージを受け取ります。
ビルド中にソース・ステップが失敗したというメッセージを受け取った場合は、ビルドのログを確認して問題の根本原因を特定してください。
エラー・メッセージの例
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 |
|
Host key verification failed |
|
Permission denied (publickey) |
|
Couldn't find remote ref |
|
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 は、HTTPS プロトコルまたは SSH プロトコルを使用して指定できます。 GitHub と GitLab では、Git UI で URL 形式を切り替えることができます。 HTTPS プロトコルは、認証は不要ですが、パブリック・リポジトリーの場合にのみ使用できます。 プライベート・リポジトリーの場合、SSH プロトコルを使用して、リポジトリーのシークレットを提供しなければなりません。 GitHub Enterprise セットアップのリポジトリーはパブリックにすることができますが、その場合も認証が必要です。さらに、こうした GitHub Enterprise リポジトリーは SSH プロトコルでのみ使用できます。
パブリック・リポジトリーの場合
パブリック・リポジトリーで障害が発生した場合、Git リポジトリーの HTTPS URL を使用するように既存のビルドを更新してから、ビルドを実行します。
-
ibmcloud ce build update
コマンドを使用して、Git リポジトリーの HTTPS 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
を使用します。 コマンドが旧パスフレーズを要求した場合は (最初の例)、元のファイルが暗号化されています。そうでない場合は、新しいファイルのパスフレーズが直接求められます (2 番目の例)。暗号化された秘密鍵ファイルを復号するには、次のコマンドを実行し、新しいパスフレーズは空にしておきます。
$ 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
オプションを指定する場合は、 Git リポジトリーのホスト (例えば、github.com
またはgitlab.com
) を既知の hosts ファイルに含めます。 詳しくは、プライベート・コード・リポジトリーへのアクセスを参照してください。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@
プレフィックスを使用して SSH URL を指定します。例えば--source git@github.com:IBM/CodeEngine.git
とします。
ビルド時にリビジョンが間違っている場合の解決策
ビルド構成では、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 repos and issue tracking を参照してください。
このエラーを解決するには、以下のアクションを実行します。
-
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 鍵の処理について詳しくは、 プライベート・コード・リポジトリーへのアクセス を参照してください。