Jenkins声明式流水线:如何实现手动作业依赖另一作业上次构建成功
实现Jenkins手动触发作业的交叉依赖检查
嘿,这个需求用Jenkins声明式流水线很容易实现,核心就是先检查依赖作业的上次构建状态,不满足条件就直接终止构建。我给你写个具体的实现方案,分步骤讲清楚:
核心思路
因为两个作业都是手动触发,我们只需要在每个作业的流水线开头,添加一个检查步骤:获取另一个作业的上次构建结果,如果结果不是SUCCESS,就直接抛出错误让当前构建失败;如果是成功,再继续执行后续的构建任务。
具体代码示例
假设我们有两个作业:JobA 和 JobB,现在要实现:
- 只有当
JobB上次构建成功时,JobA才能正常运行;否则JobA构建失败 - 反过来,
JobB也只有在JobA上次构建成功时才能运行
JobA的流水线代码
pipeline { agent any // 明确禁用自动触发,保持手动触发模式 triggers { none() } stages { stage('检查依赖作业状态') { steps { script { // 获取依赖作业JobB的实例 def dependentJob = Jenkins.instance.getItemByFullName('JobB') // 获取JobB的上次构建记录 def lastBuild = dependentJob.getLastBuild() // 双重检查:上次构建存在,且状态为成功 if (!lastBuild || lastBuild.result != Result.SUCCESS) { error("❌ JobB的上次构建状态不是成功,无法执行JobA,请先确保JobB构建成功!") } else { echo("✅ JobB上次构建成功,可以继续执行JobA") } } } } stage('执行JobA的核心任务') { steps { echo "开始执行JobA的实际构建任务..." // 这里替换成你的具体步骤,比如: // sh 'mvn clean package' // deploy ... } } } }
JobB的流水线代码
只需要把上面代码中的JobB替换成JobA即可:
pipeline { agent any triggers { none() } stages { stage('检查依赖作业状态') { steps { script { def dependentJob = Jenkins.instance.getItemByFullName('JobA') def lastBuild = dependentJob.getLastBuild() if (!lastBuild || lastBuild.result != Result.SUCCESS) { error("❌ JobA的上次构建状态不是成功,无法执行JobB,请先确保JobA构建成功!") } else { echo("✅ JobA上次构建成功,可以继续执行JobB") } } } } stage('执行JobB的核心任务') { steps { echo "开始执行JobB的实际构建任务..." // 你的具体步骤 } } } }
注意事项
- 权限问题:确保运行Jenkins的用户账号,拥有读取目标依赖作业构建记录的权限,否则会抛出权限异常
- 文件夹作业:如果你的作业在Jenkins文件夹下,
getItemByFullName需要填写完整路径,比如'MyProjectFolder/JobB' - 扩展检查:如果需要更严格的检查,可以加上
lastBuild.isStable()来确保上次构建是稳定的(不过通常SUCCESS状态已经足够)
内容的提问来源于stack exchange,提问作者Giel Berkers
相关产品推荐
相关产品推荐

