У нас есть задание Jenkins, в котором используется декларативный конвейер.
Это задание может запускаться различными другими сборками.
Как в декларативном конвейере узнать, какая сборка запустила конвейер?
У нас есть задание Jenkins, в котором используется декларативный конвейер.
Это задание может запускаться различными другими сборками.
Как в декларативном конвейере узнать, какая сборка запустила конвейер?
Пример кода ниже
pipeline { agent any stages { stage('find upstream job') { steps { script { def causes = currentBuild.rawBuild.getCauses() for(cause in causes) { if (cause.class.toString().contains("UpstreamCause")) { println "This job was caused by job " + cause.upstreamProject } else { println "Root cause : " + cause.toString() } } } } } } }
Вы можете проверить REST API задания, чтобы получить дополнительную информацию, как показано ниже.
{ "_class" : "org.jenkinsci.plugins.workflow.job.WorkflowRun", "actions" : [ { "_class" : "hudson.model.ParametersAction", "parameters" : [ ] }, { "_class" : "hudson.model.CauseAction", "causes" : [ { "_class" : "hudson.model.Cause$UpstreamCause", "shortDescription" : "Started by upstream project \"larrycai-sto-46908390\" build number 7", "upstreamBuild" : 7, "upstreamProject" : "larrycai-sto-46908390", "upstreamUrl" : "job/larrycai-sto-46908390/" } ] },
Ссылка:
Я понимаю, что этому пару лет, но предыдущий ответ требовал дополнительной настройки безопасности в моем экземпляре Jenkins. После небольшого исследования я обнаружил, что в 11/2018 был выполнен запрос на новую функцию, которая удовлетворяет эту потребность и раскрывает причины сборки в currentBuild. Вот небольшая библиотека, которую я написал, которая возвращает причину со строкой «JOB/», если сборка была запущена другой сборкой:
def call(body) {
if (body == null) {body = {DEBUG = false}}
def myParams= [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = myParams
body()
def causes = currentBuild.getBuildCauses()
if (myParams.DEBUG) {
echo "causes count: " + causes.size().toString()
echo "causes text : " + causes.toString()
}
for(cause in causes) {
// echo cause
if (cause._class.toString().contains("UpstreamCause")) {
return "JOB/" + cause.upstreamProject
} else {
return cause.toString()
}
}
}
Чтобы использовать это, я помещаю его в библиотеку в файл с именем «buildCause.groovy». Затем я ссылаюсь на библиотеку в верхней части моего Jenkinsfile:
library identifier: 'lib@master', retriever: modernSCM(
[$class: 'GitSCMSource', remote: '<LIBRARY_REPO_URL>',
credentialsId: '<LIBRARY_REPO_CRED_ID', includes: '*'])
Затем я могу вызвать его по мере необходимости в моем конвейере:
def cause=buildCause()
echo cause
if (!cause.contains('JOB/')) {
echo "started by user"
} else {
echo "triggered by job"
}
Ответ Ларри не совсем сработал для меня.
Но после того, как я немного изменил его с помощью эти документы и эта версия работает:
def causes = currentBuild.getBuildCauses()
for(cause in causes) {
if (cause._class.toString().contains("UpstreamCause")) {
println "This job was caused by job " + cause.upstreamProject
} else {
println "Root cause : " + cause.toString()
}
}
P.S. На самом деле, Daniel answer упоминает этот метод, но слишком много беспорядка, я заметил это только после того, как написал свое решение.