Jenkins联动码云自动匹配分支进行构建流水线
一、安装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了。
如下:
//String workspace "/opt/jenkins/workspace"
// 配置共享库
@Library('myLib')
// 引用共享库中的方法
def tools = new org.devops.tools()
def build = new org.devops.build()
def deploy = new org.devops.deploy()
// 定义变量
String buildType = env.buildType
String buildShell = env.buildShell
String deployHosts = env.deployHosts
String branchName = "${env.branchName}"
String srcUrl = "${env.srcUrl}"
// 获取分支
if ("${runOpts}" == "GiteePush"){
branchName = branch - "refs/heads/"
}
// Pipeline
pipeline {
// 指定在哪个节点上执行pipeline
agent any
// 获取自动安装或者手动安装的环境变量
//tools {
// maven "M2"
//}
// 指定运行的选项(可选)
options {
timestamps() // 日志会有时间
skipDefaultCheckout() // 删除隐式checkout scm语句
disableConcurrentBuilds() //禁止并行
timeout(time:1,unit:'HOURS') //设置流水线超时时间
}
// 构建阶段
stages {
// 下载代码
stage("GetCode"){
// 步骤
steps{
// 设置步骤超时时间
timeout(time:5,unit:'MINUTES'){
script{
tools.PrintMes(branchName, "blue")
// println("获取代码")
tools.PrintMes("获取代码",'red')
checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'gitee', url: "${srcUrl}"]]])
}
}
}
}
stage("Build"){
steps{
timeout(time:20,unit:'MINUTES'){
script{
// println("代码打包")
tools.PrintMes("代码打包",'blue')
build.Build(buildType,buildShell)
}
}
}
}
stage("CodeScanner"){
steps{
timeout(time:30,unit:'MINUTES'){
script{
// println("代码扫描")
tools.PrintMes("代码扫描",'green')
}
}
}
}
}
// 构建后的操作
post {
always {
script{
println("always:不论构建成功与否都会执行")
}
}
success {
script{
println("success:只有构建成功才会执行")
currentBuild.description = "\n构建成功!"
// deploy.AnsibleDeploy("${deployHosts}","-m ping")
}
}
failure {
script{
println("failure:只有构建失败才会执行")
currentBuild.description = "\n构建失败!"
}
}
aborted {
script{
println("aborted:只有取消构建才会执行")
currentBuild.description = "\n构建取消!"
}
}
}
}
其中修改的地方是:
// 获取分支
tools.PrintMes("获取分支名","green")
if ("${runOpts}" == "GiteePush"){
branchName = branch - "refs/heads/"
}
tools.PrintMes(branchName, "blue")
在拉取代码之前进行判断,对分支进行重新定义。
然后修改test分支下的代码,重新提交查看jenkins的日志。
能够成功得到分支名,并且拉取的代码也是test分支代码了。
这时候我们就可以把最开始定义的分支去掉了,因为它并不会起什么作用了。
五、增加构建描述信息
这个描述信息都可以通过[currentBuild](http://jenkins.coolops.cn/job/java-maven-test/pipeline-syntax/globals#currentBuild).description
获取。
更多信息可以在流水线中的全局变量中获取。
那么对于自动触发流水线我们需要一些什么信息呢?我这里只列举几个
- 提交者
- 分支名
提交者我们依然可以从日志中获取,如下:
然后我们修改流水线配置,增加解析username步骤,如下
然后修改Jenkinsfile,如下:
//String workspace "/opt/jenkins/workspace"
// 配置共享库
@Library('myLib')
// 引用共享库中的方法
def tools = new org.devops.tools()
def build = new org.devops.build()
def deploy = new org.devops.deploy()
// 定义变量
String buildType = env.buildType
String buildShell = env.buildShell
String deployHosts = env.deployHosts
String branchName = "${env.branchName}"
String srcUrl = "${env.srcUrl}"
// 获取分支
if ("${runOpts}" == "GiteePush"){
branchName = branch - "refs/heads/"
currentBuild.description = "构建者${userName} 分支${branchName}"
}
// Pipeline
pipeline {
// 指定在哪个节点上执行pipeline
agent any
// 获取自动安装或者手动安装的环境变量
//tools {
// maven "M2"
//}
// 指定运行的选项(可选)
options {
timestamps() // 日志会有时间
skipDefaultCheckout() // 删除隐式checkout scm语句
disableConcurrentBuilds() //禁止并行
timeout(time:1,unit:'HOURS') //设置流水线超时时间
}
// 构建阶段
stages {
// 下载代码
stage("GetCode"){
// 步骤
steps{
// 设置步骤超时时间
timeout(time:5,unit:'MINUTES'){
script{
tools.PrintMes(branchName, "blue")
// println("获取代码")
tools.PrintMes("获取代码",'red')
checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'gitee', url: "${srcUrl}"]]])
}
}
}
}
stage("Build"){
steps{
timeout(time:20,unit:'MINUTES'){
script{
// println("代码打包")
tools.PrintMes("代码打包",'blue')
build.Build(buildType,buildShell)
}
}
}
}
stage("CodeScanner"){
steps{
timeout(time:30,unit:'MINUTES'){
script{
// println("代码扫描")
tools.PrintMes("代码扫描",'green')
}
}
}
}
}
// 构建后的操作
post {
always {
script{
println("always:不论构建成功与否都会执行")
}
}
success {
script{
println("success:只有构建成功才会执行")
currentBuild.description += "\n构建成功!"
// deploy.AnsibleDeploy("${deployHosts}","-m ping")
}
}
failure {
script{
println("failure:只有构建失败才会执行")
currentBuild.description += "\n构建失败!"
}
}
aborted {
script{
println("aborted:只有取消构建才会执行")
currentBuild.description += "\n构建取消!"
}
}
}
}
然后我们提交以下代码,测试效果如下:
六、优化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
package org.devops
//定义邮件内容
def SendEmail(status,emailUser){
emailext body: """
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
本邮件由系统自动发出,无需回复!<br/>
各位同事,大家好,以下为${JOB_NAME}项目构建信息</br>
<td><font color="#CC0000">构建结果 - ${status}</font></td>
</tr>
<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
}
7.4、修改Jenkinsfile
修改后如下:
//String workspace "/opt/jenkins/workspace"
// 配置共享库
@Library('myLib')
// 引用共享库中的方法
def tools = new org.devops.tools()
def build = new org.devops.build()
def deploy = new org.devops.deploy()
def sendEmail = new org.devops.sendEmail()
def runOpts
// 定义变量
String buildType = env.buildType
String buildShell = env.buildShell
String deployHosts = env.deployHosts
String branchName = "${env.branchName}"
String srcUrl = "${env.srcUrl}"
// 获取分支
if ("${runOpts}" == "GiteePush"){
branchName = branch - "refs/heads/"
currentBuild.description = "构建者${userName} 分支${branchName}"
}else{
currentBuild.description = "构建者${env.BUILD_USER_ID} 分支${branchName}"
}
// Pipeline
pipeline {
// 指定在哪个节点上执行pipeline
agent any
// 获取自动安装或者手动安装的环境变量
//tools {
// maven "M2"
//}
// 指定运行的选项(可选)
options {
timestamps() // 日志会有时间
skipDefaultCheckout() // 删除隐式checkout scm语句
disableConcurrentBuilds() //禁止并行
timeout(time:1,unit:'HOURS') //设置流水线超时时间
}
// 构建阶段
stages {
// 下载代码
stage("GetCode"){
// 步骤
steps{
// 设置步骤超时时间
timeout(time:5,unit:'MINUTES'){
script{
tools.PrintMes(branchName, "blue")
// println("获取代码")
tools.PrintMes("获取代码",'red')
checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'gitee', url: "${srcUrl}"]]])
}
}
}
}
stage("Build"){
steps{
timeout(time:20,unit:'MINUTES'){
script{
// println("代码打包")
tools.PrintMes("代码打包",'blue')
build.Build(buildType,buildShell)
}
}
}
}
stage("CodeScanner"){
steps{
timeout(time:30,unit:'MINUTES'){
script{
// println("代码扫描")
tools.PrintMes("代码扫描",'green')
}
}
}
}
}
// 构建后的操作
post {
always {
script{
println("always:不论构建成功与否都会执行")
}
}
success {
script{
println("success:只有构建成功才会执行")
currentBuild.description += "\n构建成功!"
// deploy.AnsibleDeploy("${deployHosts}","-m ping")
sendEmail.SendEmail("构建成功",toEmailUser)
}
}
failure {
script{
println("failure:只有构建失败才会执行")
currentBuild.description += "\n构建失败!"
sendEmail.SendEmail("构建失败",toEmailUser)
}
}
aborted {
script{
println("aborted:只有取消构建才会执行")
currentBuild.description += "\n构建取消!"
sendEmail.SendEmail("取消构建",toEmailUser)
}
}
}
}
7.5、修改Jenkins项目
我们要在Jenkins项目中添加一个变量来获取构建者的邮箱。
7.6、执行测试
上面步骤都完成以后,修改项目并提交进行测试,看邮件是否能够成功发出。如果是下面就表示邮件发送是OK了。
Jenkins联动码云自动匹配分支进行构建流水线的更多相关文章
- Jenkins部署码云SpringBoot项目到远程服务器
本文是上一篇文章的后续,上一篇只是利用Jenkins部署项目到本地,并启动,本文是将项目部署到远程服务器并执行. 1.环境准备 1.1 安装插件 上一篇文章已经介绍了需要安装的应用及插件,这一篇还需要 ...
- Jenkins部署码云SpringBoot项目
本文介绍jenkins如何从gitee上clone项目,然后使用maven打包并后台启动. 1.Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续 ...
- git 上传到码云
创建分支 在码云里创建好分支 命令行进入项目所在的目录 显示码云上的分支 git pull 选择将要编辑的分支(index-fenzhi) git checkout index-fenzhi 查看分支 ...
- 使用Git GUI工具 上传本地仓库到 gitee码云仓库
前言: 网上关于git的命令操作与使用很多教程和博客,在使用git工具时我发现有一个 git Gui 可视化工具,我觉得十分的亲切,由于我之前一直是使用svn作为版本控制管理工具,都是可视化操作,使用 ...
- Git 02: git管理码云代码仓库 + IDEA集成使用git
Git项目搭建 创建工作目录与常用指令 工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文. 日常使用只要记住下图6个命令: ...
- 码云+jenkins+自动回复邮件
码云和jenkins的配置流程在Gitee Jenkins Plugin上介绍的很仔细. 附上码云官方Gitee Jenkins Plugin的介绍: https://gitee.com/help/a ...
- Linux、Debian、Jenkins、GIT、Nginx、码云安装,自动化部署前后端分离项目
1.安装Jenkins i:下载Jenkins安装包(war文件):https://jenkins.io/download/ ii:这里采用Tomcat的war包方式安装,讲下载好的安装包放到Tomc ...
- 码云配置webhooks自动触发拉取代码
webhooks的使用 码云和github的钩子叫webhooks 每次您 push 代码后,都会给远程 HTTP URL 发送一个 POST 请求 码云项目管理页面的webhooks设置: http ...
- 使用码云,GitHub进行版本控制,并通过WebHook进行自动部署
我们通常需要在 PUSH 代码到远程仓库时,线上环境会自动进行代码同步,这时候就需要用到WebHook,它会自动回调我们设定的http地址. 通过请求我们自已编写的脚本,来拉取代码,实现与远程仓库代码 ...
随机推荐
- Bat 脚本学习 (基础篇)
[转]Bat 脚本学习 2015-01-05 14:13 115人阅读 评论(0) 收藏 举报 基础部分: ============================================== ...
- python填写金数据
''' 将 main 中的{url}改为真 url 将 setd_data中 {姓名} {纬度} {经度} {地址} 改为确切数据 数据自行参考post 结果判断基于响应中是否包含“谢谢参与”字样 ' ...
- CodeForces - 913C (贪心)
点完菜,他们发现好像觉得少了点什么? 想想马上就要回老家了某不愿透露姓名的林姓学长再次却陷入了沉思......... 他默默的去前台打算点几瓶二锅头. 他发现菜单上有n 种不同毫升的酒. 第 i 种有 ...
- idea创建springboot工程,总出现响应超时问题,或者无法连接http://start.spring.io导致创建失败
问题描述如下: idea创建springboot工程,总出现响应超时问题,或者无法连接http://start.spring.io导致创建失败 从我出现此类问题几次的解决方案 依照解决效率分为一下三种 ...
- api测试用例(编写思路)
在API的自动化测试维度中,测试维度分为两个维度,一个是单独的对API的验证,客户端发送一个请求后,服务端得到客户端的请求并且响应回复给客户端: 另外一个维度是基于业务场景的测试,基于业务场景的也就是 ...
- selenium 执行js代码
获取一个input输入框的值: JavascriptExecutor js =(JavascriptExecutor) driver; merchatName=js.executeScript(&qu ...
- python+selenium实现网页自动化与爬虫技术
举例某购物网站,通过selenium与python,实现主页上商品的搜索,并将信息爬虫保存至本地excel表内. 一.python环境与selenium环境安装 python在官网下载并安装并且设置环 ...
- Springboot:员工管理之首页(十(2))
访问首页可以通过两种方式: 1:编写controller 2:自定义扩展视图解析器(推荐使用) 1:编写Controller com\springboot\controller\IndexContro ...
- 图解AVL树
1:AVL树简介 二叉搜索树在一般情况下其搜索的时间复杂度为O(logn),但某些特殊情况下会退化为链表,导致树的高度变大且搜索的时间复杂度变为O(n),发挥不出树这种数据结构的优势,因此平衡二叉树便 ...
- vue原生表格怎样实现动态列及表格数据下载
最近项目经常用到带有合并效果以及动态列的表格,而翻阅iview和element-ui官网没有找到合适的(也有可能自己的水平有限,不会改写),所以只好自己用原生表格写了一个,具体效果如下: 这个表格右侧 ...