3

Jenkins (Windows マシン上) ジョブを使用して、Ant を介してさまざまなターゲット用のコードをコンパイルします。そのために、次のように (Windows) バッチ ループ内で ant ターゲットへの呼び出しをラップします。

@echo off
for %%t in (target1 target2 target3) do (
  ant -f build.xml build -DPARAM_TARGET=%%t
)

それが私の最初のアイデアでした...しかし、このコードは、(たとえば) target1 が失敗した場合でも、ビルドの成功につながります。そのため、概要を把握するために、Windows バッチ ビルド ステップにさらに行を追加しました。また、Jenkinsがローカルマシンに持っているものと同じワークスペースを取得するコードをチェックアウトし、test.batを追加して、Windowsバッチコードがまったく機能することを確認しました。

@echo off
for %%t in (target1 target2 target3) do (
  ant -f build.xml build -DPARAM_TARGET=%%t
  echo ELVL: %ERRORLEVEL% 
  IF NOT %ERRORLEVEL% == 0 ( 
    echo ABORT: %ERRORLEVEL%
    exit /b %ERRORLEVEL%
  ) ELSE (
    echo PROCEED: %ERRORLEVEL%
  )
)

ローカルの Windows マシンでこれをテストすると、予想される動作が示されます。成功した場合は次のとおりです。

BUILD SUCCESSFUL
Total time: 3 seconds
ELVL: 0
PROCEED: 0

そして失敗した場合:

BUILD FAILED
C:\Work\...
C:\Work\...

Total time: 0 seconds
ELVL: 9009
ABORT: 9009

Jenkins の同じコードでこれを行います。

BUILD FAILED
C:\Work\...
C:\Work\...

Total time: 4 seconds
ELVL: 0
PROCEED: 0

しばらくGoogleを使用した後、Antターゲットの呼び出しからの戻りコードが、Jenkinsが呼び出しを行うJava環境に適切に渡されないことが明らかになりました。このような "call" または "set ERRORLEVEL=1" を使用してテストしましたが、まだ解決策は見つかりませんでした。

誰にもアイデアがありますか?ループ (target1-3) をシステムの groovy スクリプトに入れ、callc を手動で処理します。これは機能しますか?

よろしく

4

2 に答える 2

5

あなたの問題は、 for ループで %ERROR_LEVEL% を読んだことが原因だと思います。

私はあなたが使用する必要があると思いますsetlocal EnableDelayedExpansion

EnableDelayedExpansion : 解析時ではなく実行時に変数を展開します。

(参照はこちら

このようなことをしてみてください:

setlocal EnableDelayedExpansion

for %%t in (target1 target2 target3) do (
   ant -f build.xml build -DPARAM_TARGET=%%t
   echo ELVL: !ERRORLEVEL! 
   IF NOT !ERRORLEVEL! == 0 ( 
     echo ABORT: !ERRORLEVEL!
     exit /b !ERRORLEVEL!
   ) ELSE (
     echo PROCEED: !ERRORLEVEL!
   )
)

コンピューターで実行される理由は説明されていません...おそらく、DOS ウィンドウで EnableDelayedExpansion が既に設定されているためです。

編集

バッチファイル内:

  • %var%コードが解析されるとき (つまり、実行前に!) 展開されます。
  • !var!コードが実行されると展開されます

あなたはループにいるので、 :%ERROR_LEVEL%は一度展開されます(つまり、最初の実行の直前)。しかし、必要なのはERROR_LEVEL反復ごとに再展開することであり、それが!ERROR_LEVEL!構文の目的です。

于 2013-10-14T12:33:50.837 に答える