19

jenkins のさまざまなダウンストリーム ビルドで統合テストを動的にトリガーしたいと考えています。テスト名をパラメーターとして受け取る、パラメーター化された統合テスト プロジェクトがあります。テスト名は git リポジトリから動的に決定されます。

ソースコードで見つかった各テストの統合プロジェクトのビルドを開始するために jenkins-cli を使用する親プロジェクトがあります。親プロジェクトと統合プロジェクトは、一致するフィンガープリントを介して関連付けられます。

このアプローチの問題は、集計テスト結果が機能しないことです。問題は、「ダウンストリーム」の統合テストが jenkins-cli を介して開始されるため、ジェンキンスがダウンストリームであることを認識しないことだと思います。

これを機能させるために、多くのjenkinsプラグインを調べました。Join および Parameterized Trigger プラグインは、ビルドするプロジェクトの静的リストを想定しているため、役に立ちません。パラメータの任意のリストを作成するファクトリがないため、パラメータ化されたトリガーに使用できるパラメータ ファクトリも機能しません。ログ トリガー プラグインは機能しません。

Groovy Postbuild Plugin は動作するはずですが、そこからビルドをトリガーする方法がわかりませんでした。

4

6 に答える 6

16
def job = hudson.model.Hudson.instance.getJob("job")
def params = new StringParameterValue('PARAMTEST', "somestring")  
def paramsAction = new ParametersAction(params) 
def cause = new hudson.model.Cause.UpstreamCause(currentBuild)
def causeAction = new hudson.model.CauseAction(cause) 
hudson.model.Hudson.instance.queue.schedule(job, 0, causeAction, paramsAction) 

これが最終的に私のために働いたものです。

于 2014-06-17T11:38:48.807 に答える
7

注:パイプライン プラグインはこの問題を無意味なものにするはずですが、インフラストラクチャを更新する機会がありませんでした。

パラメーターなしでダウンストリーム ジョブを開始するには:

job = manager.hudson.getItem(name)
cause = new hudson.model.Cause.UpstreamCause(manager.build)
causeAction = new hudson.model.CauseAction(cause)
manager.hudson.queue.schedule(job, 0, causeAction)

パラメータを使用してダウンストリーム ジョブを開始するParametersActionは、 . パラメータJob1AありC、デフォルトでそれぞれ「B」と「D」になっているとします。すなわち:

A == "B"
C == "D"

Job2同じ A および B パラメータがあるとしますが、デフォルトで "F" に設定されているパラメータもとりますE。次のビルド後のスクリプトは、 と パラメータJob1をコピーしACパラメータを との値のE連結に設定します。AC

params = []
val = ''
manager.build.properties.actions.each {
    if (it instanceof hudson.model.ParametersAction) {
        it.parameters.each {
            value = it.createVariableResolver(manager.build).resolve(it.name)
            params += it
            val += value
        }
    }
}

params += new hudson.model.StringParameterValue('E', val)
paramsAction = new hudson.model.ParametersAction(params)

jobName = 'Job2'
job = manager.hudson.getItem(jobName)
cause = new hudson.model.Cause.UpstreamCause(manager.build)
causeAction = new hudson.model.CauseAction(cause)
def waitingItem = manager.hudson.queue.schedule(job, 0, causeAction, paramsAction)
def childFuture = waitingItem.getFuture()
def childBuild = childFuture.get()

hudson.plugins.parameterizedtrigger.BuildInfoExporterAction.addBuildInfoExporterAction(
    manager.build, childProjectName, childBuild.number, childBuild.result
)

Groovy Postbuild$JENKINS_HOME/plugins/parameterized-trigger/WEB-INF/classesプラグインのAdditional groovy classpath.

于 2012-12-07T22:52:51.387 に答える
4

この Groovy スクリプトを実行します

import hudson.model.*
import jenkins.model.*

def build = Thread.currentThread().executable

def jobPattern = "PUTHEREYOURJOBNAME"     
def matchedJobs = Jenkins.instance.items.findAll { job ->
    job.name =~ /$jobPattern/
}
matchedJobs.each { job ->
    println "Scheduling job name is: ${job.name}"
    job.scheduleBuild(1, new Cause.UpstreamCause(build), new ParametersAction([ new StringParameterValue("PROPERTY1", "PROPERTY1VALUE"),new StringParameterValue("PROPERTY2", "PROPERTY2VALUE")]))
}

あるビルドから別のビルドにプロパティを渡す必要がない場合は、ParametersAction を取り出してください。

スケジュールしたビルドには、最初のビルドと同じ「原因」があります。これは、「変更」を渡す良い方法です。これが必要ない場合は、関数呼び出しで new Cause.UpstreamCause(build) を使用しないでください

于 2016-11-28T22:09:12.337 に答える
1

Groovy Postbuild Plugin を使用すると、このようなものが機能する可能性があります (試したことはありません)。

def job = hudson.getItem(jobname)
hudson.queue.schedule(job)

両方のジョブをフィンガープリントすると (たとえば、親ジョブの BUILD_TAG 変数を使用して)、集計結果が取得されないことに、私は実際に驚いています。私の理解では、Jenkins は単純に md5sums を参照してジョブを関連付けます (下流のテスト結果を集計し、cli を介してトリガーしても集計結果には影響しません。どういうわけか、私が認識していない上流/下流の関係を維持するために何か追加が行われています.. .

于 2012-02-29T20:55:45.843 に答える
1

すでにダウンストリーム ジョブを動的に開始しているので、完了するまで待ってから、テスト結果ファイルを親ワークスペースにコピーします (ダウンストリーム ジョブでそれらをアーカイブしてから、「ビルド」アーティファクトをダウンロードするだけです)。Test プラグインが複数のテスト結果ページで機能するかどうかによっては、ファイルを手動で集約する必要がある場合があります。親ジョブのビルド後のステップで、適切なテスト プラグインを構成します。

于 2012-01-17T19:00:58.910 に答える