news 2026/4/15 17:53:56

Jenkins流水线是怎么知道每个阶段运行结束了的?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Jenkins流水线是怎么知道每个阶段运行结束了的?

Jenkins流水线是怎么知道每个阶段运行结束了的?

Jenkins流水线判断每个阶段运行结束的机制基于Groovy脚本执行状态回调。以下是详细原理:

1.声明式流水线(Declarative Pipeline)

pipeline{agent any stages{stage('Build'){steps{echo'Building...'// 所有步骤执行完毕 → 阶段结束}post{success{echo'Stage succeeded'}}}stage('Test'){steps{// 前一个阶段完成后才会进入此阶段sh'npm test'}}}}

2.脚本式流水线(Scripted Pipeline)

node{stage('Build'){// 执行代码块echo'Building...'// 代码块执行完毕 → 阶段结束}stage('Test'){// 只有上一个阶段完成后才会执行sh'make test'}}

3.核心判断机制

步骤执行状态

  • 每个step(如sh,echo,bat)都返回执行状态
  • 步骤成功:继续执行下一步
  • 步骤失败:抛出异常,阶段标记为失败

阶段边界检测

// Jenkins内部逻辑简化表示for(Stage stage:pipeline.stages){try{stage.execute()// 执行阶段内所有步骤stage.status='SUCCESS'}catch(Exception e){stage.status='FAILURE'if(stage.failFast)break// 是否中断流水线}}

异步任务处理

stage('Deploy'){steps{// 并行任务parallel(frontend:{sh'deploy-frontend.sh'},backend:{sh'deploy-backend.sh'})// 所有并行分支完成后 → 阶段结束}}

4.状态持久化与回调

  • Jenkins记录每个步骤的执行结果到build.xml
  • 使用持久化状态机跟踪进度
  • 通过回调处理器通知阶段完成事件

5.实际工作流程示例

stage('Build'){steps{// 1. Jenkins执行 sh 步骤sh'mvn compile'// 2. 等待shell命令退出// 3. 检查退出码(0=成功,非0=失败)// 4. 记录步骤结果// 5. 所有步骤成功 → 阶段结束echo'Build completed'// 6. 触发 post-stage 钩子}}

6.关键特性

顺序执行

  • 阶段按定义顺序执行
  • 前一个阶段必须完成(成功/失败)才能进入下一个

错误处理

stage('Deploy'){steps{retry(3){sh'deploy.sh'// 失败会重试}timeout(time:1,unit:'HOURS'){sh'smoke-test.sh'// 超时则阶段失败}}}

可视化跟踪

  • Blue Ocean界面实时显示阶段状态
  • 阶段图标变化(蓝色=进行中,绿色=成功,红色=失败)

7.底层实现

// 简化的Jenkins核心代码逻辑publicclassStageExecution{publicFlowNoderun(){startStage();try{for(Stepstep:steps){step.run();// 执行每个步骤if(step.failed()){thrownewFlowInterruptedException();}}endStage(Result.SUCCESS);}catch(Exceptione){endStage(Result.FAILURE);}}}

总结

Jenkins通过:

  1. 步骤状态跟踪- 每个步骤的返回码决定是否继续
  2. 异常处理机制- 捕获失败并更新阶段状态
  3. 同步屏障- 确保阶段顺序执行
  4. 持久化状态- 记录到磁盘供中断后恢复

这些机制共同确保流水线能准确判断每个阶段的结束状态。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 7:53:07

1.1 云原生时代为什么选择Go?5分钟带你理解Go语言的独特优势

1.1 云原生时代为什么选择Go?5分钟带你理解Go语言的独特优势 引言 在云原生技术栈中,无论是Kubernetes、Docker、Istio还是Prometheus,这些核心组件都选择了Go语言作为开发语言。为什么Go语言能在云原生时代脱颖而出?本文将深入解析Go语言的独特优势,帮助你理解为什么Go…

作者头像 李华
网站建设 2026/3/29 9:21:29

1.3 Go语言核心语法速成:变量、函数、结构体10分钟快速上手

1.3 Go语言核心语法速成:变量、函数、结构体10分钟快速上手 引言 Go语言的语法设计简洁而强大,本文将通过大量实例快速掌握Go语言的核心语法:变量声明、函数定义、结构体使用。这些是Go语言的基础,掌握它们就能开始编写Go程序了。 一、变量声明 1.1 变量声明方式 Go语…

作者头像 李华
网站建设 2026/4/15 14:10:47

1.7 Go HTTP服务器进阶:路由、中间件、错误处理完整实现

Go HTTP服务器进阶:路由、中间件、错误处理完整实现 引言 在掌握了 HTTP 服务器基础后,我们需要学习更高级的特性来构建生产级的应用。本文将深入讲解路由管理、中间件设计、错误处理、优雅关闭等进阶特性,让你能够构建健壮、可维护的 HTTP 服务器。 一、高级路由管理 1…

作者头像 李华
网站建设 2026/4/14 2:01:33

‌幽默案例:AI测试工具“误判”的搞笑瞬间‌

在软件测试领域,AI工具的崛起带来了革命性的效率提升,但也伴随着令人啼笑皆非的“误判”瞬间。这些误判,往往源于算法偏差、数据噪声或边界条件处理不当,却在严肃的测试报告中上演着一幕幕喜剧。作为测试从业者,我们深…

作者头像 李华
网站建设 2026/4/15 8:18:02

2026趋势:AI认证测试工程师需求激增——软件测试从业者的转型指南

AI认证测试工程师的崛起背景 2026年,软件测试行业正经历前所未有的变革,AI技术的深度集成不仅提升了测试效率,还重塑了职业角色。AI认证测试工程师的需求激增,源于AI测试从概念验证迈向工程化落地。随着软件复杂性加剧&#xff0…

作者头像 李华