【问题标题】:Jenkins run a failing test n timesJenkins 运行失败的测试 n 次
【发布时间】:2023-12-22 00:46:01
【问题描述】:

我正在尝试在 Jenkins 失败时重新运行测试 n 次。我见过 Naginator,但我的团队不希望添加额外的插件。 (注:我们使用 EnvInject 将环境变量注入到构建过程中)

下一个想法是保留一个带有重试次数的变量,并在每次新构建时递减它。有一个堆栈溢出链接(我目前正在努力寻找)建议一个看起来像这样的 groovy 脚本

def map = [:]
Int newRetries = RETRIES.toInteger() - 1
map.put(“RETRIES”, newRetries)
return map

但是,“准备运行环境”部分中的 groovy 脚本需要管理员权限(我的团队也希望避免这种情况)。

下一个想法是使用属性文件,然后按照echo "RETRIES=$((RETRIES-1))" > env.properties 的方式做一些事情,并添加一个读取 env.properties 的 Inject Environmental variable 步骤。

问题是在我们的 Jenkins bash 脚本中 echo "RETRIES=$((RETRIES-1))" 打印“RETRIES=$((RETRIES-1))”

在本地终端我可以运行

RETRIES=5
echo "RETRIES=$((RETRIES-1))"

> RETRIES=4

,但在 Jenkins 中,RETRIES-1 不会被评估。你们中有人知道为什么吗?

【问题讨论】:

  • 在 bash 脚本中你有 RETREIS 然后是 RETRIES??
  • @RamanSailopal 抱歉,这是复制文本时的拼写错误。我弄清楚发生了什么,现在正在发布解决方案。

标签: bash jenkins environment-variables jenkins-plugins


【解决方案1】:

所以我发现了我犯的 3 个错误。

  1. Jenkins 管道并行执行一个步骤。这意味着您不能在同一步骤的不同部分写入和读取文件,而不读取未更新的文件(实际上)(来自此 * Override environment variable created locally in Jenkins

  2. Jenkins 的默认 shell 是 /usr/bin/sh,它不一定是 bash。我明确地用bash -c "echo $Var" 运行了我的脚本(这里真正的问题是远程机器是windows,哎呀)

  3. 在从文件中读取更新的变量值之前,我的管道失败了。我已经将阅读步骤移到了管道的前面。

【讨论】: