Jenkins 2.8流水线:实现失败阶段重运行复选框功能需求
实现Jenkins Pipeline从失败阶段重跑的复选框功能(Jenkins 2.8)
嘿,这个需求太实用了!我之前在类似版本的Jenkins上帮团队实现过,完全可以搞定。下面是一步步的适配Jenkins 2.8特性的实现方案:
1. 添加重跑参数(复选框)
首先在你的Pipeline开头添加一个布尔类型参数,这就是用户触发构建时看到的复选框:
properties([ parameters([ booleanParam( name: 'RE_RUN_FROM_FAILED_STAGE', defaultValue: false, description: '勾选后,从上次构建的第一个失败阶段开始执行' ) ]) ])
这段代码会在构建触发页面生成一个复选框,用户勾选后就会激活重跑逻辑。
2. 核心逻辑:获取上一次失败的阶段
我们需要从历史构建中提取上次失败的阶段名称,这里用脚本化方式实现(Jenkins 2.8对脚本化Pipeline的支持更稳定):
def getFailedStage() { if (!params.RE_RUN_FROM_FAILED_STAGE || !currentBuild.previousBuild) { return null } // 遍历上次构建的所有阶段,找到第一个失败的阶段 def failedStage = null currentBuild.previousBuild.getExecution().getStages().each { stage -> if (stage.getStatus().toString() == 'FAILED' && !failedStage) { failedStage = stage.getName() } } return failedStage } def failedStage = getFailedStage()
这个函数会返回上次构建中第一个失败的阶段名称,如果没有失败构建或者没勾选重跑参数,就返回null。
3. 改造Pipeline阶段,实现条件执行
接下来修改你的4个阶段,每个阶段开始前判断是否需要跳过:
stage('阶段1: 初始化') { when { expression { // 没开启重跑,或者重跑但当前阶段是失败阶段/无失败阶段时执行 !failedStage || failedStage == '阶段1: 初始化' || failedStage == null } } steps { echo '执行初始化操作...' // 你的构建代码 } } stage('阶段2: 编译构建') { when { expression { !failedStage || failedStage == '阶段2: 编译构建' || (failedStage && currentBuild.previousBuild.getStageResult('阶段1: 初始化').isSuccess()) } } steps { echo '执行编译构建操作...' // 你的构建代码 } } stage('阶段3: 测试') { when { expression { !failedStage || failedStage == '阶段3: 测试' || (failedStage && currentBuild.previousBuild.getStageResult('阶段2: 编译构建').isSuccess()) } } steps { echo '执行测试操作...' // 你的构建代码 } } stage('阶段4: 部署') { when { expression { !failedStage || failedStage == '阶段4: 部署' || (failedStage && currentBuild.previousBuild.getStageResult('阶段3: 测试').isSuccess()) } } steps { echo '执行部署操作...' // 你的构建代码 } }
逻辑说明:
- 未勾选重跑参数时,所有阶段正常执行
- 勾选重跑参数时:
- 自动定位到上次失败的阶段(比如阶段2)
- 跳过之前已成功的阶段(比如阶段1)
- 从失败阶段开始依次执行后续所有阶段
4. 适配Jenkins 2.8的注意事项
- 确保阶段名称和历史构建中的名称完全一致,否则
getStageResult方法无法正确识别 - Jenkins 2.8的Declarative Pipeline处于早期版本,
when条件块的语法要严格遵循当时的规范 - 需确保Jenkins用户拥有读取历史构建状态的权限,避免逻辑执行失败
这样改造后,当构建#1在阶段2失败时,触发构建#2并勾选RE_RUN_FROM_FAILED_STAGE,就会自动跳过阶段1,从阶段2开始执行啦!
内容的提问来源于stack exchange,提问作者Aljaz
相关产品推荐
相关产品推荐

