web-dev-qa-db-ja.com

ジェンキンスは常にバッチ/バットを使用してビルドが成功したと見なします

バッチファイルを使用してC++プロジェクトを構築する会社に入社しました。バッチはあらゆる種類のことを行い(svnを更新し、現在はjenkinsによって行われています)、ビルドフォルダーを作成し、ビルド後に不要なファイルを削除し、ライブラリファイルをビルドフォルダーにコピーします。

私の問題は、ジェンキンスがビルドが成功していなくても、それが成功していると常に考えていることです。 .batファイルは、何か問題が発生したときにerrormake.txtというファイルを作成します。ジェンキンにそれを読み取らせ、ビルドを失敗としてマークするにはどうすればよいですか?

また、.batファイル内から作成されたビルドフォルダーJenkinsを見つける方法はありますか(バッチファイルを呼び出すときに変数を送信する可能性があります)?

これは、現在.batファイルを呼び出すために使用している1行です。

call "C:\Source\BuildVersion\AppName\build_version.bat"

編集:また、このプロジェクトはいくつかのSVNリポジトリに分割されています。 %SVN_REVISION%は空白です。正しい%SVN_REVISION%最初のリポジトリ(メインのリポジトリ)から?

26
HSNN

各質問に答えるには-

  • Jenkinsは、ジョブが実際に失敗した場合でも常に「SUCCESS」を返します

    Jenkinsは、lastコマンドの戻りコードに基づいて、ジョブのステータスを設定します
    各「Execute Windows batch command」ブロックで実行されたもの。
    最後のコマンドがcopy some.log D:
    ジェンキンスはすべてがOKだと考えている
    (「copy」コマンドがうまくいった場合...)

    使用する EXIT xxまたはEXIT /B xx、OSに応じて、
    ここで、「xx」はゼロより大きい整数です。

  • ログファイルに基づいて、ジェンキンスがビルドを失敗としてマークする方法:

    sdmythos_grで説明されているように、Text-Finder Pluginを使用します。

  • Jenkinsが作成したビルドフォルダーを見つける方法はありますか

    環境変数として利用可能ないくつかのパラメーターがあります
    Jenkinsで実行される各スクリプトについて-これらのパラメーターのリストについては、こちらをご覧ください。
    Jenkins Environment Variables

    あなたの質問に:

    • %WORKSPACE%-ワークスペースの絶対パス
    • %BUILD_NUMBER%-「153」などの現在のビルド番号
    • %BUILD_ID%-「2005-08-22_23-59-59」などの現在のビルドID
      (YYYY-MM-DD_hh-mm-ss)

  • 最初のリポジトリから正しい%SVN_REVISION%を取得するにはどうすればよいですか:

    この答えは同じリンクからです:

    • %SVN_REVISION%-Subversionベースのプロジェクトの場合、
      この変数には、モジュールのリビジョン番号が含まれています。
      複数のモジュールを指定した場合、これはset になりません。

役立つことを願っています

32
Gonen

JenkinsはWindowsエラーコードを使用して、ビルドが失敗したかどうかを確認します。ビルドが失敗した場合、たとえば「exit/B 1」など、0とは異なる値を返す必要があります。

6

また、あなたの質問の一部だけに答えます。

使用できるJenkins用のテキストファインダープラグインがあります。 https://wiki.jenkins-ci.org/display/JENKINS/Text-Finder+Plugin

ファイルまたはコンソール出力の内容に応じて、ビルドの終了時にビルドを不安定または失敗としてマークできます。

たぶんこれが役立つかもしれません...

4
sdmythos_gr

「新しい」バージョンのWindows(Server 2012 R2でテスト済み)では、各Windowsバッチコマンドの最後に次を追加します。

@EXIT /b %ERRORLEVEL%

これにより、cmd.exeが受け取ったエラーコードが呼び出し元(つまり、Jenkins)に返されます。 「@」はエコーをオフにして、ログが乱雑にならないようにします。

コマンドに複数の行があり、最初の失敗後に停止する場合は、確認する各行の後に次の行を追加します(はい、これはきれいではありません):

@IF NOT %ERRORLEVEL% == 0 EXIT /b %ERRORLEVEL%

例えば:

step1.exe
@IF NOT %ERRORLEVEL% == 0 EXIT /b %ERRORLEVEL%
step2.exe
@IF NOT %ERRORLEVEL% == 0 EXIT /b %ERRORLEVEL%
call "C:\Source\BuildVersion\AppName\build_version.bat"
@EXIT /b %ERRORLEVEL%
3
J. Beattie

他のユーザーが述べているように、バッチファイルは「exit/B 1」を使用する必要があります。呼び出しが連鎖すると、Jenkinsが失敗した場合に失敗を返すトリックがあります。

call a.bat &&^
echo "a success" &&^
call b.bat &&^
echo "b success"

「&&」は、次のアクションが成功時にのみ実行されることを示します(終了コード0)。 「^」を使用すると、コマンドを複数の行に分割できます。このアプローチの欠点は、ビルドの進行状況バーが正確に表示されないことです。

0
koga73

私は質問がかなり古いことを知っていますが、一部の人々にとって役に立つかもしれません。次の行を使用する代わりに、batファイルを実行するには、

call "C:\Source\BuildVersion\AppName\build_version.bat"

以下の形式を使用できますが、

<someRelativeOrAbsolutePath>\<.batFileName> <param1> <param2> <and so on>

Windowsバッチコマンドの実行 of ビルドの内部でこの方法でコマンドを実行すると、コマンドの最後のリターンコードが使用されます。 ${BUILD_STATUS}はそれに依存します。また、条件ベースのエラーコードを返すためにスクリプトを変更する必要はありません。

0
Ravi Amlani