Подтвердить что ты не робот

Параметры динамического заполнения Jenkins с помощью Git Ветви в заданном репо

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Здесь я сконфигурировал -

  • Установлен плагин параметров git
  • Проверено значение "Эта сборка параметризована" и добавлен параметр "Git"
  • Добавлены следующие значения: Git Parameter plugin config in the job

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

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

Ответ 3

Мне удалось достичь этого результата с помощью Jenkins Dynamic Parameter Plug-in. Я использовал параметр Dynamic Choice Parameter, и для выбора script я использовал следующее:

proc1 = ['/bin/bash', '-c', "/usr/bin/git ls-remote -h ssh://[email protected]/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()

Ответ 4

Это довольно просто, используя "Git Parameter Plug-in".

Добавьте имя, например "SELECT_BRANCH" ## Убедитесь, что эта переменная будет использована позже. Тогда Тип параметра: Ветвь

Затем обратитесь к SCM: выберите: Git и спецификатор ветки: $ {SELECT_BRANCH}

Для проверки выполните ниже в shell в jenkins:

echo $ {SELECT_BRANCH}

env.enter описание изображения здесь

enter image description here

Ответ 5

расширяется на ответ @malenkiy_scot. Я создал новое задание jenkins для создания файла, который используется расширенным плагином выбора.

вы можете сделать следующее (я сделал это как выполнение шагов оболочки в jenkins, но вы могли бы сделать это в script):

git ls-remote [email protected]: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

Затем я использую плагин для развертывания Artifact, чтобы вывести этот файл в общую папку, которая находится в веб-URL, а затем просто используйте http://localhost/branches.txt в плагине расширенного выбора в качестве URL-адреса. работает как шарм.

Ответ 6

Вы можете сделать то же самое с помощью расширенного плагина параметров выбора, упомянутого выше malenkiy_scot и простым php script следующим образом (при условии, что у вас есть где-то сервер для развертывания сценариев php, которые можно ударить с машины Jenkins)

<?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:[email protected]', $output);
print('branches='.preg_replace('/[a-z0-9]*\trefs\/heads\//','',implode(',', $output)));
?>

С первым вариантом вам нужно будет клонировать репо. Со вторым вы этого не сделаете, но в обоих случаях вам понадобится git, установленный на сервере, на котором размещен ваш PHP скрипт. Если любой из этих параметров становится полностью динамичным, вам не нужно создавать файл списка. Просто разместите URL-адрес вашего script в поле расширенного выбора параметра "файл свойства".

Ответ 7

Да, Я написал немного groovy script, что делает трюк Вы должны добавить "Dynamic Choice Parameter" к своему заданию и настроить следующие groovy script в соответствии с вашими потребностями:

#!/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 script, поэтому, если есть лучшие способы делать то, что я хотел бы знать.

Ответ 8

Я сталкиваюсь с подобной проблемой здесь. Наши пользователи переносят свою работу с фристайла на конвейер. Они не хотят, чтобы Jenkinsfile хранился в их репозиториях (историческая причина), и все еще хотят использовать плагин "Git Parameter"

Поэтому мы должны использовать "Pipeline script" и разработать другой плагин, который работает как "Git Parameter".

Этот новый плагин не интегрируется с настройкой SCM в проекте. Плагин находится по адресу https://plugins.jenkins.io/list-git-branches-parameter

Надеюсь, это поможет вам

Ответ 9

Для меня я использую входной каскадный параметр:

  1. Я начинаю свой конвейер с проверки проекта git.
  2. Я использую awk commade для генерации файла barnch.txt со списком всех веток
  3. На этапе setps я читаю файл и использую его для генерации входных параметров

Когда пользователь запускает конвейер, он будет ждать его выбора в списке.

pipeline{
agent any

stages{

    stage('checkout scm') {
        steps {
            script{
                git credentialsId: '8bd8-419d-8af0-30960441fcd7', url: 'ssh://[email protected]:/usr/company/repositories/repo.git'
                sh 'git branch -r | awk \'{print $1}\' 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://[email protected]/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()
        }
    }
}

}

И тогда пользователь будет взаимодействовать с ним при сборке:

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

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

Ответ 10

Пригодится groovy script, , если ваша работа не использует "Управление исходным кодом" напрямую (аналогично "Git плагин параметров" ), но все же имеет доступ к локальный (клонированный) репозиторий 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()

См. полное объяснение здесь: fooobar.com/questions/70691/...

Ответ 11

Мы можем устранить ненужное чтение/запись файла с помощью 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();

Ответ 12

У меня есть новый ответ для этого случая: простой способ решить эту проблему - это получить jenkinsFile из исходного кода.

Затем вы выбрали: эта работа имеет параметр git

Кроме того, при установке конвейера, когда флажок "Облегченная проверка" снят, эта операция будет действительно проверена в рабочей области. После этого параметр будет автоматически заполнен вашей веткой git