当前位置: 首页 > 面试题库 >

Jenkins和Windows批处理返回代码

公西星海
2023-03-14
问题内容

我使用Jenkins(在Windows计算机上)作业通过Ant为不同的目标html" target="_blank">编译一些代码。为此,我将对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!语法的目的。



 类似资料:
  • 我在外部Tomcat上部署了一个Spring Boot批处理应用程序。期望shell脚本调用批处理作业并返回退出代码(成功时为0,失败时为非零)。我已经在下面实现了,但是即使批处理失败,我也会在shell脚本中得到0个返回代码。想知道Spring推荐的管理这些错误代码的方法是什么。请建议

  • 我有一个spring批处理应用程序(spring boot 2.3.5版),它在spring批处理时使用一个JpaRepository将一些自定义日志消息插入数据库。这与开箱即用的spring批处理表是分开的。似乎当我从ItemProcessorAdapter抛出异常时,它会被ItemProcessListener onProcessError()方法捕获。在这个方法中,我执行一个JpaRepos

  • 不确定这里的问题是什么,但是当我试图编译java文件时,javac是不被识别的。我假设我需要一个专门的插件,或者我需要使用apache ANT,但不太确定。 javac HelloWorld.java java HelloWorld

  • 我尝试使用Windows 10任务计划程序计划一个作业来运行批处理文件,但它导致返回代码2147942401。 批处理文件位于远程位置,因此我给出了绝对路径< br >“\ \ server 1 \ file transfers \ data files \ inbound \ ABC \ CSV \ excel-to-CSV . bat” 批处理脚本用于将 Excel 转换为文件到 csv。 脚

  • 我正在windows机器上运行Jenkins.war进程的Jenkins。“java-jar Jenkins.war”。如果我关闭服务的命令提示符,詹金斯就会倒下。我希望Jenkins在命令提示符关闭的情况下仍然处于启动状态,甚至在机器重新启动之后,这个Jenkins也将被启动。我们如何在windows机器上做到这一点?

  • 问题内容: 我的问题与春季批次和交易有关。 假设我为我的步骤之一选择了 50 的 提交间隔 。 还要假设我总共有1000条记录,其中一条记录将导致itemWriter失败,从而导致整个块的回滚(在我的示例中为50条记录)。 确保作业完成(并忽略有问题的块)后将49个有效记录写入数据库的状态有哪些? 问题答案: 经过研究,我得出以下结论: 如果项目编写者未能提交一个块(此处为50个项目)从而导致回滚