Как получить $ПРИЧИНА в рабочем процессе

Jenkins имеет переменную $CAUSE, доступную для заданий сборки фристайла.

Как я могу получить доступ к этому или что-то подобное в рабочем процессе?

Моя команда использует его в выводах электронной почты существующих ad-hoc-сборок. Мы хотели бы продолжить то же самое в новых рабочих задачах на рабочем столе.

Ответ 1

Похоже, что в сборках Workflow не указана эта переменная. Однако вы можете получить необходимую информацию из объекта currentBuild.rawBuild, используя hudson.model.Run.getCause() или hudson.model.Run.getCauses() метод.

Пример:

Рабочий процесс script:

println "CAUSE ${currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause).properties}"

результат с этим выходом:

Running: Print Message
CAUSE [userName:John Smith, userId:jsmith, class:class hudson.model.Cause$UserIdCause, shortDescription:Started by user John Smith]

Другие подтипы причины можно найти в javadoc.

Существует также хороший get-build-cause пример, основанный на этом ответе в jenkins Конвейерные примеры.

Ответ 2

Я отвечаю на ответ Jazzschmidt, потому что мне просто не хватает репутации... previousBuild делает неправильную вещь, поскольку она получает ранее запущенную работу того же типа, а не работу, которая запускала текущий. Если эта работа была впервые запущена кем-то, тем, кого вы получите. В противном случае ответ будет NULL, который затем вызовет исключение, пытающееся получить его userId.

Чтобы получить "оригинальную" причину, вам нужно пройти по причинам, используя UpstreamCause. Это то, что я закончил, хотя могут быть и другие способы:

@NonCPS
def getCauser() {
  def build = currentBuild.rawBuild
  def upstreamCause
  while(upstreamCause = build.getCause(hudson.model.Cause$UpstreamCause)) {
    build = upstreamCause.upstreamRun
  }
  return build.getCause(hudson.model.Cause$UserIdCause).userId
}

Ответ 3

Я думаю, вы говорите о макросе, определенном в Email Ext плагин. Существует текущая работа, чтобы плагин напрямую поддерживал Workflow. Я не уверен в статусе этого конкретного макроса.

Ответ 4

Если сборка инициируется восходящей сборкой, вам нужно пройти иерархию currentBuild.

Например:

println getCauser(currentBuild).userId

@NonCPS
def getCauser(def build) {
    while(build.previousBuild) {
        build = build.previousBuild
    }

    return build.rawBuild.getCause(hudson.model.Cause$UserIdCause)
}

Это вернет идентификатор пользователя исходной причины пользователя.