GitHub Orgプラグインを使用してjenkinsパイプライン(jenkinsfile)から別のジョブをトリガーするにはどうすればよいですか?


142

内部から別のジョブのビルドをトリガーするにはどうすればよいJenkinsfileですか?

このジョブは、同じgithub組織の下の別のリポジトリであり、すでに独自のJenkinsファイルを持っていると思います。

また、ローカルブランチのダウンストリームビルドをトリガーしても意味がないため、ブランチ名がマスターの場合にのみこれを実行します。

更新:

stage 'test-downstream'
node {
     def job = build job: 'some-downtream-job-name'
}

それでも、実行するとエラーが発生します

some-downtream-job-nameという名前のパラメーター化されたジョブが見つかりません

このジョブはジェンキンスに存在し、現在のものと同じ組織フォルダーの下にあると確信しています。独自の仕事もありますJenkinsfile

この質問は、GitHub組織から各リポジトリとブランチのジョブを自動作成および維持するGitHub組織プラグインに固有のものであることに注意してください。

回答:


131

まず第一に、buildステップをでラップすることはエグゼキュータスロットの無駄ですnode。上流のエグゼキューターは、理由もなくアイドル状態になります。

次に、マルチBRANCH_NAMEブランチプロジェクトから、環境変数を使用して、ロジックを現在のブランチで条件付きにすることができます。

3番目に、jobパラメーターは絶対または相対ジョブ名を取ります。パス修飾なしで名前を付けると、同じフォルダー内の別のジョブを参照します。これは、マルチブランチプロジェクトの場合、同じリポジトリーの別のブランチを意味します。

したがって、あなたが書くつもりだったのはおそらく

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}

2
ありがとう!何らかの変更によって、ビルドが完了するのを待たずにこのビルドをトリガーする方法についても知っている場合、それは2倍になるでしょう:)
sorin

48
スニペットジェネレーターをチェックする:build job: '../other-repo/master', wait: false
Jesse Glick

3
動的ブランチ名でビルドステップを呼び出す方法はありますか?ような何かbuild job: '../other-repo/$BRANCH_NAME'どこ$BRANCH_NAMEジェンキンス環境変数は、マルチブランチプロジェクトを実行しているブランチに関連するのですか?
msteppe91 2018年

2
${BRANCH_NAME}が環境変数として利用できる場合、単純な文字列置換で十分です。文字列を引用するに"'、必ずからに切り替えてください。例build job: "../other-repo/${BRANCH_NAME}"
シンダーヘイズ


123

上記の回答に加えて、2番目のパイプラインに単純なパラメーターを渡してジョブを開始したいと思い、https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflowで回答を見つけました。

だから私は使用しました:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}

11
ビルドジョブはステップに組み込む必要があります(バージョン0.5以降)
rhoerbe

5
buildコマンドによって呼び出されたJenkinsジョブのBUILD_NUMBERが返されますか?次のいずれかの段階でBUILD_NUMBERにアクセスする方法は?そのコマンドがどこに文書化されているか誰でも知っていますか?
user909481 2017

4
それbuild job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")]は今日、jenkins.io
doc /

しかし、2番目のジョブで渡されたこれらのパラメーターの使用方法
Gentle

2
興味深いことに build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] 、私のために動作しませんでしたが: build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] 働いていた
アルベルトC

24

buildパイプラインのコマンドは、ジェンキンスの他のジョブをトリガーするためのものです。

githubの例

仕事はジェンキンスに存在する必要があり、パラメーター化することができます。ブランチについては、gitから読むことができると思います


3
追加を試みましたbuild job: 'jobnameが、このエラーが発生しNo parameterized job named jobname found、この名前のジョブが組織フォルダーの同じレベルにあることを確認できます。
ソリン2016年

1
はい、ジョブはありますが、そのジョブはパラメーター化されていません。GitHub組織プラグインによって作成されたジョブをパラメーター化する方法を理解しようとしています
yiwen

6
ジョブ名の形式は次のとおりです。build job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
サヒールアフジャ

2
@SahilAhujaこれは完全に任意であり、Jenkinsレイアウトに基づいています。絶対パスを使用する場合は、で始める必要があります/。相対パスで問題ありません。ソリンの問題は、おそらく、ジョブの呼び出しbuildがマルチjobnameブランチjobnameジョブだったことです。つまり、同じジョブのブランチを構築しようとするようなパスを意味します。../jobname/branchname代わりにする必要があります
Michael Mrozek 2018年

これはうまくいきますが、指定されたブランチが存在しない場合はどうなりますか?
JaimeAlcántaraArnela

17

Jenkins Pipelinebuild jobステップを使用できます(Jenkinsの最小要件:2.130)。

buildステップの完全なAPIは次のとおりです。https//jenkins.io/doc/pipeline/steps/pipeline-build-step/

使い方build

  • job:ビルドするダウンストリームジョブの名前。別のパイプラインの仕事かもしれませんが、より一般的にはフリースタイルや他のプロジェクトです。
    • ジョブがこの上流のパイプラインジョブと同じフォルダーにある場合は、単純な名前を使用します
    • 代わりに次のような相対パスを使用できます../sister-folder/downstream
    • または、次のような絶対パスを使用できます/top-level-folder/nested-folder/downstream

ブランチをパラメーターとして使用して別のジョブをトリガーする

私の会社では、多くの支店に「/」が含まれています。「/」のインスタンスはすべて「%2F」に置き換える必要があります(ジョブのURLに表示されます)。

この例では、相対パスを使用しています

    stage('Trigger Branch Build') {
        steps {
            script {
                    echo "Triggering job for branch ${env.BRANCH_NAME}"
                    BRANCH_TO_TAG=env.BRANCH_NAME.replace("/","%2F")
                    build job: "../my-relative-job/${BRANCH_TO_TAG}", wait: false
            }
        }
    }

ビルド番号をパラメーターとして使用して別のジョブをトリガーする

build job: 'your-job-name', 
    parameters: [
        string(name: 'passed_build_number_param', value: String.valueOf(BUILD_NUMBER)),
        string(name: 'complex_param', value: 'prefix-' + String.valueOf(BUILD_NUMBER))
    ]

多くのジョブを並行してトリガーする

出典:https//jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/

Parallelの詳細はこちら:https : //jenkins.io/doc/book/pipeline/syntax/#parallel

    stage ('Trigger Builds In Parallel') {
        steps {
            // Freestyle build trigger calls a list of jobs
            // Pipeline build() step only calls one job
            // To run all three jobs in parallel, we use "parallel" step
            // https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel
            parallel (
                linux: {
                    build job: 'full-build-linux', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                mac: {
                    build job: 'full-build-mac', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                windows: {
                    build job: 'full-build-windows', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                failFast: false)
        }
    }

または代わりに:

    stage('Build A and B') {
            failFast true
            parallel {
                stage('Build A') {
                    steps {
                            build job: "/project/A/${env.BRANCH}", wait: true
                    }
                }
                stage('Build B') {
                    steps {
                            build job: "/project/B/${env.BRANCH}", wait: true
                    }
                }
            }
    }

3

jenkinsファイルから他のジョブをトリガーするには、そのタスクのビルドジョブプラグインを使用ます。並列、ノード、エージェントのオプションや外部ジョブをトリガーするためのステップなど、さまざまなロジックを実行に追加できます。そのための読みやすいクックブックの例をいくつか示しました。

1.条件付きの例でjenkinsファイルから外部ジョブをトリガーする例:

if (env.BRANCH_NAME == 'master') {
  build job:'exactJobName' , parameters:[
    string(name: 'keyNameOfParam1',value: 'valueOfParam1')
    booleanParam(name: 'keyNameOfParam2',value:'valueOfParam2')
 ]
}

2.条件付きの例でjenkinsファイルから複数のジョブをトリガーする例:

 def jobs =[
    'job1Title'{
    if (env.BRANCH_NAME == 'master') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam1',value: 'valueNameOfParam1')
        booleanParam(name: 'keyNameOfParam2',value:'valueNameOfParam2')
     ]
    }
},
    'job2Title'{
    if (env.GIT_COMMIT == 'someCommitHashToPerformAdditionalTest') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam3',value: 'valueOfParam3')
        booleanParam(name: 'keyNameOfParam4',value:'valueNameOfParam4')
        booleanParam(name: 'keyNameOfParam5',value:'valueNameOfParam5')
     ]
    }
}

しかし、2番目のジョブでパラメータを受け取って使用する方法
Gentle

2
@ジェントル。渡されたパラメータにはparams.systemnameとしてアクセスできます
Pankaj Shinde
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.