Jenkins

JenkinsのPipelineでSVNのChangesが二重に記録される問題と対処法

状況

JenkinsのPipelineを下記設定で作成してジョブを実行すると、変更履歴が1コミットに対して2つ記録されてしまう。

  • Pipeline script from SCM
  • SCMはSubversionを使う
  • プロジェクト直下にJenkinsfileを配置
  • JenkinsfileはDeclarative Pipeline構文

原因

「Pipeline script from SCM」でジョブを作成した場合、Jenkinsfile自体を更新するPipelineJobのワークスペースと、Jenkinsfileを実行するSandboxのワークスペースが別になっているっぽい。
それぞれのワークスペースでsvn updateが合計2回実行されて、そのぶん二重にChangesが記録されてしまう。

一応バグ報告は上がっているみたいだけどStatusがOPENのままなので解決していないみたい。
SCMにgitを使っている場合は発生しないのかな。

[JENKINS-38204] SVN plugin show all checkouts twice in pipeline project - Jenkins JIRA

対処法

Jenkinsfileに下記2つを設定する。

  • optionsディレクティブにskipDefaultCheckout()の設定を追加
  • stagesディレクティブの最初にcheckoutchangelog:false指定で実行

デフォルトのチェックアウト処理は細かい設定ができないので、それをskipして自前でチェックアウトするように設定する。checkoutの引数についてはscm変数が使えるのでそれを使うとシンプルに書ける。

pipeline {

    agent any

    options {
        skipDefaultCheckout()
    }

    stages {
        stage('checkout') {
            checkout changelog: false, scm: scm
        }

        stage('build') {
            sh './gradlew build'
        }

        // omitted...
    }
}