[Gitlab + Jenkins + Pipeline + WebHook+ Multibranch] - 实现持续集成和自动发布
本文的实现:
- 代码提交gitlab,自动触发Jenkins构建
- gitlab开发分支merge后自动发布到dev环境
- gitlab master分支merge后自动构建,需手动更新prd环境
Jenkins准备工作
- 安装插件
gitlab
pipeline
- 配置Gitlab的连接
- 打开
系统管理 - 系统设置 - gitlab
- 去掉此选项的勾选
Enable authentication for '/project' end-point
- 配置GitLab connections
- 设置
Connection name
和Gitlab host URL
- Credentials的配置
- 添加Jenkins凭据
- 类型选择
Gitlab API token
- API token的获取
- 在Gitlab上拥有一个用户并具有developer角色
- 获取方法:
登录用户 - User settings - Access Tokens
,创建一个Token记录
- 复制Token值并保存到Jenkins的凭据中
- 点击下面的
Test Connection
测试- 成功会提示
Success
- 如果失败检查gitlab的url地址是否正确
- 成功会提示
- 配置多分支流水线任务
- 新建任务,选择
多分支流水线
- 配置任务
- 添加一个仓库,类型选
Git
- Credentials的配置
- 添加Jenkins凭据
- 类型选择
Username with Password
- 用户的获取
- 在Gitlab上拥有一个用户并具有developer角色
- 如果你的项目类型属于
Private
,这个用户必须是这个项目的成员
- 其他默认读取根目录下的Jenkinsfile文件
Jenkinsfile准备工作
主要配置:
// 获取gitlab connection, 填写我们之前配置gitlab connection
properties([gitLabConnection('gitlab-bigdata')])
// 拉取代码
checkout scm
// 告诉gitlab job状态
updateGitlabCommitStatus name: 'build', state: 'pending'
// 根据不同的分支触发不同的步骤
if (env.BRANCH_NAME == 'master' || env.BRANCH_NAME == 'dev' ) {
stage("Build Docker Image"){
echo "build docker image"
echo "Only dev/master branch can build docker image"
}
if(env.BRANCH_NAME == 'dev'){
stage("Deploy to test"){
echo "branch dev to deploy to environment test"
}
stage("Integration test"){
echo "test环境集成测试"
}
}
if(env.BRANCH_NAME == 'master'){
stage("Deploy to prod"){
echo "branch master to deploy to environment prod"
}
stage("Health check"){
echo "prod检查"
}
}
}
Gitlab准备工作
- 修改默认的安全请求
- 注意: 当Jenkins和Gitlab在同一台机器时
- 使用root登录,
管理中心 - 设置 - 网络 - 外发请求(Admin Area - settings - Network - Outbound requests)
- 加上此选项的勾选
Allow requests to the local network from hooks and services
, 保存
选择Jenkins任务的触发方式
手动触发
定时触发
-
Gitlab trigger
- 进入项目,
Settings - Integrations
- 填写Jenkins任务的地址,选中
Push events
和Merge request events
- Jenkins url格式:
http://JENKINS_URL/project/PROJECT_NAME
When you configure the plugin to trigger your Jenkins job, by following the instructions below depending on job type, it will listen on a dedicated URL for JSON POSTs from GitLab's webhooks. That URL always takes the form http://JENKINS_URL/project/PROJECT_NAME, or http://JENKINS_URL/project/FOLDER/PROJECT_NAME if the project is inside a folder in Jenkins. You should not be using http://JENKINS_URL/job/PROJECT_NAME/build or http://JENKINS_URL/job/gitlab-plugin/buildWithParameters, as this will bypass the plugin completely.
- 进入项目,
验证
- 提交代码
- 查看状态 - 进入项目
- WebHook状态
- 依次点击
Settings - Integrations
- 编辑触发Jenkins的那条记录
- 查看
Recent Deliveries
部分,显示了最近的Trigger状态 - Pipelines状态
- Jenkins Job状态
- 成功状态
- WebHook状态 -
200
- Pipelines状态 -
passed
- Jenkins Job状态 -
成功
- WebHook状态 -