jenkins - Jenkins 声明式管道中上游多分支作业的最后一次成功构建的修订
问题描述
我想获得上游作业的最后一次成功构建的构建修订。上游作业是多分支作业。
到目前为止,我正在生成一个上游作业名称列表作为触发器。但我似乎找不到合适的方法来调用。
import jenkins.model.Jenkins
def upstreamPackages = ['foo', 'bar']
def upstreamJobs = upstreamPackages.collect { "${it}-multibranch/master" }.join(',')
pipeline {
agent none
triggers {
upstream(upstreamProjects: upstreamJobs,
threshold: hudson.model.Result.SUCCESS)
}
stages {
stage('test'){
steps{
script {
upstreamJobs.each {
println it
job = Jenkins.instance.getItem(it)
job.getLastSuccessfulBuild()
revision = job.getLastSuccessfulBuild().changeset[0].revision
println revision
}
}
}
}
}
}
这会导致item
. 这样做的正确方法是什么?
更新 1 在发现 Jenkins 脚本控制台和此评论后,我设法想出了以下内容:
import jenkins.model.Jenkins
import hudson.plugins.git.util.BuildData
def upstreamPackages = ['foo', 'bar']
def upstreamJobsList = upstreamPackages.collect { "${it}-multibranch/master" }.join(',')
@NonCPS
def resolveRequirementsIn(packages){
BASE_URL = 'git@github.com:myorg'
requirementsIn = ''
packages.each { pkg ->
revision = getLastSuccessfulBuildRevision("${pkg}-multibranch")
requirementsIn <<= "-e git+${BASE_URL}/${pkg}.git@${revision}#egg=${pkg}\n"
}
println requirementsIn
return requirementsIn
}
@NonCPS
def getLastSuccessfulBuildRevision(jobName){
project = Jenkins.instance.getItem(jobName)
masterJob = project.getAllItems().find { job -> job.getName() == 'master' }
build = masterJob.getLastSuccessfulBuild()
return build.getAction(BuildData.class).getLastBuiltRevision().sha1String
}
pipeline {
agent { label 'ci_agent' }
triggers {
upstream(upstreamProjects: upstreamJobsList,
threshold: hudson.model.Result.SUCCESS)
}
stages {
stage('Get artifacts'){
steps{
script{
requirementsIn = resolveRequirementsIn upstreamPackages
writeFile file: 'requirements.in', text: requirementsIn
}
}
}
}
}
它抛出一个错误:
an exception which occurred:
in field org.jenkinsci.plugins.pipeline.modeldefinition.withscript.WithScriptScript.script
in object org.jenkinsci.plugins.pipeline.modeldefinition.agent.impl.LabelScript@56d1724
in field groovy.lang.Closure.delegate
in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@27378d57
in field groovy.lang.Closure.delegate
in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@6e6c3c4e
in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.closures
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@5d0ffef3
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@5d0ffef3
Caused: java.io.NotSerializableException:
org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject
解决方案
问题是 Jenkins 的 Pipeline DSL 要求所有分配的对象都是可序列化的。
Jenkins.instance.getItem(jobName)
返回一个WorkflowMultiBranchProject
不可序列化的。Jenkins.instance.getItem(jobName).getItem('master')
which也不是WorkflowJob
对象。
所以我总是沿着调用链向下走,我需要用链式方法调用替换变量赋值,并提出了以下解决方案。
def upstreamPackages = ['foo', 'bar']
def upstreamJobsList = upstreamPackages.collect { "${it}-multibranch/master" }.join(',')
def String requirementsInFrom(packages){
final BASE_URL = 'git@github.com:myorg'
requirementsIn = ''
packages.each{ pkg ->
revision = Jenkins.instance.getItem("${pkg}-multibranch")
.getItem('master')
.getLastSuccessfulBuild()
.getAction(BuildData.class)
.getLastBuiltRevision()
.sha1String
requirementsIn <<= "-e git+${BASE_URL}/${pkg}.git@${revision}#egg=${pkg}\n"
}
return requirementsIn.toString()
}
推荐阅读
- javascript - 如何让我的 js 文件同时适用于 ES6 模块和普通 js?
- airflow - 如何在动态 DAG 创建中动态传递 task_id 名称
- ios - EKEventStore:“initWithAccessToEntityTypes”不可用:在 iOS 上不可用
- java - 由于 SpringBatc 中的块计数而丢失的记录
- node.js - NestJS:在哪里放置文件阅读器?
- python - 我在网页抓取 python 时遇到问题
- c++ - 以 pgm 文件格式的输出构建频率表
- sql - 需要过滤 postgres 中记录共享一个公共 id 但任何一条都未能通过子查询的所有行
- azure - 如何在 Azure 数据工厂中的触发器运行期间将参数传递给管道?
- r - 如何根据 R 中稀疏矩阵的阈值替换行值?