在大型项目开发过程中,开发人员频繁提交新代码,然后在项目生命周期结束时将其集成到代码仓库。在集成的时候往往会需要消耗大量的时间去解决构建编译等问题。如何配置 Jenkins 与版本控制系统 Gitlab 集成实现自动化提交构建? 并优化(分支名称自动替换、增加构建描述信息、变更 commit 状态、构建失败邮件通知、过滤特殊push请求。

在本场 Chat 中,会讲到如下内容:

  1. 配置提交流水线
  2. 提交流水线优化
  3. 合并流水线

适合人群: 对 DevOps 感兴趣的所有同学。

目录内容

  • 提交流水线
  • 配置 jenkins
  • 配置 gitlab
  • 提交流水线优化
  • 分支名称自动替换
  • 增加构建描述信息
  • 变更 commit 状态
  • 构建失败邮件通知
  • 过滤特殊 push 请求
  • 合并流水线

提交流水线

当 Gitlab 中触发 push 操作,则触发相对应的 Jenkins 流水线构建。实现快速反馈与验证。

  • 方式 1: 使用 Gitlab CI,当有 push 请求,在 CI 脚本中远程触发 Jenkins 项目构建。
  • 需要准备 Gitlab runner
  • 编写触发 Jenkins 脚本
  • 方式 2: 使用 Gitlab WebHook,当有 push 请求,直接触发 jenkins 项目构建。【采用】
  • 需要配置 Gitlab webHook
  • 需要配置 Jenkins 项目 Hook

配置 jenkins

首先我们准备一个能够构建成功的流水线项目(暂且不设置复杂的步骤,helloworld 即可)

编辑项目配置: 我们要使用Generic Webhook Trigger触发器,需要安装插件。这触发器非常灵活,推荐使用。

开启Generic Webhook Trigger触发器,添加一个请求参数 runOpts Request parameters 。我们定义这个参数是为了对构建做个标识。辨别手动触发构建与提交构建。配置一个token默认我使用的是项目的名称,必须唯一,否则在配置了相同的 token 的项目都会被触发。Print post content用于展示请求日志,Print contributed variables展示我们在 post 中获取的变量内容。

配置完成后: 我们生成一个触发 URL

http://JENKINS_URL/generic-webhook-trigger/invoke?token=demo-maven-service_PUSH&runOpts=GitlabCI

配置 gitlab

我们找到要配置提交触发构建的项目,设置->集成,勾选Push Events

配置完成,这时候我们进行提交代码,会发现已经能够正常触发项目构建了。如果出现了问题,我们重点检查 jenkins 的项目触发 URL 和网络权限问题。

提交流水线优化

分支名称自动替换

当我们在任意分支提交的时候,Jenkins 需要获取我们提交的分支进行构建。而不是固定的分支。

增加获取 hook 参数 分支名称变量 Post content parameters. $指的是在 Gitlab 系统中push操作触发后发送给 Jenkins 的数据。(这个数据包含谁提交的、提交的分支、提交的 id 等信息)。而$.ref是解析这个 json 格式的数据,获取其中的ref也就是提交的分支名称。

查看下面这段 jenkinsfile,你会发现branch变量就是上面我们在触发器中配置的,它的原始内容是refs/heads/master,因为我们在下载代码的时候不需要前面refs/heads/内容,所以去掉了。此时可以重复在不通的分支提交代码,当在构建日志中出现了不通的分支名称,则成功了。

branchName = branch - "refs/heads/"//pipelinepipeline{    agent { node { label "build"}}    stages{        stage("CheckOut"){            steps{                script{                    println("${branchName}")                }            }        }    }}

增加构建描述信息

别忘了我们在前面构建触发器中配置了runOpts参数,这个参数我们用于区分不通的构建触发方式(手动、提交触发)。 这时候我们可以结合currendBuild.description配置。

为了更加明显我们可以在触发器中再添加一个参数,用户获取提交的用户。

然后我们来完善一下上面的 Jenkinsfile,如下:

branchName = branch - "refs/heads/"currentBuild.description = "Trigger by ${userName} ${branch}"//pipelinepipeline{    agent { node { label "build"}}    stages{        stage("CheckOut"){            steps{                script{                    println("${branchName}")                }            }        }    }}

改好了之后,我们可以进行调试了。当你在项目的构建记录中看到下图信息,表名成功了。

变更 commit 状态

其实,Gitlab 自身的 GitlabCI 很好用,能够根据流水线的状态设置当前提交的状态。而我们使用 Jenkins 也是可以完成这样的配置。这个需要我们去研究 Gitlab 的 API。先看下效果吧!

开始配置: 需要研究Gitlab 的 Pipeline 接口文档 关于 gitlab 中 pipeline 的状态有:[pending, running, success, failed, canceled] 。 接口地址为projects/${projectId}/statuses/${commitSha}?state=state

搞清楚了上面这些,我们在共享库中进行封装就很简单了。 开始吧!可以看到我们还需要一些信息例如:projectIdgitlab 项目的 ID,commitSha提交的 id。我们该如何获取呢? 对的,没错我们根据上面的操作一样获取。 首先在触发器添加两个参数projectId,commitSha,分别对应项目 Id 和提交 Id。 $.project.id,$.checkout_sha

ok!很好,我们接下来在共享库创建一个文件src/org/devops/gitlab.groovy,这个文件用与后续的 Gitlab 操作。然后我们在 jenkins 中添加一个凭据用户存储 Gitlab 的 token,这里我定义的凭据名称是gitlab-token 。我们首先使用httpRequest封装请求 Gitlab 的 API 地址,然后使用withCredentials获取 Jenkins 中的凭据gitlab-token赋值给变量gitlabToken用于认证使用。

package org.devops//封装 HTTP 请求def HttpReq(reqType,reqUrl,reqBody){    def gitServer = "http://192.168.1.200:30088/api/v4"    withCredentials([string(credentialsId: 'gitlab-token', variable: 'gitlabToken')]) {      result = httpRequest customHeaders: [[maskValue: true, name: 'PRIVATE-TOKEN', value: "${gitlabToken}"]],                 httpMode: reqType,                 contentType: "APPLICATION_JSON",                consoleLogResponseBody: true,                ignoreSslErrors: true,                 requestBody: reqBody,                url: "${gitServer}/${reqUrl}"                //quiet: true    }    return result}

如果上面的内容你有点看不懂了,嘿嘿,先放放。你可以去了解下关于 HTTP 请求相关基础知识了。

我们开始添加变更提交状态的方法(记住我们现在还在 gitlab.groovy 文件中哦),我们定义一个ChangeCommitStatus()方法,具有三个参数分别为项目 ID、提交 ID、提交状态 projectIdcommitSha,status。然后使用我们上面封装好的方法发送POST请求。

//更改提交状态def ChangeCommitStatus(projectId,commitSha,status){    commitApi = "projects/${projectId}/statuses/${commitSha}?state=${status}"    response = HttpReq('POST',commitApi,'')    println(response)    return response}

到此我们在共享库的配置就完成了,接下来在 Jenkinsfile 中引用并进行调试。首先我们先加载了共享库jenkinslibrary 然后引用了 gitlab.groovy。当流水线开始运行的时候我们将当前这次提交的状态为running运行中状态,当流水线构建成功我们会把状态变为success,当流水线失败了或者被取消了我们会将状态变为failedcanceled

#!groovy@Library('jenkinslibrary@master') _//func from shareibrarydef gitlab = new org.devops.gitlab()//branchbranchName = branch - "refs/heads/"currentBuild.description = "Trigger by ${userName} ${branch}"gitlab.ChangeCommitStatus(projectId,commitSha,"running")//pipelinepipeline{    agent { node { label "build"}}    stages{        stage("CheckOut"){            steps{                script{                    println("${branchName}")                }            }        }    }    post {        always{            script{                println("always")            }        }        success{            script{                println("success")                gitlab.ChangeCommitStatus(projectId,commitSha,"success")            }        }        failure{            script{                println("failure")                gitlab.ChangeCommitStatus(projectId,commitSha,"failed")            }        }        aborted{            script{                println("aborted")                gitlab.ChangeCommitStatus(projectId,commitSha,"canceled")            }        }    }}

如果调试没有问题,那么此时你可以登录 gitlab 系统当前项目的分支的提交的状态了!但是你是否觉得还差点什么? 如果开发人员提交了,然后流水线自动执行了,最后失败了怎么办? 要求开发人员放下工作实时去看?我觉得发送一个通知会更好一些! 例如邮件通知。好吧,开始配置!

构建失败邮件通知

首先要为每个开发人员分配一个邮箱,并且要在 Gitlab 中填写好。登录个人用户进行配置哦!没错,在这里配置邮箱的意义就是方便后面我们在 jenkins 中过滤获取。当然如果公司邮箱具有特征:用户名@xxx.com。就不用配置了因为前面已经获取的用户名。当然很多时候不是这样的,所以我们有必要把这个配置好。

配置好邮箱之后,我们需要在 Jenkins 中配置邮件通知和项目配置。我们在项目中触发器添加一个参数userEmail

Jenkins 需要配置邮件通知,安装插件Email Extension,然后进入系统管理-> 系统设置 ->Extended E-email Notification。这里我使用的是 QQ 邮箱,填写 SMTP 服务器地址smtp.qq.com 和端口 465注意要开启 SSL,密码为授权码。

邮件通知的功能很重要,我们要为每条流水线都加上这个步骤,我们在共享库中封装一个toemail.groovy。 新建文件src/org/devops/toemail.groovy。在这个文件中,我们写了一段 HTML 代码,主要展示 Jenkins 的构建信息。

package org.devops//定义邮件内容def Email(status,emailUser){    emailext body: """            <!DOCTYPE html>             <html>             <head>             <meta charset="UTF-8">             </head>             <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">                 <img src="http://192.168.1.200:8080/static/0eef74bf/images/headshot.png">                <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">                       <tr>                         <td><br />                             <b><font color="#0B610B">构建信息</font></b>                         </td>                     </tr>                     <tr>                         <td>                             <ul>                                 <li>项目名称:${JOB_NAME}</li>                                         <li>构建编号:${BUILD_ID}</li>                                 <li>构建状态: ${status} </li>                                                         <li>项目地址:<a href="${BUILD_URL}">${BUILD_URL}</a></li>                                    <li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>                             </ul>                         </td>                     </tr>                     <tr>                  </table>             </body>             </html>  """,            subject: "Jenkins-${JOB_NAME}项目构建信息 ",            to: emailUser    }

在流水线中引用

#!groovy@Library('jenkinslibrary@master') _//func from shareibrarydef gitlab = new org.devops.gitlab()def toemail = new org.devops.toemail()//branchbranchName = branch - "refs/heads/"currentBuild.description = "Trigger by ${userName} ${branch}"gitlab.ChangeCommitStatus(projectId,commitSha,"running")//pipelinepipeline{    agent { node { label "build"}}    stages{        stage("CheckOut"){            steps{                script{                    println("${branchName}")                }            }        }    }    post {        always{            script{                println("always")            }        }        success{            script{                println("success")                gitlab.ChangeCommitStatus(projectId,commitSha,"success")                toemail.Email("流水线成功",userEmail)            }        }        failure{            script{                println("failure")                gitlab.ChangeCommitStatus(projectId,commitSha,"failed")                toemail.Email("流水线失败了!",userEmail)            }        }        aborted{            script{                println("aborted")                gitlab.ChangeCommitStatus(projectId,commitSha,"canceled")                toemail.Email("流水线被取消了!",userEmail)            }        }    }}

接下来可以调试了,如果没有问题会在邮箱中看到此封邮件。

过滤特殊 push 请求

你可能发现问题了,新建一个分支或者标签也会出现构建,这个构建是没有意义的。我们需要排除掉。没错,jenkins 的 Generic webHook 也是支持的。

参考官方的说明:https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd

添加三个变量,获取当前的提交信息 $object_kind $before $after

通过正则表达式配置触发条件:Expression ^push\s(?!0{40}).{40}\s(?!0{40}).{40}$ Text $object_kind $before $after。 push 请求只有 after 和 before 的值都不是 40 个 0 的时候触发构建(为 40 个 0 的情况是删除分支或者新建分支)

Ok! 提交流水线配置好了,可以玩耍了~。

合并流水线

关于合并流水线的配置之前要把提交流水线配置好,当提交流水线配置好了,合并流水线只需要修改一个配置。

当流水线成功后才可以合并:会检查原分支中的最后一次提交的状态是否为 success。

当原分支最后一次提交的状态为 success,则可以合并。


阅读全文: http://gitbook.cn/gitchat/activity/5e429efb9c99a677c2f61ea4

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App , GitChat 专享技术内容哦。

Jenkins集成Gitlab配置提交流水线相关推荐

  1. Jenkins集成GitLab Webhooks自动化构建

    Jenkins+GitLab Webhooks自动构建项目 1 构建步骤 1.1 Jenkins中设置构建触发器 1.2 Build Authorization Token Root插件安装 1.3 ...

  2. jenkins新版本+gitlab配置自动化部署报错Hook executed successfully but returned HTTP 403,没有CSRF选项

    问题: 配置jenkins+gitlab自动化部署报错: 错误内容: Hook executed successfully but returned HTTP 403 <html> < ...

  3. 再见Jenkins,从Gitlab代码提交到k8s服务持续交付只需七毛三

    Gitlab runner 快速搭建CICD pipeline 背景 日常开发中,相信大家已经做了很多的自动化运维环境,用的最多的想必就是利用Jenkins实现代码提交到自动化测试再到自动化打包,部署 ...

  4. Jenkins集成GitLab自动化部署

    一.申请一台linux系统 二.搭建docker环境 参考:Install docker 三.搭建Jenkins环境 参考:Install Jenkins 使用docker搭建完Jenkins环境后, ...

  5. jenkins集成gitlab

    前言 jenkins实现自动化部署的很重要的一步就是去代码仓库下载源代码,通常我们的项目的代码托管在SVN或git上,通过在jenkins上配置git或SVN插件,即可完成从SVN或者git上自动拉取 ...

  6. Jenkins集成Gitlab实现自动化部署

    目录 一.环境准备 1.配置无密码登录 (1)Jenkins 服务器上生成一对公钥.私钥 (2)获取公钥信息 (3)获取私钥信息 (4)复制公钥到应用服务器 二.配置 Gitlab 1.创建示例项目 ...

  7. Jenkins之gitlab配置

    点击创建一个新任务,输入任务名字,选择自由风格,点击确定既可 在源码管理添加源码路径,点击Add,添加认证,这里是git,如果是svn,需要安装svn相关插件 选择SSH认证方式 在Gitlab上创建 ...

  8. python 持续集成_使用jenkins和Gitlab进行Python项目的持续集成

    一.安装Jenkins 1.1 我的系统环境: Linux: Centos7.6 python: 2.7 java: 1.8 firewall-cmd: not running 1.2 两种方法,推荐 ...

  9. 持续集成[代码流水线管理及Jenkins和gitlab集成]-自动化部署05

    安装sonar Scanner 打开http://www.sonarqube.org/官网 找到下面扫描器 通过这个扫描器可以分析代码分析 因此你也的安装这个扫描器 上传sonar-scanner-2 ...

最新文章

  1. Linux pipe函数
  2. 图片视频预览开启和关闭脚本 Xp
  3. SQL 查询结果为 XML
  4. PHP常用函数(收集)
  5. 常用c语言函数实现,常用的C语言库函数实现
  6. 手把手教你强化学习 (七) 强化学习中的无模型控制
  7. Win7 专业版安装中文包、汉化处理
  8. python-网络编程-tcp/ip认识(一)
  9. 计算机主板大小性能区别,电脑主板是大板好还是小板好 主板中大板和小板的区别介绍...
  10. HTML给表格写个标题居中,如何将表格中的各个标题居中?
  11. [强网杯 2019]随便注
  12. 川的第一份博客——内容定义
  13. DS5000神奇的FDE全磁盘加密技术
  14. Linux(centos7.9)常用命令大全及基础知识
  15. 如何创建一个微信公众号(手把手、超详细)
  16. 计算机应用能力考试裸考,五分钟拯救裸考生,计算机二级这样就能过
  17. 2021年全球汽车天线收入大约1816.1百万美元,预计2028年达到2199.7百万美元,2022至2028期间,年复合增长率CAGR为3.0%
  18. 打印A4纸图片需要多少像素和分辨率
  19. 微软c语言编译软件学生版下载,C语言下载_C语言官方下载【C语言编程软件】-太平洋下载中心...
  20. echarts官网进不去,处理DNS了还是进不去

热门文章

  1. IE 报错 strict模式下不允许分配到只读属性 问题解决
  2. 【BZOJ4872】分手是祝愿
  3. 3款在线浏览器兼容性测试工具
  4. 阿里妈妈2018的ESMM(CVR预估)
  5. docker启动mysql实例之后,docker ps命令查询不到
  6. wsl Linux子系统和windows主机文件系统互相访问方法
  7. QQ未解之谜——GIPS是何方神圣?
  8. 贵州开启“大数据+旅游+工业”新时代
  9. jquery validation插件
  10. Redis中间件学习笔记(三)(面试重点)