Gitflow工做流定义了一个围绕项目发布的严格分支模型,它会相对复杂一点,但提供了用于一个健壮的用于管理大型项目的框架,很是适合用来管理大型项目的发布和维护。 贯穿整个开发周期,master和develop分支是一直存在的,master分支能够被视为稳定的分支, 而develop分支是相对稳定的分支,特性开发会在feature分支上进行,发布会在release分支上进行,而bug修复则会在hotfix分支上进行,这样也有效避免了不一样类型的开发工做在代码层级的耦合和干扰。html
hotfix和release的结果都要合并到master和develop中,为何?由于它们的修改结果将持续影响这后续的开发和维护,必须合并以保证代码的一致性。node
当线上项目须要版本回退,或者须要简单记录迭代版本时,咱们常在master分支上打上 Tag 标签,例如:git
本文基于GitFlow工做流,将利用Jenkins配合GitLab实现如下自动化任务:正则表达式
Jenkins是一个用Java编写的开源的持续集成工具,能够与Git打通,监听Git的merge, push事件,触发执行Jenkins的指定任务(job),例如执行单元测试。更多的是:当代码变动时能够触发打包部署、性能测试、接口测试、监控、日志分析等。项目发布的任何一个环节均可自动完成,无需太多的人工干预,有利于减小重复过程以节省时间和工做量等。docker
下面列出自动任务Jenkins Job的建立过程,供参考。建立过程以下:shell
构建后操做(Editable Email Notification):用于配置邮件提醒。框架
Triggers 中的配置须要注意下,通常配置为Job执行失败的时候发送邮件工具
在GitLab项目的Settings中找到以下图的配置:勾选“Active”,指定在Git Push 或 mr 建立/更新/合并时触发指定的 Jenkins url,Project name 为Jenkins 中配置的Job名称,用户名、密码是jenkins的帐号和密码。gitlab
( 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**********************************