特定の Git リポジトリで特定の Git ブランチの入力を必要とするパラメータ化された Jenkins ジョブがあります。現在、このパラメーターは文字列パラメーターです。
このパラメーターを選択パラメーターにして、ドロップダウン リストに Git ブランチを動的に入力する方法はありますか? 新しいブランチが作成されるたびにドロップダウンを手動で構成して、この選択パラメーターを維持することを誰かに要求したくありません。
特定の Git リポジトリで特定の Git ブランチの入力を必要とするパラメータ化された Jenkins ジョブがあります。現在、このパラメーターは文字列パラメーターです。
このパラメーターを選択パラメーターにして、ドロップダウン リストに Git ブランチを動的に入力する方法はありますか? 新しいブランチが作成されるたびにドロップダウンを手動で構成して、この選択パラメーターを維持することを誰かに要求したくありません。
Extended Choice Parameter プラグインを使用すると、ファイルから選択肢を読み取ることができます。
もちろん、ここで別の問題があります: ファイルが最新であることを確認する方法 (これは post-commit フックで実行できます) およびすべてのユーザーに伝達されます (これは共有ファイルに配置することで実行できます)。ファイルサーバー)。しかし、より良い解決策があるかもしれません。
Jenkins Dynamic Parameter Plug-inを使用して、この結果を得ることができました。私は Dynamic Choice Parameter オプションを使用し、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 Parameter Plug-in」を使用すると非常に簡単です。
「SELECT_BRANCH」のような名前を追加します ## この変数は後で使用するので確認してください。次に、パラメータ タイプ: ブランチ
次に、SCM に連絡します: 選択: Git および分岐指定子: ${SELECT_BRANCH}
確認するには、ジェンキンスのシェルで以下を実行します。
${SELECT_BRANCH} をエコー
env.ここに画像の説明を入力
私はここで同様の問題に直面しています。ユーザーは仕事をフリースタイルからパイプラインに移行しています。彼らはJenkinsfileをリポジトリに保存したくない(歴史的な理由)、それでも「Git Parameter」プラグインを使用したい
そのため、「パイプライン スクリプト」を使用し、「Git パラメータ」のように機能する別のプラグインを開発する必要があります。
この新しいプラグインは、プロジェクトの SCM 設定と統合されません。プラグインはhttps://plugins.jenkins.io/list-git-branches-parameterにあります
それがあなたにも役立つことを願っています
はい、トリックを実行する小さなグルーヴィーなスクリプトを書きました。「動的選択パラメーター」をジョブに追加し、次のグルーヴィーなスクリプトをニーズに合わせてカスタマイズする必要があります。
#!/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()
私の場合、バージョン文字列は次の形式 XXXX であり、形式 XXX-username などのユーザーブランチを持つことができました...そのため、独自のソート関数を作成する必要がありました。これは私の最初のグルーヴィーなスクリプトだったので、もっと良い方法があれば知りたいです。
@malenkiy_scotの回答を拡張します。Extended Choice Plugin で使用されるファイルを構築するために、新しい 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
次に Artifact deployer プラグインを使用して、そのファイルを Web URL にある共有の場所にプッシュし、Extended Choice プラグインで URL として「http://localhost/branches.txt」を使用します。魅力のように機能します。
malenkiy_scot で言及される前に拡張選択パラメータ プラグインを使用して同じことを達成できます。
<?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)));
?>
最初のオプションでは、レポを複製する必要があります。2 番目のものでは必要ありませんが、どちらの場合も、php スクリプトをホストするサーバーに git をインストールする必要があります。このオプションのいずれかが完全に動的になると、リスト ファイルを作成する必要がなくなります。スクリプトへの URL を拡張選択パラメータの「プロパティ ファイル」フィールドに入力するだけです。