如果最后一次执行成功,则跳过 Jenkins Stage
Skip Jenkins Stage if its last excution was successfull
我正在寻找加速构建流水线的方法。
最大的影响就是有些事没做过就去做。
所以基本上,我已经参数化了一些运行良好的可选阶段,但是如果之前有一个执行成功,我想跳过一些东西。
我已经搜索了文档,尤其是参考部分。 when
但没有任何作用。
所以问题是:我可以在声明性管道中做些什么来始终跳过一个阶段,除非
- 之前从未运行成功过
- 上次 运行 没有成功(例如,如果我允许通过传递参数强制执行)
我考虑过使用内部版本号(例如,在第一次执行管道时只 运行 它),但这并没有削减它,原因有两个
- 我正在使用里程碑来防止为给定的管道多次执行 branch/PR
- 如果第一个运行失败,就再也不会尝试了
哦,我还考虑过将所有逻辑放在 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' 配置页面中的不同阶段,但是如果您需要存储多个阶段,它可能会使配置页面溢出,信息太多。
我正在寻找加速构建流水线的方法。 最大的影响就是有些事没做过就去做。
所以基本上,我已经参数化了一些运行良好的可选阶段,但是如果之前有一个执行成功,我想跳过一些东西。
我已经搜索了文档,尤其是参考部分。 when
但没有任何作用。
所以问题是:我可以在声明性管道中做些什么来始终跳过一个阶段,除非
- 之前从未运行成功过
- 上次 运行 没有成功(例如,如果我允许通过传递参数强制执行)
我考虑过使用内部版本号(例如,在第一次执行管道时只 运行 它),但这并没有削减它,原因有两个
- 我正在使用里程碑来防止为给定的管道多次执行 branch/PR
- 如果第一个运行失败,就再也不会尝试了
哦,我还考虑过将所有逻辑放在 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' 配置页面中的不同阶段,但是如果您需要存储多个阶段,它可能会使配置页面溢出,信息太多。