Jenkins集成GitLab的正确姿势,实现Git代码提交触发CI/CD
Jenkins集成GitLab的正确姿势,实现Git代码提交触发CI/CD
Jenkins和GitLab是目前DevOps工具链中最常见的组合,通过将GitLab代码提交与Jenkins CI/CD流水线集成,可以实现代码提交后的自动化构建和部署。本文将详细介绍如何配置Jenkins与GitLab的集成,包括插件安装、服务器配置、Job配置以及Webhook设置等关键步骤。
安装GitLab Plugin
GitLab Plugin是实现Jenkins与GitLab集成的关键插件,它允许GitLab在提交代码或打开/更新合并请求时触发Jenkins中的构建。同时,该插件还可以将构建状态发送回GitLab。
配置Jenkins Server
首先需要创建GitLab凭证,这一步骤非常重要,因为后续的Jenkins Job将使用这些凭证来访问GitLab仓库。具体操作如下:
- 进入Jenkins管理界面,选择"Manage Jenkins" -> "System" -> "enable authentication for '/project' end-point"
- 填写GitLab的访问凭证
通过该配置,相当于创建了Jenkins Job可以操作访问GitLab的凭证,在后面的Jenkinsfile中就会使用声明并使用该凭证。
配置Jenkins Job
创建一个新的Jenkins Job,具体步骤如下:
- 选择源代码管理为Git,并填写GitLab上源码仓库的URL
- 配置Credentials,用于拉取代码时的身份认证
- 在构建触发器中选择“Build when a change is pushed to GitLab”
- 点击“高级”选项,勾选“Filter branches by regex”
- 点击“Generate”生成token,这个token用于填写到GitLab的webhook里
注:复制出URL和token,后面配置GitLab的webhook会用到。
新版Jenkins可能遇到的坑
在“Generate”生成token时,如果使用的是高版本的Jenkins,可能会遇到403错误:
HTTP ERROR 403 No valid crumb was included in the request
这是因为Jenkins的防止跨站点请求伪造(Prevent Cross Site Request Forgery exploits)功能阻拦了请求。可以通过以下方式解决:
hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION = true
如果出现下图所示的情况,就表示命令成功了。
对于在容器里运行的Jenkins,需要进入容器修改配置,永久生效。修改/usr/local/bin/jenkins.sh
,找到exec java
那行,添加-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
:
exec java -Duser.home="$JENKINS_HOME" -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true "${java_opts_array[@]}" -jar ${JENKINS_WAR} "${jenkins_opts_array[@]}" "$@"
至此,Jenkins的持续集成配置已经完成,接下来需要配置GitLab的Webhook,用于代码提交通知Jenkins。
配置GitLab Webhook
打开GitLab的repo的Settings-Integrations,填写Jenkins Job中构建触发器部分生成的URL和Secret Token,点击“Add webhook”。
在链接那里输入之前Jenkins上提供的webhook url以及“Secret token”,编辑完后保存。点击测试,如果返回200,那就成功了,去Jenkins看看有没有自动构建的记录。
配置Jenkins返回执行状态
上面的步骤仅仅实现了GitLab代码提交触发Jenkins Job,那么Job执行完成后的状态,怎么在GitLab上看到呢?可以通过以下Jenkins Pipeline配置实现:
pipeline {
agent any
options {
gitLabConnection('gitlab-connection')
// Manage Jenkins->System->enable authentication for '/project' end-point
// Your配置的GitLab Connection
}
stages {
stage('build') {
steps {
updateGitlabCommitStatus name: 'build', state: 'running'
hogehoge
}
}
}
post {
success {
updateGitlabCommitStatus name: 'build', state: 'success'
}
failure {
updateGitlabCommitStatus name: 'build', state: 'failed'
}
}
}
参数说明:
gitLabConnection
是和GitLab链接的名称。GitLab名称的设定是在jenkins管理>系统设定>Gitlab当中设置详细的gitlab url和tokenupdateGitlabCommitStatus
name: build
名称state: pending, running, canceled, success, failed
参考资料
注:本文原文发布于2024年4月,部分内容可能已过时,请酌情参考。