16

実行に 1 分かかる Jenkins ジョブ A と、5 分かかるジョブ B を想像してください。

ジョブ B をトリガーするようにジョブ A を構成すると、ジョブ B が実行されている間、ジョブ B が完了する前にジョブ A が 5 回実行される可能性があります。ただし、Jenkins はジョブ B のキューに 5 つのビルドを追加しません。そうしないと、高速なジョブ A が低速なジョブ B のビルドのバックログを増やし続けることになるため、これは素晴らしいことです。

ただし、パラメーター化されたトリガー プラグインを使用して、ジョブ A がパラメーター化されたジョブとして B をトリガーするようにします。パラメーター化されたジョブバックログをキューに入れます。これは、ジョブ A がジョブ B の大量のビルドを喜んで作成していることを意味し、これはおそらく追いつくことができません。

パラメータが異なる可能性があるため、トリガーされるたびに新しいパラメータ化されたビルドをキューに追加することは理にかなっています。Jenkins は、新しいパラメーター化されたビルドが以前にキューに入れられたものを不要にすることを常に想定すべきではありません。

ただし、私たちの場合、実際にはこれが必要です。ジョブ A がアプリケーションをビルドしてパッケージ化した後、ジョブ B がそれを本番環境に似た環境にデプロイし、より重い一連の統合テストを実行します。また、別の環境にデプロイしてさらに多くのテストを行うビルド C もあるため、これはエスカレートするパターンです。

パラメータ化されたジョブ B のキューが、最後に追加されたビルドのみを保持するようにします。新しいビルドごとに、現在キューにあるジョブが置き換えられます。

これを達成する良い方法はありますか?

4

7 に答える 7

8

「System Groovy Script」ビルド前ステップをジョブ B に追加します。このステップは、同じ名前の (より新しい) キューに入れられたジョブをチェックし、見つかった場合は救済します。

def name = build.properties.environment.JOB_NAME
def queue = jenkins.model.Jenkins.getInstance().getQueue().getItems()
if (queue.any{ it.task.getName() == name }) {
  println "Newer " + name + " job(s) in queue, aborting"
  build.doStop()
} else {
  println "No newer " + name + " job(s) in queue, proceeding"
}
于 2016-05-27T07:03:08.523 に答える
2

Parameterized Trigger Plugin を取り除き、代わりに従来のトリガーを使用できます。おっしゃる通り、これでジョブBのキューが溜まるのを防げます。

AからBにパラメータを渡す方法は?ジョブ A を作成して、そのコンソール出力にパラメーターを生成します。ジョブ B でこれらのビルド パラメーターを取得するには、最新の A ビルドのコンソール出力を調べます (おそらく Python スクリプトを使用しますか?)。

于 2012-01-29T06:59:03.803 に答える
1

1つの回避策は次のとおりです。

于 2012-01-29T06:47:07.673 に答える
1

Git を使用している場合、これは Triggering/Parameters/Pass-through オプションの "Combine Queued git hash" でサポートされるようになりました。これで実際に動作する最初の Git プラグイン バージョンは 1.1.27 です ( Jenkins-15160を参照) 。

于 2013-02-23T23:52:31.350 に答える
1

ロンの解決策は私にとってはうまくいきました。ビルド履歴にキャンセルされたビルドが多数あるのが気に入らない場合は、ジョブ B をトリガーする前に、次のシステム groovy スクリプトをジョブ A に追加できます。

import hudson.model.*  
def q = jenkins.model.Jenkins.getInstance().getQueue()   
def items = q.getItems()  
for (i=0;i<items.length;i++){  
  if(items[i].task.getName() == "JobB"){  
    items[i].doCancelQueue()
  }   
}
于 2016-07-29T17:54:07.047 に答える
0

いくつかのパラメーターの一致のみを気にする場合は、より柔軟なオプションがあります。これは、ジョブが外部 (つまり、GitHub または Stash から) でトリガーされ、一部のパラメーターが個別のビルドを必要としない場合に特に役立ちます。

チェックされたパラメーターが現在のビルドとキューに入れられたビルドの両方で値と存在の両方で一致する場合、現在のビルドは中止され、説明には、将来のビルドに同じチェックされたパラメーターが含まれていることが示されます (それらがあったものと一緒に)。

中止されたジョブを示すビルド履歴が必要ない場合は、最後のジョブを除く他のすべてのキューに入れられたジョブをキャンセルするように変更できます。

    checkedParams = [ 
    "PARAM1",
    "PARAM2",
    "PARAM3",
    "PARAM4",
]

def buildParams = null
def name = build.project.name
def queuedItems = jenkins.model.Jenkins.getInstance().getQueue().getItems()

yieldToQueuedItem = false
for(hudson.model.Queue.Item item : queuedItems.findAll { it.task.getName() == name }) {
    if(buildParams == null) {    
        buildParams = [:]
        paramAction = build.getAction(hudson.model.ParametersAction.class)
        if(paramAction) {
            buildParams = paramAction.getParameters().collectEntries {
                [(it.getName()) : it.getValue()]
            }
        }
    }
    itemParams = [:]
    paramAction = item.getAction(hudson.model.ParametersAction.class)
    if(paramAction) {
        itemParams = paramAction.getParameters().collectEntries {
            [(it.getName()) : it.getValue()]
        }
    }

    equalParams = true
    for(String compareParam : checkedParams) {
        itemHasKey = itemParams.containsKey(compareParam)
        buildHasKey = buildParams.containsKey(compareParam)
        if(itemHasKey != buildHasKey || (itemHasKey && itemParams[compareParam] != buildParams[compareParam])) {
            equalParams = false
            break;
        }
    }
    if(equalParams) {
        yieldToQueuedItem = true
        break
    }
}

if (yieldToQueuedItem) {
    out.println "Newer " + name + " job(s) in queue with matching checked parameters, aborting"
    build.description = "Yielded to future build with:"
    checkedParams.each {
        build.description += "<br>" + it + " = " + build.buildVariables[it]
    }

    build.doStop()
    return
} else {
    out.println "No newer " + name + " job(s) in queue with matching checked parameters, proceeding"
}
于 2016-08-25T17:06:25.463 に答える