現在のジョブからダウンストリームジョブをトリガーしようとしています
pipeline {
stages {
stage('foo') {
steps{
build job: 'my-job', propagate: true, wait: true
}
}
}
}
目的は、ジョブの結果を待ち、その結果に応じて失敗または成功することです。 Jenkinsは常にWaiting for non-job items is not supported
というメッセージで失敗します。上記のジョブにはパラメーターがなく、他のジョブと同様に、マルチブランチパイプラインプラグインを使用して定義されています。
私が考えることができるのは、このタイプのジェンキンスアイテムがビルドステップ入力としてサポートされていないということですが、それは直感に反し、私にとってブロッカーであることがわかります。これが本当にそうであるか誰でも確認できますか?
もしそうなら、誰かが何か回避策を提案できますか?
ありがとうございました
ビルドステップの定義にもっと注意を払うことで、実際にこれを修正することができました。私のすべてのダウンストリームジョブはマルチブランチパイプラインジョブとして定義されているため、それらの構造はフォルダーに似ており、フォルダー内の各アイテムは個別のジョブを表します。したがって、ダウンストリームジョブを呼び出す正しい方法はbuild job: 'my-job', propagate: true, wait: true
ではなくbuild job: "my-job/my-branch-name", propagate: true, wait: true
でした。
また、質問とは関係ありませんが、当面の問題に関係しています。待機構文は待機中のジョブと待機中のジョブに1つのスレッドを消費するため、jenkinsマシンに少なくとも1つのエグゼキュータが常に空いていることを確認してください。オンにすると、リソース不足型の状況に簡単に陥ります。
お役に立てれば
これは、コメントを含む JENKINS-4544 のようになります。
Pipelineは、一部は技術的な制限のため、一部は最近のビルドメタデータを検査することを除いてこれを可能にする静的ジョブ構成がないため、上流/下流ジョブシステムをサポートしていません。
しかし、それはまた回避策を提供します:
ソリューションが継続している限り、ここに回避策を含めます。これは rtp(リッチテキストパブリッシャー)プラグイン に基づいており、動作させるためにインストールする必要があります。
Jenkinsfileの最後で、ジョブをトリガーした後、ジョブが完了するまで待機します。その場合、
build()
は、ダウンストリームジョブの実行に使用されるオブジェクトを返します。それから情報を取得します。警告:
getAbsoluteUrl()
関数は重要です。自己責任で使用してください!
def startedBld = build(
job: YOUR_DOWNSTREAM_JOB,
wait: true, // VERY IMPORTANT, otherwise build () does not return expected object
propagate: true
)
// Publish the started build information in the Build result
def text = '<h2>Downstream jobs</h2>Started job <a href="' + startedBld.rawBuild.getAbsoluteUrl () + '">' + startedBld.rawBuild.toString () + '</a>'
rtp (nullAction: '1',parserName: 'HTML', stableText: text)
この問題は、過去2年間に公開された JENKINS-2991 の一部です。
現在
DependencyGraph
はAbstractProject
に制限されており、ワークフローが上流/下流関係に参加することは不可能です(たとえば、セキュリティ上の制約のためにジョブチェーンが必要な場合)。
これは、別の(未回答) Stack Overflow質問 に基づいて、RFE(拡張要求) JENKINS-37718 を参照します。