Groovy
Jenkins
CI

Jenkinsでキューにたまった同名のジョブをPipelineからキャンセルする

例えば、ジョブ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を使う前でしたが以下のような無限ループに陥りまして。

  1. Jenkinsのジョブをビルド
  2. ビルドの中でgit push
  3. gitbucketがgit pushを検知して、Jenkinsのジョブをビルド(1に戻る)

延々とビルド数が増えていくのでキャンセルしたかったんです。
というわけで、Pipelineの最後にスクリプトを設定しておくとキャンセルされます。

補足ですが、上述のキューにたまった状態でキャンセルすると、キューにたまったジョブA #2以降はなかったことになるので、次にジョブAをビルドしたときはジョブA #2から採番されます。