Dynamiczne wypełnianie parametru wyboru Jenkins gałęziami Git w określonym Repo
Mam sparametryzowane zadanie Jenkins, które wymaga wejścia określonej gałęzi Git w określonym repo Git. Obecnie parametr ten jest parametrem łańcuchowym.
Czy Jest jakiś sposób, aby uczynić ten parametr parametrem wyboru i dynamicznie wypełnić rozwijaną listę gałęziami Git? Nie chcę wymagać od kogoś utrzymania tego parametru wyboru poprzez ręczne konfigurowanie rozwijanej listy za każdym razem, gdy tworzona jest nowa gałąź.
10 answers
Rozszerzony parametr wyboru plugin pozwoli Ci odczytać wybory z pliku.
Oczywiście, teraz masz inny problem: jak upewnić się, że plik jest aktualny (można to zrobić za pomocą Hooka po zatwierdzeniu) i propagowany dla wszystkich użytkowników (można to zrobić, umieszczając go na udostępnionym serwerze plików). Ale mogą być lepsze rozwiązania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-03 15:44:29
Próbowałem kilku odpowiedzi wymienionych w tym linku, ale nie mogłem rozgryźć, jak powiedzieć Jenkinsowi o wybranej przez użytkownika gałęzi. Jak wspomniałem w poprzednim komentarzu w powyższym wątku, pozostawiłem pole wyboru gałęzi puste.
Ale podczas dalszych dochodzeń znalazłem inny sposób na zrobienie tego samego - https://wiki.jenkins-ci.org/display/JENKINS/Git + parametr + Wtyczka Okazało się, że ta metoda była o wiele prostsza i miała mniej rzeczy do skonfigurowania!
Oto co ja konfiguracja -
- zainstalowano wtyczkę parametru git
- sprawdzono 'parametryzacja tej kompilacji' i dodano parametr ' Git '
Dodano następujące wartości:
Następnie w sekcji GIT SCM zadania dodałem tę samą wartość, o której mowa w sekcji 'Name', tak jakby była to zmienna środowiskowa. (Jeśli uważnie przeczytasz help for this Git parameter plugin, zdasz sobie z tego sprawę)
Po tym właśnie uruchomiłem build, wybrał moją gałąź (Jenkins sprawdza tę gałąź przed zbudowaniem) i zakończył kompilację pomyślnie i wybierając gałąź, którą podałem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-23 16:16:25
Udało mi się osiągnąć ten wynik za pomocą wtyczki dynamicznego parametru Jenkins . Użyłem opcji Dynamic Choice Parameter i, dla skryptu choices, użyłem następującego:
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()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-02 16:53:38
To dość proste użycie "wtyczki parametru Git" .
Dodaj nazwę w stylu "SELECT_BRANCH" # # upewnij się, że ta zmienna zostanie użyta później. Następnie Typ Parametru: Branch
Następnie skontaktuj się z SCM : Wybierz: Git and branch specifier: ${SELECT_BRANCH}
Aby zweryfikować, wykonaj poniżej w powłoce w jenkins:
Echo ${SELECT_BRANCH}
Env.Tutaj wpisz opis obrazka
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-05 18:04:17
Rozszerzenie na odpowiedź @ malenkiy_scot. Stworzyłem nowe zadanie jenkins, aby zbudować plik, który jest używany przez wtyczkę Extended Choice.
Możesz wykonać następujące czynności (zrobiłem to jako wykonanie kroków powłoki w jenkins, ale można to zrobić w skrypcie):
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
Następnie używam wtyczki Artifact deployer, aby wypchnąć ten plik do współdzielonej lokalizacji, która znajduje się w adresie URL, a następnie po prostu użyj " http://localhost/branches.txt ' w rozszerzonej wtyczki wyboru jako url. działa jak urok.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-12 09:18:27
Możesz osiągnąć to samo za pomocą rozszerzonego parametru wyboru plugin wcześniej wspomniany przez malenkiy_scot i prostego skryptu php w następujący sposób (zakładając, że masz gdzieś serwer do wdrożenia skryptów php, które możesz uderzyć z maszyny Jenkins)
<?php
chdir('/path/to/repo');
exec('git branch -r', $output);
print('branches='.str_replace(' origin/','',implode(',', $output)));
?>
Lub
<?php
exec('git ls-remote -h http://user:[email protected]', $output);
print('branches='.preg_replace('/[a-z0-9]*\trefs\/heads\//','',implode(',', $output)));
?>
Przy pierwszej opcji trzeba by sklonować repo. Z drugim nie, ale w obu przypadkach musisz zainstalować git na serwerze hostującym Twój skrypt php. Odrobina każdej z tych opcji dostaje w pełni dynamiczny, nie trzeba budować pliku listy. Po prostu umieść adres URL skryptu w polu parametr rozszerzonego wyboru "Plik Właściwości".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-06 09:25:47
Tak, Napisałem świetny scenariusz, który załatwia sprawę. Należy dodać "Dynamic Choice Parameter" do swojej pracy i dostosować następujący skrypt groovy do swoich potrzeb:
#!/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()
W moim przypadku ciąg wersji był w następującym formacie X. X. X. X i mógł mieć gałęzie użytkownika w formacie X. X. X-username, itp... Więc musiałem napisać własną funkcję sortowania. To był mój pierwszy groovy scenariusz, więc jeśli są lepsze sposoby robienia rzeczy chciałbym wiedzieć.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-16 17:36:51
Poniższy skrypt groovy byłby przydatny, Jeśli Twoje zadanie nie używa bezpośrednio "zarządzania kodem źródłowym" (podobnie "Wtyczka parametru Git"), ale nadal ma dostęp do lokalnego (sklonowanego) repozytorium 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()
Zobacz pełne wyjaśnienie tutaj: https://stackoverflow.com/a/37810768/658497
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:17
Możemy wyeliminować niepotrzebne pliki do odczytu/zapisu za pomocą text
. Moje kompletne rozwiązanie jest następujące:
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();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 10:33:55
Dla mnie używam input stage param:
- uruchamiam swój pipeline od sprawdzenia projektu git.
- używam komendy awk do generowania barncha.plik txt z listą wszystkich gałęzi
- w stage setps, czytam plik i używam go do generowania input choice params
Gdy użytkownik uruchomi rurociąg, ten będzie czekał na wybór z listy.
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()
}
}
}
}
I wtedy użytkownik będzie współdziałał z kompilatorem:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-07 12:14:58