更新商店前先测试

JenkinsBeginner
立即练习

介绍

Moss & Mallow 是一家虚构的社区礼品店。它新推出的种子套装系列应保留现有的组合折扣和配送规则。商店目前运行正常,但提供的 Jenkins Pipeline 即使遇到真实的定价测试失败,仍然可能发布候选版本。

你将阅读实际的测试失败信息,让 Jenkins 构建状态参与发布决策,并发布正常工作的候选版本。本实验要求你掌握 Jenkins 的基本页面操作,并能看懂一段简短的声明式流水线(Declarative Pipeline)。实验会解释新用到的测试报告和发布门禁设置;你不需要编写应用程序、安装软件、拥有云账户或进行真实购买。

使用 Gift Shop 体验顾客的购物流程,使用 Jenkins 配置和运行构建。这是同一台已准备好的 VM 中的两个服务。broken 和 fixed 是提供的两个候选测试版本。每个单元都独立初始化。预计用时包含阅读和常见错误的处理时间,尚未经初学者实测。

观察失败的测试究竟阻止了什么

在这一步中,你将把正常价格与一次真实的测试失败进行比较,了解为什么处于不稳定状态的 Jenkins 构建仍然能够发布。请从 Gift Shop 开始。

选择 Find a little gift,或导航栏中的 Shop。一份种子套装的价格为 £12。购买三份或更多种子套装可享受 10% 的组合折扣。配送费为 £4,商品总额达到 £40 时免配送费。页面价格仅供估算;商店不会收取任何款项。

将种子套装的 Quantity 设为 3,然后选择 Check basket。正常的商品金额为 £32.40,配送费为 £4.00,总额为 £36.40。使用 Shop 返回。再检查两个野餐盒:商品金额为 £40.00,且免配送费。打开 Visit,下载种子养护卡,并阅读保存下来的文本文件。实验结束时,这些正常功能必须仍然可用。

候选版本(candidate)是正在考虑发布的版本。构建(build)是 Jenkins 的一次执行,拥有独立的编号、参数和结果。切换到 Jenkins Tab。打开 shop-update,然后选择 Build with Parameters。将 RELEASE 保持为 broken,选择 Build。第一次运行会故意发布一个有错误的训练候选版本,以便你观察问题;这不会影响真实顾客。

等待构建结束。在 Builds 下打开带编号的构建条目,然后打开 Console Output。这条 Pipeline 有三个阶段:Prepare 将选定的候选版本复制到构建工作区,Test 运行提供的定价检查,Publish 将软件包交付给商店。

控制台应包含以下固定输出行:

Pricing failures: 1
Release received
Finished: UNSTABLE

UNSTABLE 表示构建存在质量问题,例如测试失败。这个状态本身并不会阻止所有后续阶段。Release received 表明这条 Pipeline 仍然执行了发布。

在该构建中打开 Tests。打开失败的 seed_bundle 测试,阅读失败详情:

Expected 3240 400; got 2880 400

真实的 Jenkins 测试报告:一个用例失败,三个用例通过

这些数值以便士为单位:测试预期商品金额为 £32.40、配送费为 £4,但候选版本算出的商品金额为 £28.80。另外三个测试通过了。这些结果来自实际执行候选版本的定价程序;XML 报告根据这些比较结果生成。

切换到 Gift Shop,使用 Shop 再次检查三份种子套装。必要时刷新页面。现在,错误的总额为 £32.80。你已经观察到一次实际的错误发布,而不仅是一个警告颜色。在使用本步骤的检查功能前,返回 Jenkins 中带编号的构建页面。

将测试结果与发布关联起来

在这一步中,你将修改 Pipeline,让失败的测试保持可见,并阻止 Publish 阶段运行。请从 Jenkins 开始,通过面包屑导航链接打开 shop-update 任务页面。

选择 Configure,然后找到 Pipeline 区域。其中的 Script 编辑器包含一条声明式流水线。agent any 会选择一个可用的 Jenkins 执行器;在这个已准备好的入门环境中,它在控制器容器内运行。工作区是分配给该构建的目录。独立 agent 的用法会在另一个项目中讲解。

阅读 Test 阶段。提供的 sh returnStatus: true, script: ... 这一行会运行测试脚本并返回退出状态,而不是立即抛出 Pipeline 错误。这样,接下来的 junit 步骤就能发布测试详情。退出状态为零表示脚本通过,非零表示未通过。junit 读取 XML 结果文件,将测试结果附加到本次构建上,并且通常会在测试失败时将构建标记为 UNSTABLE。

Pipeline 的选项(option)会改变 Jenkins 运行流水线的方式。紧接在 agent any 后面添加以下一行。花括号将这个选项括在一起;请原样保留左右花括号。

options { skipStagesAfterUnstable() }

现在,脚本开头应如下所示。保留其他所有现有行,包括接收端地址以及提供的 Prepare、Test 和 Publish 阶段。

pipeline {
    agent any
    options { skipStagesAfterUnstable() }

这个选项会在构建变为不稳定状态后跳过后续阶段。它不会把失败的测试变成通过。保留标准的报告发布步骤:

junit testResults: 'reports/pricing.xml'

保留提供的 shell 调用,用于复制候选版本、运行 test-shop.sh 和发布软件包。测试报告必须来自该测试运行程序;不要用写入报告的步骤替代它,也不要添加其他 shell 命令。

不要添加 skipMarkingBuildUnstable: true:这个设置会抑制门禁所依赖的构建状态。不要删除测试、修改预期价格、更改提供的候选版本或发布程序,也不要让所有候选版本都跳过发布。

选择 Save。选择 Build with Parameters,保持 broken,然后选择 Build。等待新的带编号构建结束。打开 Console Output。这次你应看到:

Pricing failures: 1
Stage "Publish" skipped due to earlier stage(s) marking the build as unstable
Finished: UNSTABLE

打开 Tests。同一个失败的测试和三个通过的测试应仍然存在。新构建中不能出现 Release received。商店可能仍然显示之前的错误版本:阻止一次新的发布尝试,不会自动回滚之前已经完成的发布。接下来,你将用正常工作的候选版本替换它。

如果构建报告的是 Groovy 语法错误,请再次打开 Configure。检查新增的 options 行是否位于 pipeline 内、紧接在 agent any 下方,以及花括号是否配对。修正后选择 Save,再运行一次 broken。仅有语法错误并不能完成这一步。Jenkins 有时会输出 Checks API 发布器提示;本地课程不使用托管 Git 服务,因此这条提示不能代替实际的测试结果。

发布正常工作的候选版本

在这一步中,你将证明同一条 Pipeline 能够交付正确的更新,同时保留正常的顾客购物流程。请从 Jenkins 中的 shop-update 任务页面开始。

选择 Build with Parameters。将 RELEASE 设为 fixed,然后选择 Build。这会选中提供的正常候选版本,不会改变你刚才测试过的 Pipeline。等待构建完成,打开新构建的 Console Output。

Pricing failures: 0
Release received
Finished: SUCCESS

打开 Tests。四个定价测试应全部通过。返回该构建的状态页面,找到 Build Artifacts。下载 shop-release.tar.gz。构建产物(artifact)是 Jenkins 为这次构建保留的文件;这个压缩归档包含定价程序、发布元数据和养护卡。该归档也是实际发送给商店的软件包,并非另外重新构建的副本。

切换到 Gift Shop,选择品牌链接返回首页,然后刷新页面。现在的系列名称为 Gifts to grow together。打开 Shop,检查三份种子套装:商品金额 £32.40、配送费 £4.00、总额 £36.40。两个野餐盒必须仍然免配送费。打开 Delivery 和 Visit,再次下载养护卡,并确认内容完整。

正常的购物篮:商品金额、配送费和总额均正确

最终检查会将真实的失败构建和成功构建,与当前保存的 Pipeline 以及已部署的文件字节关联起来。如果你在这些运行完成后编辑了 Pipeline,请先重新运行 broken,再运行 fixed,让两次结果都对应你要提交的版本。保留之前的构建和商店原有资源;无需编写报告或复制控制台输出文件。

如果你误选了 broken,请保留门禁,再运行 fixed。如果 Jenkins 仍在构建,请等待该编号构建的最终结果,不要反复提交更多构建。仅首页正常还不够:购物篮价格和下载功能也是最终成果的一部分。

总结

你观察了一次真实的定价测试失败,了解了为什么不稳定的构建仍然会发布,并将 Jenkins 测试结果与发布门禁关联起来。随后,你使用同一条 Pipeline 交付了正常工作的候选版本,并检查了实际价格、归档软件包和商店的正常功能。