Jenkins声明式流水线如何实现仅重跑失败的并行子stage?
解决方案
核心实现思路
- 为每个并行子stage生成独立的成功状态标记,stage执行前先判断标记是否存在,存在则自动跳过执行
- 用
catchError捕获单个子stage的执行失败,保证整个流水线可完整运行到结束,不会中途阻塞 - 重跑时自动复用历史构建的成功状态标记,仅运行无成功标记的失败子stage,无需修改原生构建逻辑
完整流水线示例
pipeline { agent any options { parallelsAlwaysFailFast false } stages { stage('加载历史执行状态') { steps { script { // 自动拉取上一次构建的成功状态标记,需提前安装Copy Artifact插件 def lastBuild = currentBuild.previousBuild if (lastBuild?.artifacts?.any { it.fileName.startsWith('status/') }) { copyArtifacts( projectName: env.JOB_NAME, selector: specific(lastBuild.id), filter: 'status/**', target: '.' ) } } } } stage('Meta Data Creation') { parallel { stage('Activity Category Type') { when { not { fileExists 'status/activity_category_type.success' } } steps { script { catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { // 替换为实际业务执行逻辑 sh 'echo 执行Activity Category Type相关逻辑' // 执行成功写入标记文件 sh 'mkdir -p status && touch status/activity_category_type.success' } } } } stage('Campaign') { when { not { fileExists 'status/campaign.success' } } steps { script { catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { // 替换为实际业务执行逻辑 sh 'echo 执行Campaign相关逻辑' // 执行成功写入标记文件 sh 'mkdir -p status && touch status/campaign.success' } } } } // 其余并行子stage按上述格式补充即可 } } // 其余父stage按上述逻辑实现即可 } post { always { // 归档所有成功状态标记,供重跑时拉取 archiveArtifacts artifacts: 'status/**', allowEmptyArchive: true } } }
使用说明
- 首次触发流水线时无历史状态标记,所有stage全量执行
- 流水线完全执行结束后若存在失败的并行子stage,直接点击重新构建即可:流水线会自动识别已成功的子stage并跳过,仅运行失败的子stage,无需额外操作
- 若无需自动拉取历史状态,可删除「加载历史执行状态」stage,重跑前手动将上一次构建归档的status目录解压到当前工作空间即可,效果一致
内容的提问来源于stack exchange,提问作者Ashik
相关产品推荐
相关产品推荐

