如何在Jenkins中让Stage B定时重复运行至Stage A完成?
Jenkins Pipeline 实现Stage B循环执行直到Stage A完成
针对你的场景(Stage A执行长时间测试,Stage B定时压缩推送最新报告直到A结束),可以通过两种方式调整Pipeline配置:
方案一:通过阶段状态检查实现循环
直接利用Jenkins内置的currentBuild对象获取Stage A的执行状态,在Stage B中循环执行直到A完成:
stage("Run A and Run B") { parallel { stage('A') { steps { // 替换为你的耗时测试任务 sh 'echo "执行耗时测试任务..." && sleep 3600' // 模拟1小时任务 } } stage('B') { steps { script { while (true) { // 获取Stage A的当前状态 def stageAStatus = currentBuild.getStageResults().find { it.name == 'A' }?.status // 当Stage A进入完成状态(成功/失败/中止)时停止循环 if (stageAStatus in ['SUCCESS', 'FAILURE', 'ABORTED']) { echo "Stage A已完成,状态:${stageAStatus},停止Stage B循环" break } // 执行压缩并推送最新报告的操作 echo "开始压缩推送最新测试报告..." sh 'tar -czf latest_report.tar.gz ./test_reports && scp latest_report.tar.gz user@remote:/target/path' // 替换为实际命令 // 等待1分钟后再次执行 sleep time: 1, unit: 'MINUTES' } } } } } }
方案二:通过共享变量标记完成状态
如果担心getStageResults的版本兼容性,可以用全局变量标记Stage A的完成状态:
// 定义全局变量标记Stage A是否完成 def stageAFinished = false stage("Run A and Run B") { parallel { stage('A') { steps { try { // 替换为你的耗时测试任务 sh 'echo "执行耗时测试任务..." && sleep 3600' } finally { script { // 无论任务成功/失败/中止,都标记为完成 stageAFinished = true } } } } stage('B') { steps { script { while (!stageAFinished) { // 执行压缩推送操作 echo "开始压缩推送最新测试报告..." sh 'tar -czf latest_report.tar.gz ./test_reports && scp latest_report.tar.gz user@remote:/target/path' // 替换为实际命令 // 等待1分钟 sleep time: 1, unit: 'MINUTES' } echo "Stage A已完成,停止Stage B循环" } } } } }
注意事项
- 确保Jenkins运行节点有足够资源同时承载两个并行阶段的执行
- 若测试报告是逐步生成的,需保证每次Stage B执行时能读取到最新的报告文件
sleep的时间单位支持SECONDS/MINUTES/HOURS,可根据需求调整
内容的提问来源于stack exchange,提问作者anandhu
相关产品推荐
相关产品推荐

