Динамически заполняйте параметр выбора Дженкинса ветвями Git в указанном РЕПО
У меня есть параметризованное задание Дженкинса, которое требует ввода определенной ветви Git в определенном репозитории Git. В настоящее время этот параметр является строковым.
есть ли способ сделать этот параметр параметром выбора и динамически заполнить выпадающий список ветвями Git? Я не хочу требовать, чтобы кто-то поддерживал этот параметр выбора, вручную настраивая раскрывающийся список каждый раз при создании новой ветви.
10 ответов
плагин параметров расширенного выбора позволит вам прочитать варианты из файла.
конечно, теперь у вас есть другая проблема: как убедиться, что файл обновлен (это можно сделать с помощью крючка post-commit) и распространяется на всех пользователей (это можно сделать, разместив его на общем файловом сервере). Но могут быть и лучшие решения.
Я попробовал пару ответов, упомянутых в этой ссылке, но не мог понять, как рассказать Дженкинсу о выбранной пользователем ветке. Как упоминалось в моем предыдущем комментарии в приведенном выше потоке, я оставил поле селектора ветвей пустым.
но во время дальнейших исследований я нашел другой способ сделать то же самое -https://wiki.jenkins-ci.org/display/JENKINS/Git + параметр + плагин Я нашел этот метод был много проще, и меньше настроить!
вот что я настроил -
- установлен плагин параметров git
- проверил "эта сборка параметризована" и добавил "параметр Git"
добавлены следующие значения:
затем в разделе git SCM задания я добавил то же значение, упомянутое в разделе "Имя", как если бы это была переменная среды. (Если вы внимательно прочитали справку для этого плагина параметров git, вы поймете это)
после этого я просто запустил сборку, выбрал свою ветку (Дженкинс проверяет эту ветку перед построением), и она успешно завершила сборку, и выбрав ветку, которую я указал.
я смог достичь этого результата, используя Jenkins динамический параметр плагин. Я использовал параметр параметра Dynamic Choice и для сценария choices использовал следующее:
proc1 = ['/bin/bash', '-c', "/usr/bin/git ls-remote -h ssh://user@server.com/path/to/repo.git"].execute()
proc2 = ['/bin/bash', '-c', "awk '{print $2}'"].execute()
proc3 = ['/bin/bash', '-c', "sed s%^refs/heads%origin%"].execute()
all = proc1 | proc2 | proc3
String result = all.text
String filename = "/tmp/branches.txt"
boolean success = new File(filename).write(result)
def multiline = "cat /tmp/branches.txt".execute().text
def list = multiline.readLines()
его довольно просто с помощью "Git параметр плагин".
добавить имя как "SELECT_BRANCH" # # убедитесь, что для этой переменной, как это будет использоваться позже. Затем Тип Параметра: Branch
затем обратиться к SCM : Выберите Команду и спецификатор ветви: ${SELECT_BRANCH}
чтобы проверить, выполните ниже в shell в jenkins:
echo ${SELECT_BRANCH}
env.Введите описание изображения здесь
расширение ответа @malenkiy_scot. Я создал новое задание Дженкинса для создания файла, который используется плагином Extended Choice.
вы можете сделать следующее (Я сделал это как выполнить шаги оболочки в jenkins, но вы можете сделать это в скрипте):
git ls-remote git@github.com:my/repo.git |grep refs/heads/* >tmp.txt
sed -e 's/.*refs\/heads\///' tmp.txt > tmp2.txt
tr '\n' ',' < tmp2.txt > tmp3.txt
sed '1i\branches=' tmp3.txt > tmp4.txt
tr -d '\n' < tmp4.txt > branches.txt
затем я использую плагин развертывания артефактов, чтобы переместить этот файл в общее место, которое находится в веб-url, а затем просто использовать 'http://localhost/branches - ... txt ' в плагине расширенного выбора в качестве url. работает как обаяние.
вы можете выполнить то же самое, используя плагин расширенного выбора параметров, упомянутый malenkiy_scot и простой PHP-скрипт следующим образом(предполагая, что у вас есть где-то сервер для развертывания php-скриптов, которые вы можете поразить с машины Дженкинса)
<?php
chdir('/path/to/repo');
exec('git branch -r', $output);
print('branches='.str_replace(' origin/','',implode(',', $output)));
?>
или
<?php
exec('git ls-remote -h http://user:pass@repo.git', $output);
print('branches='.preg_replace('/[a-z0-9]*\trefs\/heads\//','',implode(',', $output)));
?>
С первым вариантом вам нужно будет клонировать РЕПО. Со вторым вы этого не делаете, но в обоих случаях вам нужен git, установленный на сервере, на котором размещен ваш PHP-скрипт. Ничуть все это параметры он становится полностью динамическим, вам не нужно создавать файл списка. Просто поместите URL-адрес своего скрипта в поле расширенный параметр выбора "файл свойств".
да, Я написал немного Классный сценарий, который делает трюк Вы должны добавить "параметр динамического выбора" в свою работу и настроить следующий скрипт groovy для ваших нужд:
#!/usr/bin/groovy
def gitURL = "git repo url"
def command = "git ls-remote --heads --tags ${gitURL}"
def proc = command.execute()
proc.waitFor()
if ( proc.exitValue() != 0 ) {
println "Error, ${proc.err.text}"
System.exit(-1)
}
def text = proc.in.text
# put your version string match
def match = /<REGEX>/
def tags = []
text.eachMatch(match) { tags.push(it[1]) }
tags.unique()
tags.sort( { a, b ->
def a1 = a.tokenize('._-')
def b1 = b.tokenize('._-')
try {
for (i in 1..<[a1.size(), b1.size()].min()) {
if (a1[i].toInteger() != b1[i].toInteger()) return a1[i].toInteger() <=> b1[i].toInteger()
}
return 1
} catch (e) {
return -1;
}
} )
tags.reverse()
в моем случае строка версии была в следующем формате X. X. X. X и могла иметь пользовательские ветви в формате X. X. X-username и т. д... Поэтому мне пришлось написать собственную функцию сортировки. Это был мой первый сценарий groovy, поэтому, если есть лучшие способы сделать что-то, я хотел бы знать.
следующий скрипт groovy будет полезен,Если ваша работа не использует "управление исходным кодом" напрямую (аналогично "Git Parameter Plugin"), но все же имеют доступ к локальному (клонированному) репозиторию git:
import jenkins.model.Jenkins
def envVars = Jenkins.instance.getNodeProperties()[0].getEnvVars()
def GIT_PROJECT_PATH = envVars.get('GIT_PROJECT_PATH')
def gettags = "git ls-remote -t --heads origin".execute(null, new File(GIT_PROJECT_PATH))
return gettags.text.readLines()
.collect { it.split()[1].replaceAll('\^\{\}', '').replaceAll('refs/\w+/', '') }
.unique()
см. полное объяснение здесь: https://stackoverflow.com/a/37810768/658497
мы можем исключить ненужное чтение/запись файла с помощью text
. Мое решение заключается в следующем:
proc1 = ['/bin/bash', '-c',
"/usr/bin/git ls-remote --heads ssh://repo_url.git"].execute()
proc2 = ['/bin/bash', '-c',
"/usr/bin/awk ' { gsub(/refs\/heads\//, \"\"); print $2 }' "].execute()
all = proc1 | proc2
choices = all.text
return choices.split().toList();
для меня я использую входной этап param:
- Я начинаю свой конвейер, проверяя проект git.
- Я использую awk commade для создания barnch.txt файл со списком всех ветвей
- в stage setps я читаю файл и использую его для генерации параметров выбора ввода
когда пользователь запускает конвейер, этот будет ждать его выбора в списке.
pipeline{
agent any
stages{
stage('checkout scm') {
steps {
script{
git credentialsId: '8bd8-419d-8af0-30960441fcd7', url: 'ssh://jenkins@git.company.com:/usr/company/repositories/repo.git'
sh 'git branch -r | awk \'{print }\' ORS=\'\n\' >>branch.txt'
}
}
}
stage('get build Params User Input') {
steps{
script{
liste = readFile 'branch.txt'
echo "please click on the link here to chose the branch to build"
env.BRANCH_SCOPE = input message: 'Please choose the branch to build ', ok: 'Validate!',
parameters: [choice(name: 'BRANCH_NAME', choices: "${liste}", description: 'Branch to build?')]
}
}
}
stage("checkout the branch"){
steps{
echo "${env.BRANCH_SCOPE}"
git credentialsId: 'ea346a50-8bd8-419d-8af0-30960441fcd7', url: 'ssh://jenkins@git.company.com/usr/company/repositories/repo.git'
sh "git checkout -b build ${env.BRANCH_NAME}"
}
}
stage(" exec maven build"){
steps{
withMaven(maven: 'M3', mavenSettingsConfig: 'mvn-setting-xml') {
sh "mvn clean install "
}
}
}
stage("clean workwpace"){
steps{
cleanWs()
}
}
}
}
и тогда пользователь будет взаимодействие withim сборки :