DevOps-jenkins-流水线优化
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-流水线优化相关推荐
- Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践课程
讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...
- Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践
讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...
- Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践教程
讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...
- Jenkins 自动化部署流水线优化经验
Jenkins 自动化部署流水线优化经验 1.1 跳过测试类 1.2 使用较为稳定的jenkins 企业长期支持版本 1.3 限制Jenkins 使用内存大小 这篇博文主要总结下在生产环境使用Jenk ...
- Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践教程|2020全新制作|端到端研发效能提升...
讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...
- 【云原生】DevOps(六):Jenkins流水线
本文目录: 一.Jenkins流水线任务介绍 二. Jenkins流水线任务 1. 构建Jenkins流水线任务 2. Groovy脚本 3.Jenkinsfile实现 三.Jenkins流水线任务实 ...
- 从零到一构建CI/CD的DevOps自动化流水线,需要考虑的开源项目
构建CI/CD的DevOps自动化流水线的步骤 1.DevOps 和 CI/CD 流水线的简要介绍 2 构建CI/CD流水线需考虑的步骤 第一步:CI/CD 框架 第二步:源代码控制管理 第三步:自动 ...
- go Jenkins流水线极速打包镜像上传
在使用Jenkins流水线进行打包时,发现直接使用Dockerfile去构建一个java或者go程序会非常慢,go好一点也要一分钟,java则需要3分钟以上.Java&Gradle极速打包设置 ...
- Jenkins 流水线 获取git 分支列表_DevOps流水线实践教程|端到端研发效能提升
讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...
- jenkins流水线(jenkinsfile)详解,保姆式教程
jenkins流水线(jenkinsfile)详解 在学习本篇文章的时候,可以去看看jenkins官网的文档,jenkins官网支持中文,观看十分便捷 此教程使用的是gitee+docker+jenk ...
最新文章
- Python 数据类型:列表
- python爬虫设置下拉框的值_python爬虫:BeautifulSoup 使用select方法的使用
- etcd分布式之分布式通知与协调
- vscode里好用的html插件_知乎口碑最好的六大PPT插件分享!用好插件,效率倍增...
- Dataset之iGAN:iGAN数据集的简介、安装、使用方法之详细攻略
- dbcp连接mysql,8小时会自动断开连接
- Python学习心得(二) : 更新列表
- Scala中的延迟初始化(Lazy vals)
- stringBuffer、StringBuilder、排序、Arrays、Jdk1.5新特性(java基础知识十三)
- 处于停机等非正常状态_一文聊透 Dubbo 优雅停机
- c语言中 调用函数除函数名外,【单选题】在 C 语言中 , 调用函数除函数名外 , 还必须有 ( ). (10.0分)
A. 函数预说明 B. 实际参数 C. ( ) D. 函数返回值...
- SAP BW顾问如何保持市场竞争力?
- nginx lua获取客户端ip
- Active Directory Get User's groups using LDAP
- 可用的码支付系统源码
- python地震数据处理_python地震数据可视化详解
- 域——windows服务器域详解
- matlab谢尔宾斯三角_几何画板教程:谢尔宾斯基三角形的制作
- ReactNative Ios打包流程
- Windows python pip换源不生效(window11系统),以及pip下载库包报错 because normal site-packages is not writeable