GITLAB-SSO用户认证

安装GitLab Authentication插件

为了避免权限上的报错先设置权限

gitlab创建app

jenkins设置

验证

这时候也可以在 gitlab 上注册账户直接登入到 jenkins

项目准备和流水线调试

准备代码在github中下载地址: https:/github.com/zeyangli/simple-java-maven-app.git

jenkinsfile#!groovy
@Library('jenkinslib@master') _ //func from sharelibrary
def build = new org.devops.build()
def deploy = new org.devops.deploy()
def tools = new org.devops.tools()           //引用共享库设置的函数//env
String buildType = "${env.buildType}"
String buildShell = "${env.buildShell}"
String deployHosts = "${env.deployHosts}"
//String deployHosts = "server1.server2"
String srcUrl = "${env.srcUrl}"            //设置变量
String branchName = "${branchName}"//pipeline
pipeline {agent { node { label "master"}}stages{stage("CheckOut"){steps{script{//使用引入的字体修改tools.PrintMes("获取代码","green")//用jenkins 流水线语法生成checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], extensions: [], userRemoteConfigs: [[credentialsId: '9f0c031f-924e-4a84-a9ea-4957d27a9d54', url: "${srcUrl}"]]])}}}stage("Build"){steps{script{tools.PrintMes("执行打包","green")build.Build(buildType,buildShell)deploy.AnsibleDeploy("${deployHosts}","-m  ping")}}}}
}

已生成jar包

WebHook集成

Jenkins配置-安装Generic Webhook Trigger和GitLab插件

设置webhook

Jenkins配置

gitlab 进行 webhook设置



Hook executed successfully: HTTP 200

提交流水线优化一获取提交分支名称

目的:通过Jenkins 参数、shell、git实现单job自动切换不同的分支

增加获取hook参数 分支名称

jenkinsfile

#!groovy
@Library('jenkinslib@master') _
//func from sharelibrary
def build = new org.devops.build()
def deploy = new org.devops.deploy()
def tools = new org.devops.tools()
def runOpts
//env
String buildType = "${env.buildType}"
String buildShell = "${env.buildShell}"
String deployHosts = "${env.deployHosts}"
//String deployHosts = "server1.server2"
String srcUrl = "${env.srcUrl}"
String branchName = "${branchName}"
//pipeline
pipeline {agent { node { label "master"}}stages{stage("CheckOut"){steps{script{//判断如果获取到gitpush的信息,重新定义分支名if ("${runOpts}" == "GitlabPush"){branchName = branch - "refs/heads/"}println("${branchName}")tools.PrintMes("获取代码","green")checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], extensions: [], userRemoteConfigs: [[credentialsId: '9f0c031f-924e-4a84-a9ea-4957d27a9d54', url: "${srcUrl}"]]])}}}}
}

这样设置,就可以实现不同分支提交代码,jenkins获取到gitlab推送的json信息,打印对应的分支代码

提交流水线优化一增加构建描述信息

目的: 区分信息

流水线添加描述 流水线语法—全局变量参考—currentBuild—description

jenkins设置

变量名称: currentBuild.description

jenkinsfile
在pipeline外增加 currentBuild.description 描述信息if ("${runOpts}" == "GitlabPush"){branchName = branch - "refs/heads/"println("${branchName}")//currentBuild.description = "构建用户:${userName} 分支:${branchName}"
}//pipeline

检查

提交流水线优化一变更commit状态

目标:在gitlab中可以看到jenkins的运行状态


方案:通过POST gitlabAPI接口,jenkins构建结束后返回相应的状态到gitlab

官方文档地址: https://docs.gitlab.com/ee/api/commits.html

curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/17/statuses/18f3e63d05582537db6d183d9d557be09e1f90c8?state=success"
# 编辑:更改提交状态,然后HTTP发送请求
# 解释:在gitlab上创建了一个token,然后存在jenkins中,把凭据的数值赋值给这个变量,最后请求的时候加到head里面!

引用共享仓库(gitlab.groovy)

package  org.devops//(1)封装HTTP请求
def HttpReq(reqType,reqUrl,reqBody){//1)  Gitlab Api地址def gitServer = "http://121.40.207.133:8010/api/v4"//2)  gitlab上创建一个凭据,存在给jenkins上,凭据名字(gitlab-token),赋值给gitlabToken变量withCredentials([string(credentialsId: 'gitlab-token', variable: 'gitlabToken')]) {//  发送HTTP请求-->请求类型、等等信息-->请求的时候加到Header里面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
}//(2)更改提交状态-->利用HTTP的请求def ChangeCommitStatus(projectId,commitSha,status){//参照:curl --request POST --header "PRIVATE-TOKEN: <your_access_token>"//"https://gitlab.example.com/api/v4/projects/17/statuses/18f3e63d05582537db6d183d9d557be09e1f90c8?state=success"//1)  定义CommitApicommitApi = "projects/${projectId}/statuses/${commitSha}?state=${status}"//2)  发送HTTP的POST请求//response = HttpReq("POST",commitApi,'').contentresponse = HttpReq("POST",commitApi,'')println("${response}")
}

Jenkinsfile

#!groovy
@Library('jenkinslib@master') _ //func from sharelibrary
def build = new org.devops.build()
def deploy = new org.devops.deploy()
def tools = new org.devops.tools()
def gitlab = new org.devops.gitlab()//env
String buildType = "${env.buildType}"
String buildShell = "${env.buildShell}"
String deployHosts = "${env.deployHosts}"
String srcUrl = "${env.srcUrl}"
String branchName = "${branchName}"if ("${runOpts}" == "GitlabPush"){branchName = branch - "refs/heads/"println("${branchName}")currentBuild.description = "构建用户:${userName} 分支:${branchName}"//函数格式为ChangeCommitStatus(projectId,commitSha.status) gitlab.ChangeCommitStatus(projectId,commitSha,"running")
}//pipeline
pipeline {agent { node { label "master"}}stages{stage("CheckOut"){steps{script{tools.PrintMes("获取代码","green")checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], extensions: [], userRemoteConfigs: [[credentialsId: '9f0c031f-924e-4a84-a9ea-4957d27a9d54', url: "${srcUrl}"]]])}}}stage("Build"){steps{script{tools.PrintMes("执行打包","green")build.Build(buildType,buildShell)deploy.AnsibleDeploy("${deployHosts}","-m  ping")}}}}post {always {script{println("always")}}aborted {script{println("aborted")gitlab.ChangeCommitStatus(projectId,commitSha,"canceled")}}success {script{println("success")gitlab.ChangeCommitStatus(projectId,commitSha,"success")}}failure {script{println("failure")gitlab.ChangeCommitStatus(projectId,commitSha,"failure")}}}
}

根据Jenkinsfile 添加变量

测试

Contributing variables:branch = refs/heads/mastercommitSha = a8797285168116c5954275e6264c1bfc1966f595projectId = 7runOpts = GitlabPushrunOpts_0 = GitlabPushuserName = bianmc...

提交流水线优化一过滤特殊push请求(创建branch)

目的:gitlab创建支线后会自动进行push,随即触发了jenkins构建,通过gitlab请求变量过滤这个操作

Generic Webhook Trigger 触发构建插件代码中有过滤的正则

根据给定的过滤器配置为文本和过滤器配置为表达式来配置jenkins

    Given the following generic variables are configured:| variable        | expression               | expressionType  | defaultValue | regexpFilter  || object_kind     | $.object_kind            | JSONPath        |              |               || before          | $.before                 | JSONPath        |              |               || after           | $.after                  | JSONPath        |              |               || ref             | $.ref                    | JSONPath        |              |               || git_ssh_url     | $.repository.git_ssh_url | JSONPath        |              |               |Given filter is configured with text: $object_kind $before $afterGiven filter is configured with expression: ^push\s(?!0{40}).{40}\s(?!0{40}).{40}$


提交流水线优化一构建失败邮件通知

jenkins 插件 Email Extension


gitlab设置

创建邮件共享库 toemail.groovy

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://****:28080/static/45c24286/images/headshot.jpeg"><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}

jenkinsfile

#!groovy@Library('jenkinslib@master') _ //func from sharelibrary
def build = new org.devops.build()
def deploy = new org.devops.deploy()
def tools = new org.devops.tools()
def gitlab = new org.devops.gitlab()
def toemail = new org.devops.toemail()//env
String buildType = "${env.buildType}"
String buildShell = "${env.buildShell}"
String deployHosts = "${env.deployHosts}"
//String deployHosts = "server1.server2"
String srcUrl = "${env.srcUrl}"
String branchName = "${branchName}"if ("${runOpts}" == "GitlabPush"){branchName = branch - "refs/heads/"println("${branchName}")currentBuild.description = "构建用户:${userName} 分支:${branchName}"//函数格式为ChangeCommitStatus(projectId,commitSha.status) gitlab.ChangeCommitStatus(projectId,commitSha,"running")env.runOpts = "GitlabPush"
} else {userEmail = "644079826@qq.com"
}//pipeline
pipeline {agent { node { label "master"}}stages{stage("CheckOut"){steps{script{tools.PrintMes("获取代码","green")checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], extensions: [], userRemoteConfigs: [[credentialsId: '9f0c031f-924e-4a84-a9ea-4957d27a9d54', url: "${srcUrl}"]]])}}}stage("Build"){steps{script{tools.PrintMes("执行打包","green")build.Build(buildType,buildShell)deploy.AnsibleDeploy("${deployHosts}","-m  ping")}}}}post {always {script{println("always")}}aborted {script{println("aborted")gitlab.ChangeCommitStatus(projectId,commitSha,"canceled")toemail.Email("流水线被取消了!!!",userEmail)}}success {script{println("success")gitlab.ChangeCommitStatus(projectId,commitSha,"success")toemail.Email("流水线成功",userEmail)}}failure {script{println("failure")gitlab.ChangeCommitStatus(projectId,commitSha,"failure")//邮件提醒toemail.Email("流水线失败了!!!",userEmail)}}}
}

测试

流水线优化-gitlab合并策略优化

目的:分支合并后不再出发jenkins构建(如果最新流水线未成功或仍在运行,则无法合并合并请求。)

DevOps-jenkins-流水线优化相关推荐

  1. Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践课程

    讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...

  2. Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践

    讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...

  3. Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践教程

    讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...

  4. Jenkins 自动化部署流水线优化经验

    Jenkins 自动化部署流水线优化经验 1.1 跳过测试类 1.2 使用较为稳定的jenkins 企业长期支持版本 1.3 限制Jenkins 使用内存大小 这篇博文主要总结下在生产环境使用Jenk ...

  5. Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践教程|2020全新制作|端到端研发效能提升...

    讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...

  6. 【云原生】DevOps(六):Jenkins流水线

    本文目录: 一.Jenkins流水线任务介绍 二. Jenkins流水线任务 1. 构建Jenkins流水线任务 2. Groovy脚本 3.Jenkinsfile实现 三.Jenkins流水线任务实 ...

  7. 从零到一构建CI/CD的DevOps自动化流水线,需要考虑的开源项目

    构建CI/CD的DevOps自动化流水线的步骤 1.DevOps 和 CI/CD 流水线的简要介绍 2 构建CI/CD流水线需考虑的步骤 第一步:CI/CD 框架 第二步:源代码控制管理 第三步:自动 ...

  8. go Jenkins流水线极速打包镜像上传

    在使用Jenkins流水线进行打包时,发现直接使用Dockerfile去构建一个java或者go程序会非常慢,go好一点也要一分钟,java则需要3分钟以上.Java&Gradle极速打包设置 ...

  9. Jenkins 流水线 获取git 分支列表_DevOps流水线实践教程|端到端研发效能提升

    讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...

  10. jenkins流水线(jenkinsfile)详解,保姆式教程

    jenkins流水线(jenkinsfile)详解 在学习本篇文章的时候,可以去看看jenkins官网的文档,jenkins官网支持中文,观看十分便捷 此教程使用的是gitee+docker+jenk ...

最新文章

  1. Python 数据类型:列表
  2. python爬虫设置下拉框的值_python爬虫:BeautifulSoup 使用select方法的使用
  3. etcd分布式之分布式通知与协调
  4. vscode里好用的html插件_知乎口碑最好的六大PPT插件分享!用好插件,效率倍增...
  5. Dataset之iGAN:iGAN数据集的简介、安装、使用方法之详细攻略
  6. dbcp连接mysql,8小时会自动断开连接
  7. Python学习心得(二) : 更新列表
  8. Scala中的延迟初始化(Lazy vals)
  9. stringBuffer、StringBuilder、排序、Arrays、Jdk1.5新特性(java基础知识十三)
  10. 处于停机等非正常状态_一文聊透 Dubbo 优雅停机
  11. c语言中 调用函数除函数名外,【单选题】在 C 语言中 , 调用函数除函数名外 , 还必须有 ( ). (10.0分) A. 函数预说明 B. 实际参数 C. ( ) D. 函数返回值...
  12. SAP BW顾问如何保持市场竞争力?
  13. nginx lua获取客户端ip
  14. Active Directory Get User's groups using LDAP
  15. 可用的码支付系统源码
  16. python地震数据处理_python地震数据可视化详解
  17. 域——windows服务器域详解
  18. matlab谢尔宾斯三角_几何画板教程:谢尔宾斯基三角形的制作
  19. ReactNative Ios打包流程
  20. Windows python pip换源不生效(window11系统),以及pip下载库包报错 because normal site-packages is not writeable

热门文章

  1. 后部发声-----学会英语的发音方法
  2. 同时设置min-height和max-height后el-scrollbar滚动监听失效?
  3. 2018十大国产佳片
  4. 利用集合进行数组的排序
  5. 使用向日葵进行远程办公,手机电脑都可以时时刻刻使用远端电脑
  6. mysql之order by自定义排序规则进行排序(转载)
  7. 一个可以在线编写matlab的网站,你了解吗?
  8. 【Unity入门】24.碰撞检测
  9. 7-148 试试多线程 (10 分)
  10. via浏览器云同步国内服务器网页,Via浏览器