问题描述
在使用Jenkins声明性流水线时,有一个需求:根据不同的上游作业触发器,决定流水线中的某些阶段是否执行。用户尝试使用when
子句和triggeredBy
条件来确定每个阶段何时运行,但是现有的文档描述不够详细。用户想知道是否有一种'UpstreamCause'
的等效方式,允许他指定哪个上游原因应该触发特定的阶段。如果有的话,确切的语法是什么?用户的需求类似于以下的示例:
when {
anyOf {
triggeredBy cause: 'UpstreamCause', detail: 'Job A'
triggeredBy cause: 'UpstreamCause', detail: 'Job C'
}
}
用户也愿意尝试其他方法来实现这个目标。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在Jenkins声明性流水线中,原生的Declarative语法不支持直接根据特定的上游作业触发器来触发特定阶段。然而,可以使用Scripted语法来实现这一目标。以下是一种可能的实现方式(请注意,这只是示例,可能需要进行调试):
script {
def myJob = 'put-your-job-name-here'
def causes = currentBuild.rawBuild.getCauses()
def triggeredByMyJob = causes.any { cause ->
cause.class.toString().contains("UpstreamCause")) && cause.upstreamProject == myJob
}
if (triggeredByMyJob) {
// 在这里添加触发特定上游作业的步骤
} else {
// 在这里添加非特定上游作业触发时的步骤
}
}
在上面的示例中,我们首先获取当前构建的原始原因(causes
),然后检查是否有上游作业的触发器是我们指定的特定作业(myJob
)。如果是特定作业触发的构建,则执行相应的步骤。否则,执行其他步骤。
方案2
尽管不是严格符合用户的直接需求,但也可以使用更简单的方法。在下游作业中添加一个布尔型参数(例如runMyStages
),并使用when
子句根据runMyStages
参数的值来条件性执行阶段。然后,在上游作业中的构建步骤中设置该参数,如下所示:
build(job: 'downstream-job-name', parameters: [booleanParam('runMyStages', false)])
这种方法可以通过在上游作业的构建步骤中设置参数来实现流程控制。
注意事项
- 方案1中的Scripted语法需要注意脚本的正确性和可靠性,需要根据实际情况进行调试和修改。
- 方案2虽然不直接满足用户的原始需求,但可以考虑是否适用于当前的作业结构和流程。
以上两种方案中,用户可以根据实际情况和需求选择适合的方法来实现流水线的流程控制。
正文完