Jenkinsで停止しないジョブを確実に停止させる

業務ではUnityでのアプリビルドサーバーをJenkinsで構築・管理も担当しているのですが、たまにJenkinsジョブを停止しようとしても停止しないことがあり、その都度調べて対応するのでメモ代わりにブログに書きます。

特定のジョブを確実に停止させる

早速本題で、StackOverflowのHow to stop an unstoppable zombie job on Jenkins without restarting the server?が参考になりました。

確実にジョブを停止させるには、Manage Jenkins > Script Console から、スクリプトコンソールを利用して、下記のスクリプトを実行します。

Jenkins.instance
  .getItemByFullName("JobName")
  .getBuildByNumber(JobNumber)
  .finish(
    hudson.model.Result.ABORTED,
    new java.io.IOException("Aborting build")
); 

ビルドURLが https://YOURJENKINSHOST/job/testjobname/21/ とすると、JobNametestjobnameに、JobNumber21になります。つまり下記を実行します。

Jenkins.instance
  .getItemByFullName("testjobname")
  .getBuildByNumber(21)
  .finish(
    hudson.model.Result.ABORTED,
    new java.io.IOException("Aborting build")
); 

これで確実にジョブを停止させることができるようです。(手元で数回試す機会があったが、失敗したことはとりあえずなかった。)

すべてのゾンビジョブを停止させる方法

https://stackoverflow.com/a/47540001の方法ですべてのゾンビジョブを停止できるようです。(試してない。)

build.getResult().equals(null)で、ビルドがゾンビかどうかを判定しているようです。

Jenkins.instance
  .getItemByFullName("JobName")
  .getItems().each { repository->
    repository.getItems().each { branch->
      branch.builds.each { build->
        if (build.getResult().equals(null)) {
          build.doKill()
        }
      }
    }
  }