Jenkins でビルドのパラメータ化でブランチをフィルタしつつ自動でもビルドするメモ

文章で説明しにくい・・・要するに次のようにしたいとき。

  • masterissue/* のみをビルドの対象にする
  • Gitlab とかの WebHook で Jenkins の /git/notifyCommit を呼んでプッシュから自動ビルドさせる
  • 手動でビルドするときも↑のパターンにマッチするブランチを選択してビルドできる

自動と手動を併用しない、または両方ですべてのブランチを対象にする例はググるとよく見かける気がしたのですが、↑みたいなパターンでフィルタしつつ自動と手動を共存している設定例をあんまり見ない気がしたので、試行錯誤しました。

環境は下記の通り。

  • Jenkins 2.68
  • Jenkins plugins
    • Job DSL 1.63
    • Git Parameter Plug-In 0.8.0
    • Git plugin 3.3.1
    • Parameterized Trigger plugin 2.34
    • SCM API Plugin 2.1.1
    • etc…

次のように設定します。

  • ビルドのパラメータ化で Git Parameter を追加して・・・
    • Parameter TypeBranch を選択
    • Branch Filter に対象とするブランチを正規表現で指定
    • Default Value に↑の正規表現の頭に : を付けたものを指定
  • ソースコード管理の Git の ビルドするブランチ で↑のパラメータ名を指定する
    • パラメータ名が PARAM_GIT_BRANCH なら ${PARAM_GIT_BRANCH} のように指定

DSL だと次のような感じ。

job('test') {
    parameters {
        gitParameterDefinition {
            name('PARAM_GIT_BRANCH')
            type('BRANCH')
            // ↓の正規表現に `:` を付けたもの
            defaultValue(':^origin/(master|issue/[^/]+)$')
            description(null)
            branch(null)
            // ビルドするブランチの正規表現
            branchFilter('^origin/(master|issue/[^/]+)$')
            tagFilter(null)
            sortMode('ASCENDING_SMART')
            selectedValue('NONE')
            useRepository(null)
            quickFilterEnabled(false)
        }
    }
    scm {
        git {
            remote {
                url('git@git.example.com:oreore/testing.git')
                credentials('jenkins')
            }
            // ブランチに↑のパラメータを指定
            branches ('${PARAM_GIT_BRANCH}')
        }
    }
    triggers {
        scm('@midnight')
    }
}

手動でビルドするときは、存在するブランチから branchFilter の正規表現でフィルタされた候補が表示されて、そこから選択してビルドを開始できます。選択したブランチはソースコード管理の ビルドするブランチ にそのまま当てはめられます。

Gitlab の WebHook などから Jenkins の /git/notifyCommit を呼んで自動でビルドされるときは、パラメータが指定されないので、ビルドのパラメータの defaultValue で指定した値がソースコード管理の ビルドするブランチ に入ります。

ソースコード管理の ビルドするブランチ は先頭に : がついていると正規表現として解釈されるので branchFilter に指定した正規表現の頭に : を付けて defaultValue に指定することで、手動でビルドするときと自動でビルドされるときで同じブランチを対象にできます。


要するに、Branch FilterbranchFilter)が手動でビルドするときに選択候補に表示されるブランチ、Default Value(defaultValue)が自動でビルドするときに対象となるブランチ、になります。

ビルドのパラメータ化をしない場合は masterissue/* をビルドしたければ ビルドするブランチ に2行ブランチを指定するだけで良いのですが、

job('test') {
    scm {
        git {
            remote {
                url('git@git.example.com:oreore/testing.git')
                credentials('jenkins')
            }
            branches (
                'origin/master',
                'origin/issue/*',
            )
        }
    }
    triggers {
        scm('@midnight')
    }
}

ビルドをパラメータ化する場合は ビルドするブランチ にはパラメータ化した値が1つしか無いので↑みたいな2行の設定はできず、Default Value(defaultValue) に正規表現で指定する必要があります。


ちなみにブランチをフィルタせずにすべてのブランチを対象にする場合は次のようにしておくと良さそうです。

job('test') {
    parameters {
        gitParameterDefinition {
            name('PARAM_GIT_BRANCH')
            type('BRANCH')
            defaultValue('**')
            description(null)
            branch(null)
            branchFilter(null)
            tagFilter(null)
            sortMode('ASCENDING_SMART')
            selectedValue('NONE')
            useRepository(null)
            quickFilterEnabled(false)
        }
    }
    scm {
        git {
            remote {
                url('git@git.example.com:oreore/testing.git')
                credentials('jenkins')
            }
            // ブランチに↑のパラメータを指定
            branches ('${PARAM_GIT_BRANCH}')
        }
    }
    triggers {
        scm('@midnight')
    }
}

defaultValue を null とかにしてしまうと自動でビルドされるときに Couldn't find any revision to build. Verify the repository and branch configuration for this job. みたいになると思います。