LoginSignup
2
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-31

例えば、ジョブ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から採番されます。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3