Jenkins和Windows批处理返回代码

我使用Jenkins(在Windows计算机上)作业通过Ant为不同的目标编译一些代码。为此,我将对ant目标的调用包装在(windows)批处理循环中,如下所示:

@echo off

for %%t in (target1 target2 target3) do (

ant -f build.xml build -DPARAM_TARGET=%%t

)

那是我的第一个主意……但是即使(例如)target1失败,此代码也可以成功构建。因此,我在Windows批处理构建步骤中增加了一些内容,以获取更多概述。另外,我还用了cecekdout代码来获得与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目标的返回代码未正确传递给java环境,詹金斯从那里进行调用。我已经测试过使用“ call”或“ set

ERRORLEVEL = 1”之类的方法,但是还没有找到解决方案。

有人有主意吗?将循环(target1-3)放入系统常规脚本中,并手动处理callc-这样行得通吗?

问候

回答:

我认为您的问题是因为您在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!语法的目的。

以上是 Jenkins和Windows批处理返回代码 的全部内容, 来源链接: utcz.com/qa/419215.html

回到顶部