一、安装Generic Webhook Trigger插件

二、创建项目

创建项目之前先准备自己的项目,如果没有可以我fork的一个项目。地址是:https://gitee.com/jokerbai/simple-java-maven-app.git


由于我这里是使用了Jenkins的share library,可以参考我的配置。地址是:https://gitee.com/jokerbai/jenkins-shareLibrary.git


然后开始正式创建项目。
(1)、创建一个java-maven-test的项目
(2)、定义几个参数,如下:




(3)、配置触发器
选择我们刚才安装的触发器



配置触发器,指定一个运行模式。通过这个参数来判断流水线是手动触发还是远程触发。



配置TOKEN,这里就将TOKEN指定为项目名



把日志打印打开,后面会有用

然后把上面的URL保存下:http://JENKINS_URL/generic-webhook-trigger/invoke


(4)、配置流水线,我这里配置的是share library地址



(5)、保存退出

三、配置Jenkins和码云联动

1、配置Jenkins用户和security

在“系统管理–管理用户–用户列表–admin处点击进去–左边侧边栏–设置”设置用户API Token



然后在“系统设置->Configure Global Security”,去掉防止跨站点请求伪造的勾,这样我们就可以在浏览器和码云的webhook访问到api的地址了,不然我们把用户名和密码放到url 中,还是不能访问。

2、配置码云webhook

找到webhook管理界面

添加webhooks



然后我们点击测试,看Jenkins是否自动触发。



然后我们在Jenkins上可以看到可以自动触发了,而且可以看到日志如下:



然后可以随便修改一下项目内容,提交后看Jenkins运行情况(略)。

四、配置多分支自动匹配构建

(1)、创建一个分支用于测试

(2)、我们可以分析一下自动触发构建都传过来什么参数,把起json格式化一下。

从上面可以看到我们要的分支是key是"ref"。


(3)、我们重新配置流水线项目,解析我们需要的ref

其中:branch是自定义名字,$.ref表示解析子串中的ref,其中$表示整个子串。


然后我们随意修改一下test分支下的代码,提交以下抓取jenkins的日志。

可以看到成功获取到了我们的分支名。


接下来我们就需要修改我们的Jenkinsfile了。
如下:

  1. //String workspace "/opt/jenkins/workspace"
  2. // 配置共享库
  3. @Library('myLib')
  4. // 引用共享库中的方法
  5. def tools = new org.devops.tools()
  6. def build = new org.devops.build()
  7. def deploy = new org.devops.deploy()
  8. // 定义变量
  9. String buildType = env.buildType
  10. String buildShell = env.buildShell
  11. String deployHosts = env.deployHosts
  12. String branchName = "${env.branchName}"
  13. String srcUrl = "${env.srcUrl}"
  14. // 获取分支
  15. if ("${runOpts}" == "GiteePush"){
  16. branchName = branch - "refs/heads/"
  17. }
  18. // Pipeline
  19. pipeline {
  20. // 指定在哪个节点上执行pipeline
  21. agent any
  22. // 获取自动安装或者手动安装的环境变量
  23. //tools {
  24. // maven "M2"
  25. //}
  26. // 指定运行的选项(可选)
  27. options {
  28. timestamps() // 日志会有时间
  29. skipDefaultCheckout() // 删除隐式checkout scm语句
  30. disableConcurrentBuilds() //禁止并行
  31. timeout(time:1,unit:'HOURS') //设置流水线超时时间
  32. }
  33. // 构建阶段
  34. stages {
  35. // 下载代码
  36. stage("GetCode"){
  37. // 步骤
  38. steps{
  39. // 设置步骤超时时间
  40. timeout(time:5,unit:'MINUTES'){
  41. script{
  42. tools.PrintMes(branchName, "blue")
  43. // println("获取代码")
  44. tools.PrintMes("获取代码",'red')
  45. checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'gitee', url: "${srcUrl}"]]])
  46. }
  47. }
  48. }
  49. }
  50. stage("Build"){
  51. steps{
  52. timeout(time:20,unit:'MINUTES'){
  53. script{
  54. // println("代码打包")
  55. tools.PrintMes("代码打包",'blue')
  56. build.Build(buildType,buildShell)
  57. }
  58. }
  59. }
  60. }
  61. stage("CodeScanner"){
  62. steps{
  63. timeout(time:30,unit:'MINUTES'){
  64. script{
  65. // println("代码扫描")
  66. tools.PrintMes("代码扫描",'green')
  67. }
  68. }
  69. }
  70. }
  71. }
  72. // 构建后的操作
  73. post {
  74. always {
  75. script{
  76. println("always:不论构建成功与否都会执行")
  77. }
  78. }
  79. success {
  80. script{
  81. println("success:只有构建成功才会执行")
  82. currentBuild.description = "\n构建成功!"
  83. // deploy.AnsibleDeploy("${deployHosts}","-m ping")
  84. }
  85. }
  86. failure {
  87. script{
  88. println("failure:只有构建失败才会执行")
  89. currentBuild.description = "\n构建失败!"
  90. }
  91. }
  92. aborted {
  93. script{
  94. println("aborted:只有取消构建才会执行")
  95. currentBuild.description = "\n构建取消!"
  96. }
  97. }
  98. }
  99. }

其中修改的地方是:

  1. // 获取分支
  2. tools.PrintMes("获取分支名","green")
  3. if ("${runOpts}" == "GiteePush"){
  4. branchName = branch - "refs/heads/"
  5. }
  6. tools.PrintMes(branchName, "blue")

在拉取代码之前进行判断,对分支进行重新定义。


然后修改test分支下的代码,重新提交查看jenkins的日志。

能够成功得到分支名,并且拉取的代码也是test分支代码了。


这时候我们就可以把最开始定义的分支去掉了,因为它并不会起什么作用了。

五、增加构建描述信息

这个描述信息都可以通过[currentBuild](http://jenkins.coolops.cn/job/java-maven-test/pipeline-syntax/globals#currentBuild).description获取。
更多信息可以在流水线中的全局变量中获取。



那么对于自动触发流水线我们需要一些什么信息呢?我这里只列举几个

  • 提交者
  • 分支名

提交者我们依然可以从日志中获取,如下:



然后我们修改流水线配置,增加解析username步骤,如下

然后修改Jenkinsfile,如下:

  1. //String workspace "/opt/jenkins/workspace"
  2. // 配置共享库
  3. @Library('myLib')
  4. // 引用共享库中的方法
  5. def tools = new org.devops.tools()
  6. def build = new org.devops.build()
  7. def deploy = new org.devops.deploy()
  8. // 定义变量
  9. String buildType = env.buildType
  10. String buildShell = env.buildShell
  11. String deployHosts = env.deployHosts
  12. String branchName = "${env.branchName}"
  13. String srcUrl = "${env.srcUrl}"
  14. // 获取分支
  15. if ("${runOpts}" == "GiteePush"){
  16. branchName = branch - "refs/heads/"
  17. currentBuild.description = "构建者${userName} 分支${branchName}"
  18. }
  19. // Pipeline
  20. pipeline {
  21. // 指定在哪个节点上执行pipeline
  22. agent any
  23. // 获取自动安装或者手动安装的环境变量
  24. //tools {
  25. // maven "M2"
  26. //}
  27. // 指定运行的选项(可选)
  28. options {
  29. timestamps() // 日志会有时间
  30. skipDefaultCheckout() // 删除隐式checkout scm语句
  31. disableConcurrentBuilds() //禁止并行
  32. timeout(time:1,unit:'HOURS') //设置流水线超时时间
  33. }
  34. // 构建阶段
  35. stages {
  36. // 下载代码
  37. stage("GetCode"){
  38. // 步骤
  39. steps{
  40. // 设置步骤超时时间
  41. timeout(time:5,unit:'MINUTES'){
  42. script{
  43. tools.PrintMes(branchName, "blue")
  44. // println("获取代码")
  45. tools.PrintMes("获取代码",'red')
  46. checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'gitee', url: "${srcUrl}"]]])
  47. }
  48. }
  49. }
  50. }
  51. stage("Build"){
  52. steps{
  53. timeout(time:20,unit:'MINUTES'){
  54. script{
  55. // println("代码打包")
  56. tools.PrintMes("代码打包",'blue')
  57. build.Build(buildType,buildShell)
  58. }
  59. }
  60. }
  61. }
  62. stage("CodeScanner"){
  63. steps{
  64. timeout(time:30,unit:'MINUTES'){
  65. script{
  66. // println("代码扫描")
  67. tools.PrintMes("代码扫描",'green')
  68. }
  69. }
  70. }
  71. }
  72. }
  73. // 构建后的操作
  74. post {
  75. always {
  76. script{
  77. println("always:不论构建成功与否都会执行")
  78. }
  79. }
  80. success {
  81. script{
  82. println("success:只有构建成功才会执行")
  83. currentBuild.description += "\n构建成功!"
  84. // deploy.AnsibleDeploy("${deployHosts}","-m ping")
  85. }
  86. }
  87. failure {
  88. script{
  89. println("failure:只有构建失败才会执行")
  90. currentBuild.description += "\n构建失败!"
  91. }
  92. }
  93. aborted {
  94. script{
  95. println("aborted:只有取消构建才会执行")
  96. currentBuild.description += "\n构建取消!"
  97. }
  98. }
  99. }
  100. }

然后我们提交以下代码,测试效果如下:

六、优化push操作

到目前为止,基本的流水线功能已经跑起来了,但是还有一些问题,比如我们在码云上创建新的一条流水线,依然会触发Jenkins,因为我们创建流水线是一个push操作,触发器就默认的认为我们已经做了操作,就需要执行流水线了。但是很多情况我们并不需要其去执行流水线,所以我们要对其做一些过滤。


我们可以先新建一个分支,然后到Jenkins上去看看输出情况(注意观察before和after字段)。
(1)、新建分支

(2)、删除分支

(3)、普通提交(为了更好的做对比)

有没有发现很有意思的一点?当我们新建分支的时候before是"00000000",当我们删除分支的时候也是"00000000",这样我们就只要过滤掉before或after都是0的push请求即可。


其实在Generic Webhook的示例代码中也有说明,不过是用的gitlab示例。可以去研究研究,我这里也是仿照其写法来的。


首先我们定义几个变量,如下图所示:



然后定义正则表达式



然后我们测试新建分支,删除分支就不会触发jenkins了,正常commit可以正常触发。

七、配置邮件通知

Jenkins在做构建的时候有时候会成功,有时候会失败。但是对于操作者来说,我不想每次都登录Jenkins去查看结果,或者说操作者根本就没权限登录Jenkins查看结果,这时候我们要通知操作构建结果怎么办呢?我们可以配置邮件、钉钉等通知,只需要将构建结构发给操作者即可。下面我们以邮件通知来实验。

7.1、添加插件

这次用的插件是Email Extension Template

选择插件安装即可。

7.2、配置邮件服务器

系统管理--->系统设置
(1)、设置管理员邮箱地址

(2)、设置发件人信息

前提:到自己的邮箱服务器去申请授权码

7.3、添加shareLibrary

  1. package org.devops
  2. //定义邮件内容
  3. def SendEmail(status,emailUser){
  4. emailext body: """
  5. <!DOCTYPE html>
  6. <html>
  7. <head>
  8. <meta charset="UTF-8">
  9. </head>
  10. <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
  11. <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
  12. <tr>
  13. 本邮件由系统自动发出,无需回复!<br/>
  14. 各位同事,大家好,以下为${JOB_NAME}项目构建信息</br>
  15. <td><font color="#CC0000">构建结果 - ${status}</font></td>
  16. </tr>
  17. <tr>
  18. <td><br />
  19. <b><font color="#0B610B">构建信息</font></b>
  20. </td>
  21. </tr>
  22. <tr>
  23. <td>
  24. <ul>
  25. <li>项目名称:${JOB_NAME}</li>
  26. <li>构建编号:${BUILD_ID}</li>
  27. <li>构建状态: ${status} </li>
  28. <li>项目地址:<a href="${BUILD_URL}">${BUILD_URL}</a></li>
  29. <li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
  30. </ul>
  31. </td>
  32. </tr>
  33. <tr>
  34. </table>
  35. </body>
  36. </html> """,
  37. subject: "Jenkins-${JOB_NAME}项目构建信息 ",
  38. to: emailUser
  39. }

7.4、修改Jenkinsfile

修改后如下:

  1. //String workspace "/opt/jenkins/workspace"
  2. // 配置共享库
  3. @Library('myLib')
  4. // 引用共享库中的方法
  5. def tools = new org.devops.tools()
  6. def build = new org.devops.build()
  7. def deploy = new org.devops.deploy()
  8. def sendEmail = new org.devops.sendEmail()
  9. def runOpts
  10. // 定义变量
  11. String buildType = env.buildType
  12. String buildShell = env.buildShell
  13. String deployHosts = env.deployHosts
  14. String branchName = "${env.branchName}"
  15. String srcUrl = "${env.srcUrl}"
  16. // 获取分支
  17. if ("${runOpts}" == "GiteePush"){
  18. branchName = branch - "refs/heads/"
  19. currentBuild.description = "构建者${userName} 分支${branchName}"
  20. }else{
  21. currentBuild.description = "构建者${env.BUILD_USER_ID} 分支${branchName}"
  22. }
  23. // Pipeline
  24. pipeline {
  25. // 指定在哪个节点上执行pipeline
  26. agent any
  27. // 获取自动安装或者手动安装的环境变量
  28. //tools {
  29. // maven "M2"
  30. //}
  31. // 指定运行的选项(可选)
  32. options {
  33. timestamps() // 日志会有时间
  34. skipDefaultCheckout() // 删除隐式checkout scm语句
  35. disableConcurrentBuilds() //禁止并行
  36. timeout(time:1,unit:'HOURS') //设置流水线超时时间
  37. }
  38. // 构建阶段
  39. stages {
  40. // 下载代码
  41. stage("GetCode"){
  42. // 步骤
  43. steps{
  44. // 设置步骤超时时间
  45. timeout(time:5,unit:'MINUTES'){
  46. script{
  47. tools.PrintMes(branchName, "blue")
  48. // println("获取代码")
  49. tools.PrintMes("获取代码",'red')
  50. checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'gitee', url: "${srcUrl}"]]])
  51. }
  52. }
  53. }
  54. }
  55. stage("Build"){
  56. steps{
  57. timeout(time:20,unit:'MINUTES'){
  58. script{
  59. // println("代码打包")
  60. tools.PrintMes("代码打包",'blue')
  61. build.Build(buildType,buildShell)
  62. }
  63. }
  64. }
  65. }
  66. stage("CodeScanner"){
  67. steps{
  68. timeout(time:30,unit:'MINUTES'){
  69. script{
  70. // println("代码扫描")
  71. tools.PrintMes("代码扫描",'green')
  72. }
  73. }
  74. }
  75. }
  76. }
  77. // 构建后的操作
  78. post {
  79. always {
  80. script{
  81. println("always:不论构建成功与否都会执行")
  82. }
  83. }
  84. success {
  85. script{
  86. println("success:只有构建成功才会执行")
  87. currentBuild.description += "\n构建成功!"
  88. // deploy.AnsibleDeploy("${deployHosts}","-m ping")
  89. sendEmail.SendEmail("构建成功",toEmailUser)
  90. }
  91. }
  92. failure {
  93. script{
  94. println("failure:只有构建失败才会执行")
  95. currentBuild.description += "\n构建失败!"
  96. sendEmail.SendEmail("构建失败",toEmailUser)
  97. }
  98. }
  99. aborted {
  100. script{
  101. println("aborted:只有取消构建才会执行")
  102. currentBuild.description += "\n构建取消!"
  103. sendEmail.SendEmail("取消构建",toEmailUser)
  104. }
  105. }
  106. }
  107. }

7.5、修改Jenkins项目

我们要在Jenkins项目中添加一个变量来获取构建者的邮箱。

7.6、执行测试

上面步骤都完成以后,修改项目并提交进行测试,看邮件是否能够成功发出。如果是下面就表示邮件发送是OK了。

Jenkins联动码云自动匹配分支进行构建流水线的更多相关文章

  1. Jenkins部署码云SpringBoot项目到远程服务器

    本文是上一篇文章的后续,上一篇只是利用Jenkins部署项目到本地,并启动,本文是将项目部署到远程服务器并执行. 1.环境准备 1.1 安装插件 上一篇文章已经介绍了需要安装的应用及插件,这一篇还需要 ...

  2. Jenkins部署码云SpringBoot项目

    本文介绍jenkins如何从gitee上clone项目,然后使用maven打包并后台启动. 1.Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续 ...

  3. git 上传到码云

    创建分支 在码云里创建好分支 命令行进入项目所在的目录 显示码云上的分支 git pull 选择将要编辑的分支(index-fenzhi) git checkout index-fenzhi 查看分支 ...

  4. 使用Git GUI工具 上传本地仓库到 gitee码云仓库

    前言: 网上关于git的命令操作与使用很多教程和博客,在使用git工具时我发现有一个 git Gui 可视化工具,我觉得十分的亲切,由于我之前一直是使用svn作为版本控制管理工具,都是可视化操作,使用 ...

  5. Git 02: git管理码云代码仓库 + IDEA集成使用git

    Git项目搭建 创建工作目录与常用指令 工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文. 日常使用只要记住下图6个命令: ...

  6. 码云+jenkins+自动回复邮件

    码云和jenkins的配置流程在Gitee Jenkins Plugin上介绍的很仔细. 附上码云官方Gitee Jenkins Plugin的介绍: https://gitee.com/help/a ...

  7. Linux、Debian、Jenkins、GIT、Nginx、码云安装,自动化部署前后端分离项目

    1.安装Jenkins i:下载Jenkins安装包(war文件):https://jenkins.io/download/ ii:这里采用Tomcat的war包方式安装,讲下载好的安装包放到Tomc ...

  8. 码云配置webhooks自动触发拉取代码

    webhooks的使用 码云和github的钩子叫webhooks 每次您 push 代码后,都会给远程 HTTP URL 发送一个 POST 请求 码云项目管理页面的webhooks设置: http ...

  9. 使用码云,GitHub进行版本控制,并通过WebHook进行自动部署

    我们通常需要在 PUSH 代码到远程仓库时,线上环境会自动进行代码同步,这时候就需要用到WebHook,它会自动回调我们设定的http地址. 通过请求我们自已编写的脚本,来拉取代码,实现与远程仓库代码 ...

随机推荐

  1. compareAndSet() 注意点

    compareAndSet()与weakCompareAndSet()是有条件的修改程序的方法,这两个方法都要取用两个参数:在方法启动时预期数据所具有的的值,以及要把数据所设定成的值.它们都只会在变量 ...

  2. .NET Core技术研究-主机

    前一段时间,和大家分享了 ASP.NET Core技术研究-探秘Host主机启动过程 但是没有深入说明主机的设计.今天整理了一下主机的一些知识,结合先前的博文,完整地介绍一下.NET Core的主机的 ...

  3. AJ学IOS 之微博项目实战(12)发送微博自定义工具条代理实现点击事件

    AJ分享,必须精品 一:效果 二:封装好的工具条 NYComposeToolbar.h 带代理方法 #import <UIKit/UIKit.h> typedef enum { NYCom ...

  4. [译]使用开发工具来调试 Beta 版 WebView

    自2014年以来,Android WebView 已经作为一个可更新的系统组件铺平了道路,为 Android 应用程序和用户提供了稳定性和性能改进.现代网络平台功能和安全补丁. 然而,更新可能是一把双 ...

  5. Python openpyxl使用操作和openpyxl操作

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...

  6. Video tagging systems based on DNNs

    Need: With the ever-growth large-scale video in the mobile phone, so what will everyone get from the ...

  7. 1327C - Game with Chips (构造)

    题目大意:一个n*m的棋盘上有k个棋子,k个棋子相互关联,可以一起向上向下向左向右,当碰到边界时,如果继续移动会发生越界,那么该棋子会保持不动,其余棋子继续移动.问能否在2*n*m的移动次数内,使各个 ...

  8. 今天探究的CSS属性是box-sizing;

    首先BOX-SIZING属性是CSS3的属性: 语法: box-sizing : content-box || border-box || inherit 取值说明 1.content-box:此值为 ...

  9. Python 【面试强化宝典】

    四大数据类型的常用方法 列表常用方法 #1. append 用于在列表末尾追加新的对象 a = [1,2,3] a.append(4) #the result : [1, 2, 3, 4] #2. c ...

  10. [护网杯2018] easy_laravel

    前言 题目环境 buuoj 上的复现,和原版的题目不是完全一样.原题使用的是 nginx + mysql 而 buuoj 上的是 apache + sqlite composer 这是在 PHP5.3 ...