首页 > 其他分享 >jenkins 配合 GitLab 实现分支的自动合并、自动创建 Tag

jenkins 配合 GitLab 实现分支的自动合并、自动创建 Tag

时间:2023-07-27 16:56:20浏览次数:43  
标签:git GitLab echo Job Tag 自动 master Jenkins 分支

背景

GitFlow工作流简介

Gitflow工作流定义了一个围绕项目发布的严格分支模型,它会相对复杂一点,但提供了用于一个健壮的用于管理大型项目的框架,非常适合用来管理大型项目的发布和维护。 贯穿整个开发周期,masterdevelop分支是一直存在的,master分支可以被视为稳定的分支, 而develop分支是相对稳定的分支,特性开发会在feature分支上进行,发布会在release分支上进行,而bug修复则会在hotfix分支上进行,这样也有效避免了不同类型的开发工作在代码层级的耦合和干扰。

GitFlow工作流优化

  • hotfix和release的结果都要合并到master和develop中,为什么?因为它们的修改结果将持续影响这后续的开发和维护,必须合并以保证代码的一致性。

  • 当线上项目需要版本回退,或者需要简单记录迭代版本时,我们常在master分支上打上 Tag 标签,例如:

    • 功能发布:release_20190101_当月版本数
    • BUG修复:hotfix_20190101_修复次数

本文基于GitFlow工作流,将利用Jenkins配合GitLab实现以下自动化任务

  • master分支代码更新后,自动将代码合并到develop分支
  • master分支代码更新后,自动在master分支提交中打 tag

Jenkins自动任务Job的创建

Jenkins是一个用Java编写的开源的持续集成工具,可以与Git打通,监听Git的merge, push事件,触发执行Jenkins的指定任务(job),例如执行单元测试。更多的是:当代码变更时可以触发打包部署、性能测试、接口测试、监控、日志分析等。项目发布的任何一个环节都可自动完成,无需太多的人工干预,有利于减少重复过程以节省时间和工作量等。

如何创建Jenkins Job

下面列出自动任务Jenkins Job的创建过程,供参考。创建过程如下:

  • 首先,创建一个任务,输入名称,选择“构建一个自由风格的软件项目” 确定即可。

  • General:填写项目名称及描述;Label Expression 是在Jenkins admin 中配置的节点(container, node),一个Label Expression 是一组docker,当多个不同的Job同时执行的时候,可以实现并行。

  • 源码管理:在Repository URL中填写GitLab中的项目地址;Branches to build此处的Branch Specifier是触发Jenkins Job时由Jenkins自动拉取的代码的分支,可以填写一个固定的指定分支,如master,也可以写正则表达式。另外,也可以填写${gitlabSourceBranch}。如果填写${gitlabSourceBranch},表示从git读取Merge Request的源分支,使用该变量,则不能手工点击Job的“立即构建”执行job了,因为读取不到这个变量只能通过git push事件触发了。具体可以根据应用场景选择。

  • 构建触发器:下面截图中指定的是:仅当产生 push 事件时且目标分支为master时触发此job。这里可以根据需求来具体配置。Filter branches by name:仅当目标分支为 master 时触发Job。

  • 构建环境 & 构建:构建环境勾选第一项指在每次构建开始之前先清空工作空间;构建中的Execute shell Command 中就可以配置我们自动化脚本,我们可以把这些脚本放到项目根目录当中,也可以放到一个GitLab仓库当中,来统一管理脚本(文末附脚本示例)。


  • 构建后操作(Editable Email Notification):用于配置邮件提醒。

    • Disable Extended Email Publisher:勾选后,邮件就不发送;
    • Project Recipient List:收件人地址;多个收件人邮件地址用逗号进行分割;
    • Project Reply-To List:允许回复人的地址;默认为$DEFAULT_REPLYTO;
    • Content Type:邮件文档的类型,可以设置HTML等格式;
    • Default Subject:默认邮件标题;也可以使用$DEFAULT_SUBJECT;
    • Default Content:默认邮件内容,这里可以写HTML文件,引用Jenkins内部的一些变量;也可以使用默认内容:$DEFAULT_CONTENT;
    • Attach Build Log:发送的邮件是否包含日志。

    Triggers 中的配置需要注意下,一般配置为Job执行失败的时候发送邮件


Jenkins Job 如何与 Git 关联

在GitLab项目的Settings中找到如下图的配置:勾选“Active”,指定在Git Push 或 mr 创建/更新/合并时触发指定的 Jenkins url,Project name 为Jenkins 中配置的Job名称,用户名、密码是jenkins的账号和密码。

整体步骤梳理

  1. GitLab上准备一个项目工程;
  2. 安装Jenkins以及相关的GitLab插件;
  3. Jenkins配置GitLab访问权限;
  4. Jenkins上创建一个Job,对应步骤1中的项目工程;
  5. GitLab项目中配置Jenkins;
  6. 修改项目工程的源码,并提交到GitLab上;
  7. 检查Jenkins的构建任务是否会触发配置的脚本。

脚本示例

以下为master分支代码更新后,自动在master分支提交中打 tag的脚本示例,仅供参考:

( Tag 标签命名规则: release_当前日期_当月版本_当季度版本_当年版本 )

#!/bin/sh
echo **********************************Start********************************
date
# 获取最近一次远程 master 提交的 commit id
sha1=`git rev-parse remotes/origin/master^{commit}`
# 获取姓名及邮箱,来配置git提交者信息
name=`git show --pretty=%an $sha1 | awk 'NR==1{print}'`
email=`git show --pretty=%ce $sha1 | awk 'NR==1{print}'`
echo '################# 当前提交人信息:'
echo $name 
echo $email 
git config --global user.name $name
git config --global user.email $email

# 获取 merge 的源分支前缀
function getOriginPrefix(){
  # 获取分支所属
  info_sha1=`git show $sha1 | grep 'Merge:' | cut -d' ' -f3`
  info_branch=`git branch -r --contains $info_sha1`
  # 判断是否 hotfix 分支
  isHotfix=`echo "${info_branch}" | grep 'origin/hotfix'`
  if [ -n "$isHotfix" ]; then 
    echo 'hotfix'
  else
    echo 'release'
  fi
}
originBra=$(getOriginPrefix)
echo '################# 获取的源分支前缀为:' $originBra

# 获取最近一次创建的标签
latestTag=`git for-each-ref --sort=-taggerdate --format "%(tag)" refs/tags | grep $originBra | head -n 1`
# 获取最近标签的年
latestYear=`echo "${latestTag}" | awk -F_ '{print substr($2,1,4)}'`
# 获取最近标签的月
latestMonth=`echo "${latestTag}" | awk -F_ '{print substr($2,5,2)}'`
# 获取最近标签的季度
latestQuarter=`echo "${latestMonth}" | awk '{print int(($0-1)/3)+1}'`

# 获取当年
currentYear=`date +%Y`
# 获取当月
currentMonth=`date +%m`
# 获取当日
currentDay=`date +%Y%m%d`
# 获取当前季度
currentQuarter=`echo $currentMonth | awk '{print int(($0-1)/3)+1}'`

# 计算当月版本号
if [ $latestMonth -eq $currentMonth ]; then 
  currentMonthVersion=`echo "${latestTag}" | awk -F_ '{print $3+1}'`
else
  currentMonthVersion='1'
fi

# 计算当季度版本号
if [ $latestQuarter -eq $currentQuarter ]; then 
  currentQuarterVersion=`echo "${latestTag}" | awk -F_ '{print $4+1}'`
else
  currentQuarterVersion='1'
fi

# 计算当年版本号
if [ $latestYear -eq $currentYear ]; then 
  currentVersion=`echo "${latestTag}" | awk -F_ '{print $5+1}'`
else
  currentVersion='1'
fi

# 获取最终标签名 
newVersion=$originBra'_'$currentDay'_'$currentMonthVersion'_'$currentQuarterVersion'_'$currentVersion

# 创建标签
git tag -a $newVersion -m '提交人: '$name
git push origin --tags
newTag=`git tag -l | grep $newVersion`
echo '################# 最近创建的标签为:' $latestTag
echo '################# 自动计算的标签为:' $newVersion
echo '################# 自动创建的标签为:' $newTag
echo **********************************End**********************************

标签:git,GitLab,echo,Job,Tag,自动,master,Jenkins,分支
From: https://www.cnblogs.com/zgq123456/p/17585388.html

相关文章

  • 指定了ip为什么还有自动配置ipv4?
    刚买了一天双网卡的主机,插上网线配置上网地址,发现指定了ip为什么还有自动配置ipv4?将研究发现应该是电脑启用了自动配置IPv4功能,导致了固定IP无法分配给电脑,尝试用命令关闭自动配置IPv4功能:以管理员身份运行cmd.exe输入:netshwinsockresetcatalog回车输入:netshintipres......
  • KindEditor实现word图片自动转存
    ​ 这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下)<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@     page contentType="text/html;cha......
  • Kolla-ansible自动化部署openstack
     Kolla-ansible自动化部署openstack一、准备工作(模拟all-in-one部署)1、配置好网卡IP(至少2张网卡)vm模拟环境(1张nat+1张桥接网卡)nat网卡(ens32):192.168.108.10桥接网卡(ens33):10.51.40.2112、修改主机名hostnamectlset-hostname+主机名3、关闭防火墙、NM服务、selinuxs......
  • FCKEditor实现word图片自动转存
    ​如何做到ueditor批量上传word图片?1、前端引用代码<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>......
  • WEB自动化-验证码处理
    WEB自动化的过程中遇到验证码的时候,有以下方法:1、Debug模式启动浏览器(浏览器复用)(技术)--推荐2、识别法(技术)--OCR3、接口法(技术):开发人员提供接口,通过这个接口可以获取到图片验证码,只用于测试环境4、移除法(非技术):让开发人员在测似乎环境直接去掉验证码5、暗号法(非技术):万能验证码......
  • Outlook创建约会/Skype会议时自动包含Teams会议链接
    故障现象用户通过Outlook客户端创建约会/Skype会议时,在会议邀请的最下方会自动带上一个Teams会议的链接。故障原因在Outlook选项中可以看到,是由于Addonlinemeetingtoallmeeting被自动勾选导致。该选项受如下注册表控制:Path:HKEY_CURRENT_USER\Software\Microsoft\Office\Outlo......
  • 利用NAS实现全自动观影追剧的几种方案对比
    https://fairysen.com/788.html想象一下打开一个网页,点开搜索框输入想看的电影或者电视剧,只需要点一个按钮,过几分钟对应的高清资源就已经呈现在你的影视库中,刮削完毕,字幕配好,你可以随时在家里的大屏幕或手机的小屏幕上欣赏。上周花了两天时间研究了下这套自动化流程,之前一直是手......
  • 【运维】Cobbler原理与实战(自动安装操作系统类似网克)
    https://blog.csdn.net/weixin_46108954/article/details/105869201https://blog.csdn.net/weixin_47219818/article/details/107504402?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1-107504402-blog-1058......
  • 用Python为接口自动生成测试用例
    基于属性的测试会产生大量的、随机的参数,特别适合为单元测试和接口测试生成测试用例尽管早在2006年haskell语言就有了QuickCheck来进行”基于属性的测试“,但是目前来看这依然是一个比较小众的领域,参考资料有限,本文如有不足,欢迎指正。1.基于表的测试在过去的测试实践中,执行测......
  • 在接口自动化测试过程中,如何开展接口自动化测试?单个模块和多个模块关联又怎么去做测试
    (一)接口自动化如何开展?0、调研、前提准备和思考a)前提:1、正式设计用例的时候,结合postman/jmeter这样的工具2、去设计不同的测试数据,发起请求,查看响应结果与设计是否一致3、(要走一遍手工测试的)--发现的bugb)用例的存储方式:1、excel表格-配置json路径2、json文件-......