2017-01-10 3 views
5

私は、Jenkinsのマルチブランチパイプラインジョブで「分岐インデックス作成」を自動的に開始しようとしています。マルチブランチパイプラインで分岐インデックスをトリガーする(Jenkins/Git)

現時点では、実際にはポーリングの1つの方法しか動作していないようですが、これを行うことはできません。とにかくポーリングは悪い解決策です。

サポートしていないプラグイン「トリガーがリモートのビルド(例えば、スクリプトから)」(オプションは保存されない)ので、私は

私が作成しようとしたなどのプッシュにウェブフックを経由して、それをトリガすることはできませんポストビルドアクション - 他のプロジェクトのビルドを主張するマルチブランチパイプラインプロジェクトはビルド可能なプロジェクトではありません。

もし私がこれを行うことができる唯一の方法であれば、ブランチプロジェクトでWebフックトリガを有効にする必要があるので自動SCMトリガを無効にする必要があります。

しかし、私はブランチプロジェクトのパイプラインスクリプトを使ってWebフックを設定しており、そのプロパティを登録するには少なくとも1回ビルドする必要があるので、これはうまくいきません。

私はしばらくの間周りを回っていましたので、うまくいけば何かを見逃してしまいましたが、どんな助けもありがたいです。

私はどういうわけか、下流プロジェクトとして

  • 投票マルチブランチプロジェクトをマルチブランチプロジェクトをトリガし、そして唯一のいない分岐プロジェクトをビルドする以下の

    • のいずれかを実行することができることを想像

    乾杯の前に構築されて

  • 答えて

    4

    方法ComputedFolder.scheduleBuild()はgroovyスクリプトから呼び出すことができます。

    異なるマルチブランチパイプラインプロジェクトのGroovyコードから1つのマルチブランチパイプラインプロジェクトで分岐索引付けを開始しました。その結果、そのプロジェクトのダウンストリームビルドがトリガーされます。

    @NonCPS 
    void scanRepo(String downStreamProjectName) { 
        Jenkins.instance.getItemByFullName(downStreamProjectName).scheduleBuild() 
    } 
    ... 
    String downStreamProject = 'my-folder/my-multibranch-project' 
    String downStreamJob = "${downStreamProject}/${env.BRANCH_NAME}" 
    if (Jenkins.instance.getItemByFullName(downStreamJob) == null) { 
        scanRepo(downStreamProject) 
        while (Jenkins.instance.getItemByFullName(downStreamJob) == null) { 
         sleep(1) 
        } 
    } 
    build([job: downStreamJob, wait: false, quietPeriod: 0]) 
    

    Jenkins.instance.getItemByFullName(downStreamProjectName)Serializableないので、いくつかの注意が必要があるWorkflowMultiBranchProjectであることに注意してください:

    コードのようなものです。

    +0

    おかげだろう、その場合にはルートコンテキスト(/)の下で展開されていないことかもしれません! 'Jenkins.instance.getItemByFullName(downStreamProjectName).scheduleBuild()'は、マルチブランチパイプラインの再スキャンをトリガーするために探していたものです。 –

    +0

    「スリープ(1)」ではなく、このジョブが終了するのを待つ方法はありますか? ? –

    +0

    このアプローチの唯一の欠点は、(スクリプトの承認によって)必要とするかなり悪いアクセス許可です。 'pipeline-build-step'プラグインの' build'ステップは残念ながらそれをまだサポートしていません([TODO in code](https://github.com/jenkinsci/pipeline-build-step-plugin/blob/3ff14391fe27c8ee9ccea9ba1977131fe3b26dbe/src/ main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStepExecution.java#L66))、おそらくもっと良いアプローチでしょう。 – StephenKing

    0

    @jjcの回答に基づいて、私はスキャンをトリガするためにもbuildステップを使用したバージョンを作成しました:

    String downStreamProject = 'my-folder/my-multibranch-project' 
    String downStreamJob = "${downStreamProject}/${env.BRANCH_NAME}" 
    if (Jenkins.instance.getItemByFullName(downStreamJob) == null) { 
        // we would need "wait: true", which is not possible as of now 
        // https://github.com/jenkinsci/pipeline-build-step-plugin/blob/3ff14391fe27c8ee9ccea9ba1977131fe3b26dbe/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStepExecution.java#L66 
        build job: downStreamProject, wait: false 
        // continue only once the expected job appears 
        while (Jenkins.instance.getItemByFullName(downStreamJob) == null) { 
         sleep(1) 
        } 
    } 
    build downStreamJob 
    

    これが承認されるために、次の署名が必要です。

    • method jenkins.model.Jenkins getItemByFullName java.lang.String
    • staticMethod jenkins.model.Jenkins getInstance
    0

    Jenkins Gitプラグインに定義されたリポジトリのための新しいコミットがあることを遠隔から伝えるのが最も簡単な方法です。しかし、これでジェンキンスはすぐに仕事を開始することはありません。何が起こるのは、Gitプラグインが特定のリポジトリのインデックスを作成(再)することです。変更が検出された場合、Jenkinsジョブが開始されます。

    リポジトリ(などGitHubの、GitLab、)から、次のURLトリガする必要があります。

    http://my-jenkins-host/git/[email protected]:group/repository.git&delay=0sec

    urlの値を使用すると、ジェンキンスジョブ(Gitのプラグイン)で構成されたSCMのURLと一致する必要があります!

    ガッチャ:それはあなたのジェンキンスがは、URLがhttp://my-jenkins-host/context-path/git/...