Как я могу обнаружить дополнительные причины моей сборки Jenkins?

При попытке запросить сборку с использованием groovy, я вызываю

myBuild.getCauses()

В интерфейсе Jenkins (экран сборки) я вижу, что эта сборка имеет две причины: UserIdCause и UpstreamCause. Однако, когда я опрашиваю ту же сборку с указанным выше groovy, я получаю только одну причину, то есть UserIdCause. Должен быть какой-то метод получения UpstreamCause из сборки, иначе он не будет присутствовать в пользовательском интерфейсе.

Я использую плагин Build Pipeline, чтобы вручную запускать сборки.

2 ответа

Похоже, что build.getCauses() не получает все причины, а только причины первого causeAction из build.getActions(hudson.model.CauseAction.class)вероятно позвонив build.getAction(hudson.model.CauseAction.class)

Дополнительные действия с их собственной причиной можно найти с помощью:

def actions = build.getActions(hudson.model.CauseAction.class)

и поэтому мы должны рассмотреть причины каждого из этих действий, поэтому вместо def causes = build.causes() у нас есть

def causes = build.getActions(hudson.model.CauseAction.class)
             .collect{ it.getCauses() }.flatten()

и в моем случае это вернет список что-то вроде:

[ 05b8ef62-d071-11e8-b9db-9fd4e0aedf12/job/MyView/1238[11ef1ed2-d071-11e8-8c81-b71616102fe9/job/MyJob/4250[hudson.model.Cause$UserIdCause@2ddf7e3e]],
  hudson.model.Cause$UserIdCause@3337c79c ]

Где первый член представляет плагин построения конвейера upstreamCause и второй член представляет пользователя, который вручную запустил эту сборку.

Конечно, я бы хотел, чтобы плагин Build User Vars использовал самый неглубокий hudson.model.Cause$UserIdCause, а не от какой-либо причины вверх по течению!

Точно так же нет смысла просто пересекать цепь cause.upstreamCauses потому что каждый восходящий поток может иметь несколько причин.

Вместо повторения cause.upstreamCauses, доступ upstreamRunВызывает действия, используя:

cause.upstreamRun.getActions(hudson.model.CauseAction.class).collect{ it.getCauses() }.flatten()

Замечания:

build.getCause(hudson.model.Cause$UserIdCause) может вернуться NULL где build.getCause(hudson.model.Cause$UpstreamCause) будет успешным, даже когда существует действие от getActions() чья причина Cause$UserIdCauseтак предположительно getCause также звонки getAction() вместо getActions()

Вот рабочий Groovy код (я пытался в консоли сценария jenkins) для использования build.getAction

job = hudson.model.Hudson.instance.getItem("demo-job")
build = job.getLastBuild()

// get action first
def action = build.getAction(hudson.model.CauseAction.class)
// get the list of causes
for (cause in action.getCauses()) {
    println cause.getShortDescription()
}
// another way to find specific UpsteamCause directly
cause = action.findCause(hudson.model.Cause.UpstreamCause.class)
println cause.getUpstreamRun() 

Смотрите ссылку

  1. см. build-pipe-plugin, как добавить причину в коде BuildPipelineView.java
  2. см. API hudson.model.Cause
Другие вопросы по тегам