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
  • 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 は、HTTPS プロトコルまたは SSH プロトコルを使用して指定できます。 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 リポジトリー・アクセス・シークレットとしても使用されます。 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 プロトコルを使用するには、以下のようにします。

  1. 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>
    
  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@ プレフィックスを使用して SSH URL を指定します。例えば --source git@github.com:IBM/CodeEngine.git とします。

ビルド時にリビジョンが間違っている場合の解決策

ビルド構成では、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 repos and issue tracking を参照してください。

このエラーを解決するには、以下のアクションを実行します。

  • 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 鍵の処理について詳しくは、 プライベート・コード・リポジトリーへのアクセス を参照してください。