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