Я изо всех сил пытаюсь получить доступ к переменным GIT в моем конвейере Jenkins
Мне нужно знать, какая ветвь GIT была проверена внутри некоторого кода bash на этапе конвейера. Я буду использовать это для создания разных имен выходных файлов. Мой конвейер декларативен, а не написан по сценарию, и я использую Jenkins 2.150.1.
Я перепробовал все, что мог найти в Интернете, но в основном это был неполный код или для конвейеров со сценариями. Или просто не могу собрать информацию.
Скажите, сколько времени я потратил на это, было бы неплохо иметь полноценный рабочий пример, использующий декларативный конвейер.
Вот что я пробовал до сих пор:
# 1
Запустите git внутри sh
, но Дженкинс проверяет фиксацию, а не ветку, в результате чего отделенная голова
# 2
Ищет переменные среды из оболочки, но нет ни одного набора, связанного с GIT. Этот фрагмент
steps {
sh 'echo $GIT_BRANCH'
}
всегда возвращается пустым. Затем я попробовал Groovy:
steps {
echo "${env.GIT_BRANCH}"
}
печатает null
.
# 3
В «Справочнике по глобальной переменной» есть немного, что говорит:
SCM-specific variables such as GIT_COMMIT are not automatically defined as environment variables; rather you can use the return value of the checkout step.
Я поискал в Интернете, как это сделать, и собрал этот код:
pipeline {
stages {
stage('Build') {
steps {
def scmVars = checkout([...])
echo 'scm : the commit id is ' + scmVars.GIT_COMMIT
}
}
}
}
Но это не удается за исключением
# 4
использовать environment
команду и попытайтесь как-нибудь получить это значение
# 5
ищу переменные на других уровнях в Jenkinsfile, но, видимо, я могу сделать это только на скриптовых конвейерах
# 5
Пытался получить доступ к URL-адресу сборки и вызову API, но я использую прокси-сервер, и это усложняет работу с URL-адресом.
Мой Jenkinsfile
pipeline {
stages {
stage('Build') {
steps {
checkout([
$class: 'GitSCM',
doGenerateSubmoduleConfigurations: false,
userRemoteConfigs: [[
url: '...',
credentialsId: '...'
]],
branches: [ [name: '*/master'] ]
])
sh '''
#!/bin/bash -x
echo $MY_GIT_BRANCH_THAT_I_CANT_FIND
'''
}
}
}
}
Наконец я нашел пример и смог понять, как это сделать.
Мне нужно использовать команду сценария, получить Map
вернулся checkout
и сохраните Map
как переменная среды:
stage('Checkout code') {
steps {
script {
// Checkout the repository and save the resulting metadata
def scmVars = checkout([
$class: 'GitSCM',
...
])
// Display the variable using scmVars
echo "scmVars.GIT_COMMIT"
echo "${scmVars.GIT_COMMIT}"
// Displaying the variables saving it as environment variable
env.GIT_COMMIT = scmVars.GIT_COMMIT
echo "env.GIT_COMMIT"
echo "${env.GIT_COMMIT}"
}
// Here the metadata is available as environment variable
...
}
}
Цитируя документы:
GIT_BRANCH
Для проектов на основе Git эта переменная содержит ветку Git, которая была проверена для сборки (обычно origin / master)
Специально для плагина Pipeline ответ на эту проблему есть на Переполнение стека:
Переменная env.BRANCH_NAME содержит имя ветки.
Начиная с Pipeline Groovy Plugin 2.18, вы также можете просто использовать BRANCH_NAME (env не требуется, но все же принимается).
На некоторых условиях, эта переменная может быть пустой, следующее должно исправить это:
Добавьте [$ class: 'LocalBranch', localBranch: «**»] в «расширения» на этапе оформления заказа.
Задание декларативного конвейера Jenkins в многоотраслевом конвейере учитывает конфигурацию git многоотраслевого конвейера, который определил задание. Если вы предпочитаете, чтобы каждое задание проверяло локальную ветвь с именем, совпадающим с удаленной ветвью, добавьте черту «Извлечь в соответствующую локальную ветвь». Каждое задание, созданное в этом многоотраслевом конвейере, затем отправляется в именованную локальную ветвь.
Если вы используете декларативную конвейерную работу, не часть многоотраслевого конвейера, то вы можете использовать расширение локальной ветки плагина git, чтобы определить имя локальной ветки, которая должна быть создана.
Я обнаружил, что это хорошо работает. Определите переменную среды, которую можно использовать на последующих этапах.
environment {
GIT_COMMIT_REV=''
}
stages {
stage('Configure') {
steps {
script {
GIT_COMMIT_REV = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%h'").trim()
}
}
}
}
Взято из Примеры трубопроводов Jenkins