1. ホーム
  2. shell

[解決済み] JenkinsでExecute Shellがビルドを失敗とマークする方法/タイミングは?

2022-02-02 14:15:29

質問

この答えを探しているときに見つけた怖い話・・・。

OK、私は.shスクリプトを持っていますが、それはほとんどすべてのJenkinsが行うことになっていることを行います。

  • SVNからソースをチェックアウトする
  • プロジェクトのビルド
  • プロジェクトをデプロイする
  • 後始末

そこでJenkinsでは、Execute Shellコマンドでスクリプトを実行して、プロジェクトを「ビルド」するだけにしました。 スクリプトが実行され(ソースがダウンロードされ、プロジェクトがビルド/デプロイされ)、ビルドが失敗とマークされます。 ビルドステップ 'Execute shell' はビルドを失敗とマークしました。 スクリプトが正常に実行されたとしてもです。でスクリプトを閉じてみました。

  • exit 0 (やはり失敗と表示される)
  • exit 1 (予想通り、失敗とマークされる)
  • exitコマンドを全く使用しない(失敗としてマークされる)

Execute Shellは、いつ、どのように、そしてなぜ、私のビルドを失敗とマークするのですか?

解決方法は?

まず最初に、下のグレーの部分にマウスカーソルを合わせてください。答えの一部ではありませんが、絶対に言っておかなければならないことです。

<ブロッククオート

チェックアウト、ビルド、デプロイをすべてシェルスクリプトで行うのであれば、なぜJenkinsを使っているのでしょうか?あなたは、Jenkinsのすべての機能を放棄しているのです。 cronやSVNのポストコミットフックでスクリプトを直接呼び出した方がいいかもしれません。 . JenkinsがSVNチェックアウトを行うこと自体が重要なのです。これによって、変更があったときだけビルドを起動することができます(タイマーでも手動でもかまいません)。ビルドの間の変更点を追跡することができます。変更点が表示されるので、どのビルドがどの変更点に対するものかを確認することができます。変更がビルドの成功や失敗の原因となった場合、コミッターにメールを送ります(これもお好みで設定できます)。失敗したビルドを修正したときに、コミッターにメールを送ります。などなど。Jenkinsが成果物をアーカイブすることで、ビルドごとにJenkinsから直接成果物を利用できるようになります。SVNチェックアウトほど重要ではありませんが、これもまたJenkinsを構成する不可欠な要素です。デプロイも同じです。単一の環境でない限り、デプロイは通常、複数の環境で行われます。Jenkinsは、プロモーションを使うことで、特定のビルド(特定のSVN変更のセットを含む)がどの環境にデプロイされたかを追跡することができます。あなたはこのすべてを放棄しているのです。Jenkinsを使わなければならないと言われているようですが、本当は使いたくありませんし、上司の気を引くために、「はい、Jenkinsを使いました」というチェックマークを入れるためだけにやっているようにしか聞こえませんね。

簡単に言うと、終了コードが 最後 のコマンドは、ジェンキンの シェルを実行する の成否を決定するのは、ビルドステップです。 ビルドステップ . 0 - を成功させる。 anything else - 失敗 注意!これは成功/失敗を判断しているのは ビルドステップ 全体ではなく ジョブ実行 . ジョブ実行全体の成功/失敗は、複数のビルドステップ、ビルド後のアクションやプラグインによってさらに影響される可能性があります。

あなたは Build step 'Execute shell' marked build as failure ということで、ここでは一つのビルドステップだけに焦点を当てます。もし、あなたの シェルの実行 ビルドステップでは、シェルスクリプトを呼び出す行が1つしかないため、シェルスクリプトの終了コードでビルドステップの成否が決まります。もっと多くの行がある場合は シェルスクリプトを実行する際に、失敗の原因となる可能性があるため、慎重に確認してください。

最後に、こちらをご覧ください。 Jenkinsのビルドスクリプトは、Googleテストの実行後に終了します。 . 質問とは直接関係ありませんが、Jenkinsが起動するのは シェルを実行する ビルドステップは、シェルスクリプトとして /bin/sh -xe

-e は、シェルスクリプトが 出口 のように、1コマンドだけ失敗しても、失敗と表示されます。 でも そのコマンドに対してエラーチェックを行った場合 (エラーチェックに入る前にスクリプトが終了してしまうため)。これは、通常、失敗したコマンドのエラーメッセージを表示して(あるいは、それをnullにリダイレクトして他の方法で処理して)、処理を継続するシェルスクリプトの通常の実行とは異なっています。

これを回避するために set +e をシェルスクリプトの先頭に追加してください。

スクリプトはすべて実行されるとのことなので、失敗するコマンドはスクリプトの最後のほうにある可能性が高いです。最後のechoとか?あるいは、どこかにアーティファクトをコピーしていませんか?コンソールの出力をすべて見てみないと、推測でしかありませんが。

ジョブ実行のコンソール出力と、できればシェルスクリプト自体も投稿していただければ、どの行が失敗しているのか正確にお伝えできると思います。