Jenkinsfile – Как Я Могу Добавить Предложение When Для Определенного Восходящего Триггера В Декларативный Конвейер Jenkins?

  • Автор темы AhomasJak
  • Обновлено
  • 22, Oct 2024
  • #1

У меня есть задание, определенное как декларативный конвейер, который запускается рядом различных вышестоящих заданий. В зависимости от того, какое вышестоящее задание вызвало мое задание, мне не обязательно запускать все этапы моего конвейера, поэтому я хочу указать список триггеров для каждого этапа.

Я надеялся использовать

 when {

anyOf {

triggeredBy cause: 'UpstreamCause', detail: 'Job A'

triggeredBy cause: 'UpstreamCause', detail: 'Job C'

}
}
 
clause and 'UserIdCause' условия для определения времени запуска каждого этапа, но документация не очень подробно:

вызвано

Выполнить этап, когда текущая сборка была запущена указанным параметром. Например:

когда { TriggedBy 'SCMTrigger' }

когда { TriggedBy 'TimerTrigger' }

когда { TriggedBy 'UpstreamCause' }

когда { TriggedBy Cause: "UserIdCause", подробно: "vlinde" }

Есть ли 'UpstreamCause' equivalent to the example for triggeredBy это позволило бы мне указать который вышестоящая причина должна запускать конкретную стадию? Если да, то каков точный синтаксис? В основном я хочу сделать что-то вроде:

when

Я также открыт для других подходов для достижения этой цели.

#jenkins-pipeline #jenkinsfile

AhomasJak


Рег
11 Mar, 2014

Тем
47

Постов
179

Баллов
444
  • 25, Oct 2024
  • #2

Существует ли «UpstreamCause», эквивалентный примеру «UserIdCause», который позволил бы мне указать, какая восходящая причина должна запускать определенный этап?

К сожалению, не в родном декларативном синтаксисе.

Как вы видете из исходного кода, UserIdCause является особым случаем, но никакая другая причина не является:

 
 build(job: 'downstream-job-name', parameters: [booleanParam('runMyStages', false)]) 

Поэтому, если вы хотите запускать сборку по условию в зависимости от того, какое задание инициировало сборку, вам нужно будет использовать синтаксис сценариев. Например (я не проверял это, поэтому нет никаких гарантий, что он будет работать без отладки):

runMyStages

Однако потенциально существует гораздо более простой способ, хотя это не совсем то, о чем вы просили: дайте вашей последующей работе логический параметр, для примера назовем ее when , and use a runMyStages предложение для условного выполнения этапов в зависимости от того, 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) { // put steps to execute when triggered by your job here } else { // put steps to execute when NOT triggered by your job here } } is true or false. Then in your upstream jobs, you can set that parameter in your build step: static boolean shouldRunBeAllowed(Cause causeClass, String cause, String detail){ if( causeClass instanceof Cause.UserIdCause && Cause.UserIdCause.simpleName == cause){ return detail == null || causeClass.userId == detail }else { return causeClass.class.simpleName.matches("(?i)\\.*${cause}.*") } } .

 

Partizan


Рег
09 Aug, 2011

Тем
70

Постов
180

Баллов
550
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно