jenkins和从Windows批处理返回代码

我使用Jenkins(在Windows机器上)通过Ant为不同的目标编译代码。 为此,我把这个调用包装在一个(windows)批处理循环中,像这样:

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

这是我的第一个想法…但是,即使(例如)target1失败,这个代码也会导致成功的构build。 所以我把更多的线路放到windows批量生成步骤来获得更多的概述。 此外,我已经checekdout代码来获得相同的工作空间比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机器上testing这个显示预期的行为 – 在这里成功:

 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 

使用谷歌一段时间后,它显示,调用Ant目标的返回代码没有正确地传递给Jenkins进行调用的Java环境。 我已经使用“调用”或“设置ERRORLEVEL = 1”这样的东西testing,但还没有find一个solvotion。

任何人有一个想法? 把循环(target1-3)放到一个系统的groovy脚本中,并手动处理callc – 这是否工作?

问候

Solutions Collecting From Web of "jenkins和从Windows批处理返回代码"

我认为你的问题是因为你在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! ) ) 

它不能解释为什么它在你的电脑上运行…也许是因为EnableDelayedExpansion已经在你的dos窗口中设置。

编辑

在批处理文件中:

  • 当代码被解析时(即在执行之前), %var%将被展开。
  • !var! 将在代码执行时展开

由于你在循环中: %ERROR_LEVEL%被扩展一次(即在第一次执行之前)。 但是你需要的是为每个迭代重新扩展ERROR_LEVEL ,这就是!ERROR_LEVEL!的目的!ERROR_LEVEL! 句法。

 @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% ) ) 

IIRC问题是,ant.bat是一个批处理文件,所以你需要调用它,例如

 @ECHO OFF FOR %%t IN (target1 target2 target3) DO ( CALL ant.bat -f build.xml build -DPARAM_TARGET=%%t ECHO ELVL: %ERRORLEVEL% IF NOT %ERRORLEVEL% == 0 ( ECHO ABORT: %ERRORLEVEL% EXIT /b %ERRORLEVEL% ) ELSE ( ECHO PROCEED: %ERRORLEVEL% ) ) 

更新

实际上有一个更好的方法:

 @ECHO OFF FOR %%t IN (target1 target2 target3) DO ( CALL ant.bat -f build.xml build -DPARAM_TARGET=%%t || EXIT /b 1 )