Jenkins 中以构建 Tag 来实现版本管理
好的工具和流程能使我們事半功倍,而這個(gè)過程是不斷迭代和演進(jìn)的。關(guān)于這一塊的內(nèi)容,之前寫過幾篇文章:
在團(tuán)隊(duì)中使用GitLab中的Merge Request工作模式
敏捷下的需求和代碼分支管理
不斷進(jìn)化的分支和需求管理
現(xiàn)在又有了些新的變化和改進(jìn),之所以需要改進(jìn),肯定是遇到問題了,那么就先從問題來開始今天的文章。
問題
問題分為兩種:
方法論的問題:比如團(tuán)隊(duì)采用主干開發(fā),主干發(fā)布的模式,但是質(zhì)量得不到保證,這時(shí)通過分析討論決定采用采用主干開發(fā),分支發(fā)布的模式來解決,這屬于從方法論層面解決問題。
落地執(zhí)行的問題:已經(jīng)知道應(yīng)該采用主干開發(fā),分支發(fā)布的模式,但在實(shí)際操作的時(shí)候,難以執(zhí)行下去,這屬于執(zhí)行的問題。
在《不斷進(jìn)化的分支和需求管理》一文的最后提到會(huì)引入 release 分支和 tag,實(shí)際也這么做了,但效果并不理想,原因是執(zhí)行的不嚴(yán)格,沒有做到位,具體原因如下:
發(fā)布時(shí)是對(duì)分支進(jìn)行構(gòu)建發(fā)布,發(fā)布后再在 GitLab 中打上 tag,一忙起來很容易忘記;
鏡像的版本也是如此。
解決思路
目的其實(shí)很簡單,就是讓代碼的 tag 和鏡像的 tag 能夠一致,靠人工去做這些事情比想象的要更加困難,所以稍微轉(zhuǎn)換了下思路就能實(shí)現(xiàn)自動(dòng)化,也就可以解決這個(gè)問題。
之前提到的 release 分支只做最終的集成測試;
需要發(fā)布時(shí)就從 release 分支創(chuàng)建 tag,對(duì) tag 來做發(fā)布,通過腳本自動(dòng)創(chuàng)建鏡像 tag 進(jìn)行 push 。
流程圖如下:
實(shí)際操作
原來在 jenkins 中對(duì)分支進(jìn)行發(fā)布,需要設(shè)置特定的分支,現(xiàn)在需要對(duì) tag 進(jìn)行發(fā)布,tag 是不斷進(jìn)行創(chuàng)建的,就需要用到 jenkisn 的參數(shù)化功能。
jenkins 的參數(shù)化需要用到 Git Parameter 插件,可以在 jenkins 的插件管理界面中直接安裝,如果安裝失敗,可以在這個(gè)地址進(jìn)行下載:http://mirror.xmission.com/jenkins/plugins/git-parameter/latest/,更多插件的使用說明參考官網(wǎng):https://plugins.jenkins.io/git-parameter/
具體配置步驟如下:
1、在 General 下面勾選 This project is parameterized 。
Name:參數(shù)名稱,可以隨便填寫,在后面配置分支名稱時(shí)會(huì)用到;
Parameter Type:這里我選擇 Tag,你也可以根據(jù)需要選擇 Branch 或者其他類型。
2、在 Source Code Management 選擇 git 進(jìn)行設(shè)置 。
Branch Specifier:${tag}, tag 為第一步中輸入的參數(shù)名稱。
設(shè)置完成后,可以看到在構(gòu)建界面中由原來的 Build Now 變成了 Build with Parameters 。
3、點(diǎn)擊 Build with Parameters 選擇需要構(gòu)建的 tag 就可以了 。
按照 tag 進(jìn)行構(gòu)建搞定后,剩下就是需要在構(gòu)建腳本中獲取到最新的 tag 名稱,并作為參數(shù)設(shè)置到容器的環(huán)境變量和鏡像的 tag 中:
首先進(jìn)入到 jenkins 配置的程序目錄,使用 git describe --abbrev=0 --tags 獲取 tab 名稱;
前端容器使用環(huán)境變量的方式將 tag 名稱傳入,并最終在界面顯示;
容器鏡像使用參數(shù)的方式拼接上 tag 名稱。
完整腳本如下:
#!/bin/bashdocker?rm?-f?vue_demo echo?"old?container?vue_demo?del?success"echo?"begin?docker?build" if?[?!?-d?web?];?thenmkdir?-p?webecho?"web?dir?created" fi#?"獲取最新tag?名稱" cd?/root/code/vue_demo tagName=`git?describe?--abbrev=0?--tags` echo?"tag name is:"?$tagNamecd?/root/build/vue_demo cp?/root/build/vue_demo/Dockerfile?./web cp?/root/build/vue_demo/init.sh?./web cp?-r?/root/code/vue_demo/dist/*?./webecho?"begin?docker?build" cd?web docker?build?-t?vue_demo?. echo?"build?end"docker?run?-d?-p?9500:80?--name?vue_demo?-e?"tag_name=${tagName}"?--restart=always??vue_democd?.. rm?-rf?webecho?"update?docker?iamges?start" docker?tag?vue_demo:latest?10.10.10.10:8888/vue_demo:${tagName} docker?push?10.10.10.10:8888/vue_demo:${tagName} echo?"update?docker?iamges?end"??????????????????????最后
任何時(shí)候,如果發(fā)現(xiàn)事情做起來別扭,或者流程難以執(zhí)行,就需要我們停下來進(jìn)行思考或者和他人討論,往往一個(gè)細(xì)小的調(diào)整或許就能帶來巨大的收益。
總結(jié)
以上是生活随笔為你收集整理的Jenkins 中以构建 Tag 来实现版本管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Blazor WebAssembly 3
- 下一篇: FluentAspects -- 基于