GitLab Merge RequestトリガJenkins pipeline
文書ディレクトリ
GitLab Merge RequestトリガJenkins pipeline
前言
GitLab push自動トリガJenkins構築と持続的統合の論文では,GitLab pushトリガJenkins構築について述べた.
PushトリガJenkinsコンストラクションと比較して、merge requestトリガJenkinsコンストラクションは、コードがターゲットブランチにマージされる前に変更されたコードがCIに失敗するかどうかを確認することができ、コードレビューに重要な根拠を提供します.
他の手順は、上記のGitLab pushを参照してJenkins構築と継続的な統合記事を自動的にトリガーすることができます.
以下は特に注意しなければならない点だけを言います.
ビルドTriggersの構成
Jenkins jobを開く
Build when a change is pushed to GitLabをチェックする.GitLab webhook URL
「Opened Merge Request Events」をチェック
「Advanced...」を開き、Allow branchesでFilter branch by regexをチェックして、Source branchとTarget branchを入力します.一部のsource branchまたはtarget branchのみがJenkins構築をトリガーします.
Jenkins webhookの構成
上記の記事を参考に、GitLabでJenkins webhookを構成しますが、TriggerをMerge Request Eventsとして選択するのとは異なり、Enable SSL verificationのチェックを外します.
GitLabでwebhookがJenkinsに正常に通知できるかどうかをテストします.
Merge request settingsの構成(オプション)
GitLabで、プロジェクト構成を開き、Settings/General/Merge request settingsを開きます.
「Only allow merge requests to be merged if the pipeline succeeds」をチェックし、Jenkins pipelineの実行に成功した場合にのみインタフェースでmergeを許可します.
この機能にはJenkins pipelineの特別サポートが必要です.
Jenkinsパイプラインの構成
GitLab Connectionの構成:
options {
gitLabConnection('GitlabAccess')
}
Checkout merge requestのコード:
stage('Checkout') {
steps {
checkout changelog: true, poll: true, scm: [
$class: 'GitSCM',
branches: [[name: "origin/${env.gitlabSourceBranch}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[
$class: 'PreBuildMerge',
options: [
fastForwardMode: 'FF',
mergeRemote: 'origin',
mergeStrategy: 'default',
mergeTarget: "${env.gitlabTargetBranch}"
]
]],
extensions: [[
$class: 'UserIdentity',
email: "${env.gitlabUserEmail}",
name: "${env.gitlabUserName}"
]],
submoduleCfg: [],
userRemoteConfigs: [[
credentialsId: "${GIT_CREDENTIALS_ID}",
name: 'origin',
url: "${env.gitlabSourceRepoURL}"
]]
]
}
}
そのうち
PreBuildMerge
はsource branchのコードを引き出した後、Jenkins workspaceの下でローカルのgit merge
操作を行います.GitLabステータスを更新するpost-actions:
post {
success {
updateGitlabCommitStatus(name: 'build', state: 'success')
}
failure {
updateGitlabCommitStatus(name: 'build', state: 'failed')
addGitLabMRComment comment: "Something unexpected happened. Please inspect Jenkins logs."
}
}
テスト
GitLabに新しいmerge requestを作成し、Jenkins pipelineが自動的にトリガーされるかどうかをテストします.
注意:GitLab merge requestがオープン状態の場合、このmerge requestのsource branchにコードをコミットするたびに、新しいmerge request event通知がJenkinsにトリガーされます.