特定のGitリポジトリに特定のGitブランチの入力を必要とするパラメーター化されたJenkinsジョブがあります。現在、このパラメーターは文字列パラメーターです。
このパラメーターを選択パラメーターにし、ドロップダウンリストにGitブランチを動的に入力する方法はありますか?新しいブランチが作成されるたびにドロップダウンを手動で構成することにより、この選択パラメーターを維持することを誰かに要求したくありません。
拡張選択パラメータープラグイン を使用すると、ファイルから選択を読み取ることができます。
もちろん、今、別の問題があります:ファイルが最新であることを確認する方法(ポストコミットフックで実行可能)とすべてのユーザーに伝播する方法(共有に配置することで実行可能)ファイルサーバー)。しかし、より良い解決策があるかもしれません。
このリンクで言及されているいくつかの回答を試しましたが、ユーザーが選択したブランチについてジェンキンスに伝える方法がわかりませんでした。上記のスレッドの前回のコメントで述べたように、ブランチセレクターフィールドは空のままにしておきました。
しかし、さらなる調査中に、同じことを行う別の方法を見つけました- https://wiki.jenkins-ci.org/display/JENKINS/Git+Parameter+Plugin この方法ははるかにシンプルで、設定するものが少なくなりました!
これが私が設定したものです-
次の値を追加しました。
次に、ジョブのgit SCMセクションに、 'Name'セクションに記載されているのと同じ値を、あたかも環境変数であるかのように追加しました。 (このgitパラメータープラグインのヘルプを注意深く読むと、これに気付くでしょう)
この後、ビルドを実行し、ブランチを選択し(Jenkinsはビルド前にこのブランチをチェックアウトします)、ビルドを正常に完了し、指定したブランチを選択しました。
Jenkins Dynamic Parameter Plug-in を使用してこの結果を達成できました。 Dynamic Choice Parameterオプションを使用し、choicesスクリプトには次を使用しました。
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()
"Git Parameter Plug-in" を使用すると非常に簡単です。
「SELECT_BRANCH」のような名前を追加します##この変数は後で使用するため、必ず確認してください。次に、パラメータタイプ:ブランチ
次に、SCMにアクセスします。選択:Gitおよびブランチ指定子:$ {SELECT_BRANCH}
確認するには、jenkinsのシェルで以下を実行します。
エコー$ {SELECT_BRANCH}
env.enter image description here
ここで同様の問題に直面しています。ユーザーは、仕事をフリースタイルからパイプラインに移行しています。彼らはJenkinsfileをリポジトリ(歴史的理由)に保存したくないし、それでも「Git Parameter」プラグインを使用したい
したがって、「パイプラインスクリプト」を使用して、「Gitパラメーター」のように機能する別のプラグインを開発する必要があります。
この新しいプラグインは、プロジェクトのSCM設定と統合されません。プラグインは https://plugins.jenkins.io/list-git-branches-parameter にあります
それがあなたにも役立つことを願っています
Malenkiy_scotで言及される前に拡張選択パラメータープラグインと次のような簡単なphpスクリプトを使用して同じことを達成できます(Jenkinsマシンからヒットできる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:[email protected]', $output);
print('branches='.preg_replace('/[a-z0-9]*\trefs\/heads\//','',implode(',', $output)));
?>
最初のオプションでは、レポのクローンを作成する必要があります。 2番目の方法では必要ありませんが、どちらの場合でも、phpスクリプトをホストするサーバーにgitをインストールする必要があります。このオプションを使用すると、完全に動的になり、リストファイルを作成する必要がありません。拡張選択パラメータの「プロパティファイル」フィールドにスクリプトのURLを入力するだけです。
はい、私はあなたの仕事に「動的選択パラメータ」を追加し、あなたのニーズに合わせて次のグルーヴィーなスクリプトをカスタマイズする必要がありますトリックを行う少しグルーヴィーなスクリプトを書きました:
#!/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などの形式でユーザーブランチを持つことができます。したがって、独自のソート関数を作成する必要がありました。これは私の最初のグルーヴィーなスクリプトだったので、もっと良い方法があれば知りたいです。
私にとっては、入力ステージパラメーターを使用します。
ユーザーがパイプラインを起動すると、これはユーザーがリストの選択肢を選択するのを待っています。
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()
}
}
}
}
そして、ユーザーはビルドと対話します:
@malenkiy_scotの答えを展開します。拡張選択プラグインで使用されるファイルを作成するために、新しいjenkinsジョブを作成しました。
以下を実行できます(jenkinsでシェルステップを実行することで実行しましたが、スクリプトで実行することもできます)。
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デプロイヤプラグインを使用してそのファイルをWeb URL内の共有場所にプッシュし、Extended Choiceプラグインで「http://localhost/branches.txt」をURLとして使用します。魅力のように機能します。
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();
次の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