Jenkinsfile处理预期的作业失败

110次阅读
没有评论

问题描述

在Jenkins作业中遇到了两种类型的失败情况:
1. 作业真正失败了。
2. 作业失败是因为某些信息尚未发布,实际上并没有问题。

用户想知道如何处理第二种情况,以便显示作业未完成,但实际上并没有问题。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

一种可能的解决方案是将所有必要的前提条件(包括需要发布的那些信息)的检查放在一个单独的构建步骤中,在实际构建步骤之前执行。
如果这个预检步骤中的检查失败,可以将构建标记为中止而不是失败。中止的构建将更好地表示”实际上没有问题”(这是有争议的,我知道)。
可以通过类似以下 Stack Overflow 答案的方式将构建标记为中止:
Abort current build from pipeline in Jenkins
Jenkins – abort running build if new one is started

如果这些检查无法在与实际构建步骤分离的步骤中执行,情况会稍微复杂一些:
– 实际构建步骤必须以某种方式配置为不使作业失败。对于使用 ShiningPanda 插件在虚拟环境中执行的步骤,我知道是可能的,但其他类型的步骤没有这样的能力。
– 在实际构建步骤之后必须添加一个额外的步骤。它的作用是判断实际构建步骤是否失败,如果失败,是否是由于其中一个未满足的先决条件(例如通过解析构建日志来判断?),如果是,则中止构建。否则,根据实际构建步骤的结果,传递或失败,以正确指示 Jenkins 中的整体运行状态。

方案2

使用脚本或工具来管理构建的顺序可能会增加复杂性,并且需要确保先决条件的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制构建的运行顺序。您可以使用docker run命令来手动控制构建的启动顺序,或者使用一些第三方工具来管理构建的依赖关系。

以下是一个简单的bash脚本示例,可以在构建A启动后启动构建B:

#!/bin/bash
# 启动构建A
docker run -d --name build_a your_image_a
# 等待构建A完全启动
while ! docker exec build_a echo "Build A is ready"; do
  sleep 1
done
# 启动构建B
docker run -d --name build_b your_image_b

在这个示例中,我们首先使用docker run命令启动构建A,并将其命名为build_a。然后,使用一个循环来等待构建A完全启动(这里是通过在构建内运行echo命令来测试)。一旦构建A就绪,我们再使用docker run命令启动构建B,并将其命名为build_b

以上是两种处理Jenkins作业中预期的失败情况的解决方案。您可以根据您的具体需求选择适合您的方法。

正文完