Динамически заполняйте параметр выбора Дженкинса ветвями Git в указанном РЕПО

У меня есть параметризованное задание Дженкинса, которое требует ввода определенной ветви Git в определенном репозитории Git. В настоящее время этот параметр является строковым.

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

10 ответов


плагин параметров расширенного выбора позволит вам прочитать варианты из файла.

конечно, теперь у вас есть другая проблема: как убедиться, что файл обновлен (это можно сделать с помощью крючка post-commit) и распространяется на всех пользователей (это можно сделать, разместив его на общем файловом сервере). Но могут быть и лучшие решения.


Я попробовал пару ответов, упомянутых в этой ссылке, но не мог понять, как рассказать Дженкинсу о выбранной пользователем ветке. Как упоминалось в моем предыдущем комментарии в приведенном выше потоке, я оставил поле селектора ветвей пустым.

но во время дальнейших исследований я нашел другой способ сделать то же самое -https://wiki.jenkins-ci.org/display/JENKINS/Git + параметр + плагин Я нашел этот метод был много проще, и меньше настроить!

вот что я настроил -

  1. установлен плагин параметров git
  2. проверил "эта сборка параметризована" и добавил "параметр Git"
  3. добавлены следующие значения: Git Parameter plugin config in the job

  4. затем в разделе git SCM задания я добавил то же значение, упомянутое в разделе "Имя", как если бы это была переменная среды. (Если вы внимательно прочитали справку для этого плагина параметров git, вы поймете это) Branch Selector

после этого я просто запустил сборку, выбрал свою ветку (Дженкинс проверяет эту ветку перед построением), и она успешно завершила сборку, и выбрав ветку, которую я указал.


я смог достичь этого результата, используя 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.Введите описание изображения здесь

enter image description here


расширение ответа @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:

  1. Я начинаю свой конвейер, проверяя проект git.
  2. Я использую awk commade для создания barnch.txt файл со списком всех ветвей
  3. в 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 сборки :

Введите описание изображения здесь

Введите описание изображения здесь