Как получить BUILD_USER в Jenkins, когда задание запускается по таймеру?

Я хотел показать пользователю, который вызвал работу Дженкинса, в электронном письме. Это возможно с помощью плагина Build User Vars Plugin и переменной env BUILD_USER. Но эта переменная не инициализируется, когда задание запускается планировщиком.

Как мы можем достичь этого? Я знаю, что у нас есть плагин под названием - EnvInject Plugin, и его можно использовать...

Но я просто хочу знать, как мы можем использовать это и достичь решения...

Ответ 1

Это можно сделать с помощью Jenkins Build User Vars Plugin, который предоставляет набор переменных среды, включая пользователя, который начал сборку. Он предоставляет переменные окружения, такие как BUILD_USER_ID, EMAIL и т.д.

Когда сборка запускается вошедшим в систему пользователем вручную, этот идентификатор пользователя доступен в переменной среды BUILD_USER_ID.

Однако эта переменная среды не будет заменена/инициализирована, когда сборка будет автоматически запускаться таймером/планировщиком Jenkins.

Прикрепленный скриншот для подробностейenter image description here

Эту проблему можно решить, внедрив условие в задание, используя плагин этапа условной сборки/плагин условия выполнения, где к каждому заданию мы можем добавить условие для инициализации переменной BUILD_USER_ID только тогда, когда сборка вызвана или запущена таймером или планировщиком, установив условие с помощью регулярного выражения..

Ответ 2

У меня не работал плагин Build User Vars, поэтому я быстро и грязно взломал:

BUILD_CAUSE_JSON=$(curl --silent ${BUILD_URL}/api/json | tr "{}" "\n" | grep "Started by")
BUILD_USER_ID=$(echo $BUILD_CAUSE_JSON | tr "," "\n" | grep "userId" | awk -F\" '{print $4}')
BUILD_USER_NAME=$(echo $BUILD_CAUSE_JSON | tr "," "\n" | grep "userName" | awk -F\" '{print $4}')

Ответ 3

Установите "Построить плагин Vars User Vars" и используйте, как показано ниже: - [См. Https://plugins.jenkins.io/build-user-vars-plugin ]

enter image description here

Обязательно установите флажок " Set jenkins user build variables разделе " Build Environment для конфигурации задания Jenkins.

enter image description here

Ответ 4

Я использую комбинацию модулей "Execute Shell" и "Env Inject" следующим образом:

  • Создайте шаг сборки Execute Shell, который использует подстановку параметров оболочки, чтобы записать значение по умолчанию и отобразить это значение в файл. Пример показан на снимке экрана ниже.
  • Используйте файл Env Inject для чтения этого файла в качестве свойств для установки.

Jenkins строит шаги для переменных по умолчанию

Ответ 5

Токен $BUILD_CAUSE из email-ext plugin - это то, что вы ищете.

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

Некоторые токены добавляются плагинами, но по умолчанию это должно быть доступно.

Изменить: Как отметил епископ в комментариях, при использовании EnvInject плагин, токен $BUILD_CAUSE изменяется, чтобы вести себя по-другому.

Ответ 6

Я хотел вызвать информацию об инициаторе сборки для одной из моих групп slack/flock, поэтому я использовал следующий способ, чтобы получить электронную почту и имя инициатора сборки, написав в декларативном стиле.

Я просто печатаю здесь, вы можете использовать для хранения в некоторой переменной среды или записать в один файл, давая путь к файлу в соответствии с вашими собственными предпочтениями..

pipeline {
environment {
    BRANCH_NAME = "${env.BRANCH_NAME}"
    }
agent any

stages{
        stage('Build-Initiator-Info'){
                sh 'echo $(git show -s --pretty=%ae)'
                sh 'echo $(git show -s --pretty=%an)'
        }
           }

}

Ответ 7

Получается имя пользователя, который нажал "Построить сейчас" в конвейерном задании Jenkins.

@NonCPS
def getBuildUser() {
    return currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
}

Ответ 8

Просто уточню ответ Мусаффира Лп. Плагин условного шага сборки теперь напрямую поддерживает причину сборки - для этого также требуется плагин условия выполнения.

Если вы хотите определить, когда сборка была запущена по таймеру, вы можете выбрать Выполнить? значение "Причина сборки" с причиной сборки из: TimerTrigger

enter image description here

Это немного проще и надежнее, чем использование регулярных выражений. Есть и другие триггеры, которые вы можете обнаружить, например, когда сборка была результатом фиксации управления исходным кодом, вы можете выбрать: SCMTrigger.

Ответ 9

Я нашел похожий, но действительно работающий на Jenkins 2.1.x и легкий для моего понимания способ. И это работает без каких-либо плагинов.

if (currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')['userId']){
    // Will be run only if someone user triggers build
    // Because in other cases this contructions returns null
}

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

Ответ 10

Для декларативного синтаксиса конвейера, вот быстрый взлом, основанный на ответе @Kevin. Для декларативного конвейера вам нужно заключить их в узел, иначе вы получите ошибку/сбой сборки

node {
    def BUILD_FULL = sh (
        script: 'curl --silent '+buildURL+' | tr "{}" "\\n" | grep -Po \'"shortDescription":.*?[^\\\\]"\' | cut -d ":" -f2',
        returnStdout: true
        )

    slackSend channel: '#ci-cd',
          color: '#000000',
          message: "The pipeline was ${BUILD_FULL}  ${GIT_COMMIT_MSG} "

}

Результатом будет слабое уведомление, отправленное на ваш свободный канал с кратким описанием git