web-dev-qa-db-ja.com

指定されたレポのGitブランチでJenkins Choiceパラメーターを動的に埋める

特定のGitリポジトリに特定のGitブランチの入力を必要とするパラメーター化されたJenkinsジョブがあります。現在、このパラメーターは文字列パラメーターです。

このパラメーターを選択パラメーターにし、ドロップダウンリストにGitブランチを動的に入力する方法はありますか?新しいブランチが作成されるたびにドロップダウンを手動で構成することにより、この選択パラメーターを維持することを誰かに要求したくありません。

57
mkez00

拡張選択パラメータープラグイン を使用すると、ファイルから選択を読み取ることができます。

もちろん、今、別の問題があります:ファイルが最新であることを確認する方法(ポストコミットフックで実行可能)とすべてのユーザーに伝播する方法(共有に配置することで実行可能)ファイルサーバー)。しかし、より良い解決策があるかもしれません。

20
malenkiy_scot

このリンクで言及されているいくつかの回答を試しましたが、ユーザーが選択したブランチについてジェンキンスに伝える方法がわかりませんでした。上記のスレッドの前回のコメントで述べたように、ブランチセレクターフィールドは空のままにしておきました。

しかし、さらなる調査中に、同じことを行う別の方法を見つけました- https://wiki.jenkins-ci.org/display/JENKINS/Git+Parameter+Plugin この方法ははるかにシンプルで、設定するものが少なくなりました!

これが私が設定したものです-

  1. Gitパラメータープラグインをインストールしました
  2. 「このビルドはパラメーター化されている」をチェックし、「Gitパラメーター」を追加しました
  3. 次の値を追加しました。 Git Parameter plugin config in the job

  4. 次に、ジョブのgit SCMセクションに、 'Name'セクションに記載されているのと同じ値を、あたかも環境変数であるかのように追加しました。 (このgitパラメータープラグインのヘルプを注意深く読むと、これに気付くでしょう) Branch Selector

この後、ビルドを実行し、ブランチを選択し(Jenkinsはビルド前にこのブランチをチェックアウトします)、ビルドを正常に完了し、指定したブランチを選択しました。

78
Ravindra Mijar

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()
14
veritius

"Git Parameter Plug-in" を使用すると非常に簡単です。

「SELECT_BRANCH」のような名前を追加します##この変数は後で使用するため、必ず確認してください。次に、パラメータタイプ:ブランチ

次に、SCMにアクセスします。選択:Gitおよびブランチ指定子:$ {SELECT_BRANCH}

確認するには、jenkinsのシェルで以下を実行します。

エコー$ {SELECT_BRANCH}

env.enter image description here

enter image description here

10
Smit Jain

ここで同様の問題に直面しています。ユーザーは、仕事をフリースタイルからパイプラインに移行しています。彼らはJenkinsfileをリポジトリ(歴史的理由)に保存したくないし、それでも「Git Parameter」プラグインを使用したい

したがって、「パイプラインスクリプト」を使用して、「Gitパラメーター」のように機能する別のプラグインを開発する必要があります。

この新しいプラグインは、プロジェクトのSCM設定と統合されません。プラグインは https://plugins.jenkins.io/list-git-branches-parameter にあります

それがあなたにも役立つことを願っています

4
黄索远

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を入力するだけです。

2
Ulises

はい、私はあなたの仕事に「動的選択パラメータ」を追加し、あなたのニーズに合わせて次のグルーヴィーなスクリプトをカスタマイズする必要がありますトリックを行う少しグルーヴィーなスクリプトを書きました:

#!/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などの形式でユーザーブランチを持つことができます。したがって、独自のソート関数を作成する必要がありました。これは私の最初のグルーヴィーなスクリプトだったので、もっと良い方法があれば知りたいです。

2
sagi

私にとっては、入力ステージパラメーターを使用します。

  1. Gitプロジェクトをチェックアウトしてパイプラインを開始します。
  2. Awkコンマデを使用して、すべてのブランチのリストを含むbarnch.txtファイルを生成します
  3. ステージ設定では、ファイルを読み取り、それを使用して入力選択パラメーターを生成します

ユーザーがパイプラインを起動すると、これはユーザーがリストの選択肢を選択するのを待っています。

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()
        }
    }
}

}

そして、ユーザーはビルドと対話します:

ここに画像の説明を入力

ここに画像の説明を入力

2
idriss Eliguene

@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として使用します。魅力のように機能します。

2
Ben

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();
1
janoskk

この場合、私は新しい回答を持っています。これを解決する簡単な方法は、ソースコードからjenkinsFileを取得することです。

次に選択しました:このジョブにはgitパラメーターがあります

enter image description here

また、パイプラインのセットアップでは、[ライトウェイトチェックアウト]チェックボックスをオフにしました。これにより、ジョブワークスペースで本当にgitチェックアウトが実行されます。

enter image description here

その後、パラメーターはgitブランチによって自動入力されます

0
idriss Eliguene

次の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

0
Noam Manos