3

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

@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

在使用谷歌一段时间后,它显示调用 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!
   )
)

它没有解释为什么它在您的计算机上运行......可能是因为 EnableDelayedExpansion 已经在您的dos窗口中设置。

编辑

在批处理文件中:

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

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

于 2013-10-14T12:33:50.837 回答
0
@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
)
于 2013-10-14T08:22:09.887 回答