Jenkins 和 Windows 批处理返回代码

2023-12-01

我使用 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

使用 google 一段时间后发现,调用 Ant 目标的返回代码未正确传递到 Jenkins 执行调用的 java 环境。我已经测试过使用“call”或“set ERRORLEVEL=1”这样的东西,但还没有找到解决方案。

有人有主意吗? 将循环(target1-3)放入系统groovy脚本中并手动处理callc - 这有效吗?

Regards


我认为你的问题是因为你在 for 循环中读取了 %ERROR_LEVEL% 。

我想你必须使用setlocal EnableDelayedExpansion

EnableDelayedExpansion :在执行时而不是在解析时扩展变量。

(ref is here)

尝试做这样的事情:

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 窗口中设置了。

EDIT

在批处理文件中:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jenkins 和 Windows 批处理返回代码 的相关文章

随机推荐

  • 将 javascript 函数注入到 Iframe 中

    这个链接 存档版本 描述了如何将脚本中的代码注入到 iframe 中 function injectJS var iFrameHead window frames myiframe document getElementsByTagName
  • 如何永远隐藏视图

    有人可以告诉我如何永远隐藏视图吗 我正在隐藏一个视图view setVisibility view GONE 但是当重新打开应用程序时 我必须重新隐藏视图 我希望在单击按钮时始终隐藏视图 直到清除应用程序数据或卸载 谢谢 您需要通过创建隐藏
  • LWP::UserAgent 和 500 SSL 协商失败

    我正在运行一个旧的 Debian 服务器 每天一次通过 Perl 脚本获取网页 从昨天开始 脚本失败并出现 500 SSL 协商失败 错误 use strict use LWP UserAgent my browserObj LWP Use
  • jQuery 验证插件:仅接受德文字母

    我正在寻找 jquery 验证插件的方法 http bassistance de jquery plugins jquery plugin validation 只接受字母 包括德语所谓的 Umlaute 我用谷歌搜索了一下 但不幸的是找不
  • 如何在控制台应用程序中添加 C# 登录尝试循环?

    我是这门语言的新手 我尝试了一些方法 但无法弄清楚如何设置登录循环以使用最大登录尝试次数 3次 有人可以帮我吗 static void Main string args Console WriteLine Status status Ona
  • 如何在按下按钮后在 JQuery / ASP.NET 中创建淡入淡出标签

    我认为这应该很容易 但我不太确定如何连接 我有一个页面 用户可以在其中定义查询 完成后 用户输入查询的名称并按下按钮 我想处理按钮单击 使文本标签 或跨度 可见几秒钟 然后让它淡出 由于它是回发 我可以将 ASP Label 控件变为可见
  • 仅从特定活动中读取 NFC 标签

    我先告诉你我在做什么 我按顺序进行了三项活动 活动1 gt gt 活动2 gt gt 活动3 现在 当我点击标签时 我只想从 Activity2 读取 NFC 标签 当我处于 Activity1 或 Activity3 中时 我的应用程序应
  • 如何将父组件注入子组件?

    我正在尝试将父组件注入子组件中 我认为这很简单 只需在子组件中指定 注入父组件constructor constructor private parent AppComponent child component constructor 我
  • 限制文本框中的数字和字母 - C#

    我想限制可以在文本框中输入的数字和字母 假设我只想允许数字 0 5 和字母 a d 小写和大写 我已经尝试使用屏蔽文本框 但它只允许我指定数字 字母 均无限制 或数字和字母一起但按特定顺序 最好的情况是 用户尝试输入数字 6 但文本框中没有
  • 使用 Trace 函数以 Haskell 的 do 表示法进行惰性求值

    我想知道为什么这个 调试消息 1 没有打印在这个片段中 import Debug Trace main do return trace debug message 1 trace debug message 2 return 第二个 调试消
  • 与新的导航堆栈结合时发现 @State 的奇怪行为 - 这是一个错误还是我做错了?

    我已将我的 swiftui 应用程序转换为新的导航栈以编程方式管理使用导航堆栈 路径 visibilityStack 这样做时 我发现 State 的意外行为让我认为视图没有正确关闭 事实上 当我用堆栈中的另一个视图替换该视图时 State
  • 如何通过选择随机变量在 Python 中执行随机事件?

    假设我必须变量 狗和猫 Dog 5 cat 3 我如何告诉 Python 随机选择这些变量之一并将其打印到屏幕上 import random print random choice dog cat 就是这么简单 choice 获取一个序列并
  • Pygame:尝试理解 Sprite 类

    我发现在Pygame 文档一个名为Sprite 我读了解释 但不明白这个类是用来做什么的 我知道我们用它来通过构造函数继承其他类 但仅此而已 如果有人有明确的解释用处班级的 以及如何用好 我有兴趣 是的 所以移动鼠标光标 那是一个精灵 它是
  • 内部服务器错误[重复]

    这个问题在这里已经有答案了 我正在开发一个短信发送应用程序 出于登录目的 我想使用 POST 方法将用户名和密码从我的 Android 应用程序发送到 Web 服务器 当我单击登录按钮时 应用程序没有响应 并且控制台打印以下消息来响应 Po
  • ReactJS:使用alert()获取用户输入

    我该如何使用alert 允许用户输入他们的名字并将其保存到状态 这是我到目前为止所做的尝试 render function return div div
  • 如何在 C# 中检查 Excel 文件的版本?

    我需要区分所选文件是使用所选 Excel 文件的 Excel 2010 或 Excel 2013 版本创建的 并且服务器上的 Excel 应用程序必须匹配才能继续 我可以获得服务器的Excel应用程序版本 xApp new Microsof
  • 如何将 Base64 格式的文件附加到 Laravel 5.2 邮件

    我有 Angular 应用程序作为前端 Laravel 5 2 作为 api 后端 我的角度应用程序将参数发送到我的 laravel 控制器 name My Name email email protected subject Hello
  • Django模型时间范围过滤方法

    我在一个老问题中看到了接下来的两种方法here但我不清楚以下之间有什么区别 date time field range datetime datetime combine date datetime time min datetime da
  • 在 Papertrail 中显示单个记录的所有版本

    我正在构建一个联赛系统 目前它根据结果存储和更新玩家的 elo 得分 现在 我尝试添加 HighCharts 以漂亮的折线图显示球员在整个赛季的 elo 得分 有人建议我使用 Papertrail 来存储更新 我已经全部安装了 现在我的问题
  • Jenkins 和 Windows 批处理返回代码

    我使用 Jenkins 在 Windows 机器上 作业通过 Ant 为不同目标编译一些代码 为此 我将对 ant 目标的调用包装在 Windows 批处理循环中 如下所示 echo off for t in target1 target2