如何在Jenkins并行阶段中重启单个子阶段?
解决Jenkins并行阶段内子阶段单独重启的问题
默认情况下,Jenkins Declarative Pipeline的parallel块会被视为单一阶段单元,因此只能重启整个并行阶段,无法直接选择内部嵌套子阶段。要实现从并行内的中间子阶段(比如你的Stage D_2)重启,可采用以下两种方案:
方案1:调整结构,将嵌套子阶段转为独立并行分支
如果可以接受改变原有嵌套串行的执行逻辑(比如让C_1、C_2和D的子阶段都并行执行),可将原来嵌套在父阶段内的子阶段直接移到parallel块下作为独立分支,每个子阶段会成为可单独重启的单元。
修改后的流水线代码:
pipeline { agent any options { restartFromStage() // 启用阶段重启功能 } stages { stage('Stage A') { agent any steps { sh """#!/bin/csh echo "Currently running A" """ } } stage('Stage B') { agent any steps { sh """#!/bin/csh echo "Currently running B" """ } } stage('Stage parallel') { parallel { stage('Stage C_1') { steps { sh """#!/bin/csh echo "Currently running C1" """ } } stage('Stage C_2') { steps { sh """#!/bin/csh echo "Currently running C2" """ } } stage('Stage D_1') { steps { sh """#!/bin/csh echo "Currently running D1" """ } } stage('Stage D_2') { steps { sh """#!/bin/csh echo "Currently running D2" """ } } stage('Stage D_3') { steps { sh """#!/bin/csh echo "Currently running D3" exit 1 """ } } } } } }
方案2:启用restartFromStep保留原有结构
如果需要保持原有的嵌套串行逻辑(比如C_1执行完成后才执行C_2),可在流水线中启用restartFromStep选项,该功能支持从嵌套子阶段重启,依赖Jenkins 2.222+版本及Pipeline: Stage Step等相关插件的支持。
修改后的流水线代码:
pipeline { agent any options { restartFromStep() // 启用从步骤/子阶段重启的功能 } stages { stage('Stage A') { agent any steps { sh """#!/bin/csh echo "Currently running A" """ } } stage('Stage B') { agent any steps { sh """#!/bin/csh echo "Currently running B" """ } } stage('Stage parallel') { parallel { stage('Stage C') { stages { stage('Stage C_1') { steps { sh """#!/bin/csh echo "Currently running C1" """ } } stage('Stage C_2') { steps { sh """#!/bin/csh echo "Currently running C2" """ } } } } stage ('Stage D') { stages { stage ('Stage D_1') { steps { sh """#!/bin/csh echo "Currently running D1" """ } } stage ('Stage D_2') { steps { sh """#!/bin/csh echo "Currently running D2" """ } } stage ('Stage D_3') { steps { sh """#!/bin/csh echo "Currently running D3" exit 1 """ } } } } } } } }
启用该选项后,在流水线运行界面的重启菜单中,会显示嵌套的子阶段选项,可直接选择从Stage D_2开始重启。
如果上述Declarative方案无法满足需求,也可以考虑切换到Scripted Pipeline,它提供了更灵活的控制逻辑,支持单独重启特定子阶段,但需要使用脚本式语法编写流水线。
内容的提问来源于stack exchange,提问作者Chandan
相关产品推荐
相关产品推荐

