如果最后一次执行成功,则跳过 Jenkins Stage

Skip Jenkins Stage if its last excution was successfull

我正在寻找加速构建流水线的方法。 最大的影响就是有些事没做过就去做。

所以基本上,我已经参数化了一些运行良好的可选阶段,但是如果之前有一个执行成功,我想跳过一些东西。

我已经搜索了文档,尤其是参考部分。 when 但没有任何作用。

所以问题是:我可以在声明性管道中做些什么来始终跳过一个阶段,除非

  1. 之前从未运行成功过
  2. 上次 运行 没有成功(例如,如果我允许通过传递参数强制执行)

我考虑过使用内部版本号(例如,在第一次执行管道时只 运行 它),但这并没有削减它,原因有两个

  1. 我正在使用里程碑来防止为给定的管道多次执行 branch/PR
  2. 如果第一个运行失败,就再也不会尝试了

哦,我还考虑过将所有逻辑放在 post -> 回归中并强制该阶段在第一个管道 运行 上失败,但这似乎不是也是个好主意。

也许你可以使用 custom shared-workspace 然后 create/store 一些状态文件或你下一次执行可以使用的东西,比如 lastexecfailed.state 然后尝试在共享上找到文件执行开始时的工作区。

一种选择,虽然不适合大规模使用,但可以将不同的状态存储为全局环境变量。 (管理 Jenkins -> 配置系统 -> 全局属性 -> 环境变量)。
这些参数适用于所有作业,并且可以将参数存储在 'server wide' 范围内。
然后,您可以使用以下 groovy 方法通过代码更新或设置它们:

@NonCPS
def updateGlobalEnvVariable(String name, String value) {
    def globalNodeProperties = Jenkins.getInstance().getGlobalNodeProperties()
    def envVarsNodePropertyList = globalNodeProperties.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)

    if (envVarsNodePropertyList == null || envVarsNodePropertyList.size() == 0) {
        def envVarsNodePropertyClass = this.class.classLoader.loadClass('hudson.slaves.EnvironmentVariablesNodeProperty')
        globalNodeProperties.add(envVarsNodePropertyClass.newInstance())
    }
    envVarsNodePropertyList.get(0).getEnvVars().put(name, value)
}

如果参数不存在,此函数将创建参数;如果参数已存在,则更新其值。此外,此函数最好放在 共享库 中,所有管道都可以从中使用它。

此技术的一个很好的优点是您始终可以 'reset' 配置页面中的不同阶段,但是如果您需要存储多个阶段,它可能会使配置页面溢出,信息太多。