gitlab 构建tag_Jenkins 配合 GitLab 实现分支的自动合并、自动创建 Tag-程序员宅基地

技术标签: gitlab 构建tag  

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

背景

GitFlow工作流简介

Gitflow工作流定义了一个围绕项目发布的严格分支模型,它会相对复杂一点,但提供了用于一个健壮的用于管理大型项目的框架,非常适合用来管理大型项目的发布和维护。 贯穿整个开发周期,master和develop分支是一直存在的,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的账号和密码。

整体步骤梳理

GitLab上准备一个项目工程;

安装Jenkins以及相关的GitLab插件;

Jenkins配置GitLab访问权限;

Jenkins上创建一个Job,对应步骤1中的项目工程;

GitLab项目中配置Jenkins;

修改项目工程的源码,并提交到GitLab上;

检查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**********************************

参考资料

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39616547/article/details/111555522

智能推荐

hdu 1229 还是A+B(水)-程序员宅基地

文章浏览阅读122次。还是A+BTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24568Accepted Submission(s): 11729Problem Description读入两个小于10000的正整数A和B,计算A+B。...

http客户端Feign——日志配置_feign 日志设置-程序员宅基地

文章浏览阅读419次。HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息。FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。BASIC:仅记录请求的方法,URL以及响应状态码和执行时间。NONE:不记录任何日志信息,这是默认值。配置Feign日志有两种方式;方式二:java代码实现。注解中声明则代表某服务。方式一:配置文件方式。_feign 日志设置

[转载]将容器管理的持久性 Bean 用于面向服务的体系结构-程序员宅基地

文章浏览阅读155次。将容器管理的持久性 Bean 用于面向服务的体系结构本文将介绍如何使用 IBM WebSphere Process Server 对容器管理的持久性 (CMP) Bean的连接和持久性逻辑加以控制,使其可以存储在非关系数据库..._javax.ejb.objectnotfoundexception: no such entity!

基础java练习题(递归)_java 递归例题-程序员宅基地

文章浏览阅读1.5k次。基础java练习题一、递归实现跳台阶从第一级跳到第n级,有多少种跳法一次可跳一级,也可跳两级。还能跳三级import java.math.BigDecimal;import java.util.Scanner;public class Main{ public static void main(String[]args){ Scanner reader=new Scanner(System.in); while(reader.hasNext()){ _java 递归例题

面向对象程序设计(荣誉)实验一 String_对存储在string数组内的所有以字符‘a’开始并以字符‘e’结尾的单词做加密处理。-程序员宅基地

文章浏览阅读1.5k次,点赞6次,收藏6次。目录1.串应用- 计算一个串的最长的真前后缀题目描述输入输出样例输入样例输出题解2.字符串替换(string)题目描述输入输出样例输入样例输出题解3.可重叠子串 (Ver. I)题目描述输入输出样例输入样例输出题解4.字符串操作(string)题目描述输入输出样例输入样例输出题解1.串应用- 计算一个串的最长的真前后缀题目描述给定一个串,如ABCDAB,则ABCDAB的真前缀有:{ A, AB,ABC, ABCD, ABCDA }ABCDAB的真后缀有:{ B, AB,DAB, CDAB, BCDAB_对存储在string数组内的所有以字符‘a’开始并以字符‘e’结尾的单词做加密处理。

算法设计与问题求解/西安交通大学本科课程MOOC/C_算法设计与问题求解西安交通大学-程序员宅基地

文章浏览阅读68次。西安交通大学/算法设计与问题求解/树与二叉树/MOOC_算法设计与问题求解西安交通大学

随便推点

[Vue warn]: Computed property “totalPrice“ was assigned to but it has no setter._computed property "totalprice" was assigned to but-程序员宅基地

文章浏览阅读1.6k次。问题:在Vue项目中出现如下错误提示:[Vue warn]: Computed property "totalPrice" was assigned to but it has no setter. (found in <Anonymous>)代码:<input v-model="totalPrice"/>原因:v-model命令,因Vue 的双向数据绑定原理 , 会自动操作 totalPrice, 对其进行set 操作而 totalPrice 作为计..._computed property "totalprice" was assigned to but it has no setter.

basic1003-我要通过!13行搞定:也许是全网最奇葩解法_basic 1003 case 1-程序员宅基地

文章浏览阅读60次。十分暴力而简洁的解决方式:读取P和T的位置并自动生成唯一正确答案,将题给测点与之对比,不一样就给我爬!_basic 1003 case 1

服务器浏览war文件,详解将Web项目War包部署到Tomcat服务器基本步骤-程序员宅基地

文章浏览阅读422次。原标题:详解将Web项目War包部署到Tomcat服务器基本步骤详解将Web项目War包部署到Tomcat服务器基本步骤1 War包War包一般是在进行Web开发时,通常是一个网站Project下的所有源码的集合,里面包含前台HTML/CSS/JS的代码,也包含Java的代码。当开发人员在自己的开发机器上调试所有代码并通过后,为了交给测试人员测试和未来进行产品发布,都需要将开发人员的源码打包成Wa..._/opt/bosssoft/war/medical-web.war/web-inf/web.xml of module medical-web.war.

python组成三位无重复数字_python组合无重复三位数的实例-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏13次。# -*- coding: utf-8 -*-# 简述:这里有四个数字,分别是:1、2、3、4#提问:能组成多少个互不相同且无重复数字的三位数?各是多少?def f(n):list=[]count=0for i in range(1,n+1):for j in range(1, n+1):for k in range(1, n+1):if i!=j and j!=k and i!=k:list.a..._python求从0到9任意组合成三位数数字不能重复并输出

ElementUl中的el-table怎样吧0和1改变为男和女_elementui table 性别-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏2次。<el-table-column prop="studentSex" label="性别" :formatter="sex"></el-table-column>然后就在vue的methods中写方法就OK了methods: { sex(row,index){ if(row.studentSex == 1){ return '男'; }else{ return '女'; }..._elementui table 性别

java文件操作之移动文件到指定的目录_java中怎么将pro.txt移动到design_mode_code根目录下-程序员宅基地

文章浏览阅读1.1k次。java文件操作之移动文件到指定的目录_java中怎么将pro.txt移动到design_mode_code根目录下

推荐文章

热门文章

相关标签