例えば、ジョブAのビルドが終わる前に複数回ビルドを起動した場合を想定します。
【ビルド実行中】
1. ジョブA #1
【キュー】
1. ジョブA #2
2. ジョブA #3
:
n. ジョブA #n
という状況になります。
こんな時に、キューに積まれたジョブA #2
〜ジョブA #n
をPipelineからサクッとキャンセルするスクリプトが以下になります。
// ジョブ名を取得
def jobName = env.JOB_NAME
// キューの取得
def q = jenkins.model.Jenkins.getInstance().getQueue()
def items = q.getItems()
def len = items.length
for (i=0;i<items.length;i++){
def taskName = items[i].task.getName()
// ジョブ名とタスク名が一致したらキャンセル
if(taskName == jobName){
items[i].doCancelQueue()
}
}
個人的にはPipelineでスクリプトの最後の方に設定しています。
何の役に立つのか? というと、Pipelineを使う前でしたが以下のような無限ループに陥りまして。
- Jenkinsのジョブをビルド
- ビルドの中で
git push
- gitbucketが
git push
を検知して、Jenkinsのジョブをビルド(1に戻る)
延々とビルド数が増えていくのでキャンセルしたかったんです。
というわけで、Pipelineの最後にスクリプトを設定しておくとキャンセルされます。
補足ですが、上述のキューにたまった状態でキャンセルすると、キューにたまったジョブA #2
以降はなかったことになるので、次にジョブAをビルドしたときはジョブA #2
から採番されます。