Jenkins Pipeline中cp命令失败如何跳过当前阶段、保障后续阶段运行
实现cp报错不中断流水线的可落地方案
Jenkins声明式Pipeline的默认逻辑是:任意一步执行返回非0退出码时,会直接终止整个流水线的后续执行。要实现「cp命令找不到文件报错时,跳过当前阶段、不阻断后续流程」的需求,只需要针对性给对应阶段加错误处理配置即可,不需要改动整体流水线的执行顺序。
方案1:保留当前阶段失败标记,不阻断后续执行
适合需要追溯哪个环节出问题的场景:当Stage1/Stage2里的cp因为找不到文件执行失败时,流水线不会强制终止,会正常运行Stage3及后续所有阶段,只是失败的阶段会被标记为异常状态,整个流水线最终会输出「不稳定/失败」的构建结果。
只需要在对应容易出错的Stage里加上continueOnError true配置即可,修改后的示例Pipeline:
pipeline { stages { stage('Stage1') { // 配置:当前阶段失败时,不中断后续流水线运行 options { continueOnError true } steps { sh ''' echo 'Copying files' cp ./file1 ./directory1 ''' } } stage('Stage2') { options { continueOnError true } steps { sh ''' echo 'This stage should still work and run' cp ./directory2/files ./directory2/subdirectory ''' } } stage('Stage3') { // 该阶段及后续所有流程不受前面阶段失败的影响,正常执行 echo '后续阶段正常运行' } } }
- 该配置的作用域仅为当前所在Stage,不会改动其他Stage的默认错误处理逻辑
- 不管是cp找不到文件、还是其他命令执行触发的非0退出码,只要Stage标记了这个配置,都不会触发流水线全局中断
方案2:捕获cp的执行错误,不标记阶段失败直接跳过
如果不需要因为文件缺失的错误把当前Stage标记为失败,只是想跳过无效的拷贝操作、不把错误向上抛到Pipeline层,可以直接在shell脚本里对cp的退出码做拦截,不让非0返回值触发Pipeline的中断判定。
修改后的脚本示例:
stage('Stage1') { steps { sh ''' echo 'Copying files' # cp执行报错时直接走提示逻辑,整个脚本块最终返回退出码0,Pipeline不会判定为执行失败 cp ./file1 ./directory1 || echo "未找到目标文件,跳过本次拷贝操作" ''' } }
- 这个写法的逻辑是打断cp命令失败后的错误上抛流程,只要cp执行报错,就执行后面的echo提示,整个sh块最终会以0退出码结束
- 注意该写法仅适合可以安全跳过的操作,不要无差别吞掉所有错误,避免掩盖权限不足、文件损坏这类真正需要排查的执行问题
内容的提问来源于stack exchange,提问作者stackerstack
相关产品推荐
相关产品推荐

