Jenkins 中以構建 Tag 來實現版本管理

好的工具和流程能使咱們事半功倍,而這個過程是不斷迭代和演進的。關於這一塊的內容,以前寫過幾篇文章:前端

如今又有了些新的變化和改進,之因此須要改進,確定是遇到問題了,那麼就先從問題來開始今天的文章。vue

問題

問題分爲兩種:git

方法論的問題:好比團隊採用主幹開發,主幹發佈的模式,可是質量得不到保證,這時經過分析討論決定採用採用主幹開發,分支發佈的模式來解決,這屬於從方法論層面解決問題。web

落地執行的問題:已經知道應該採用主幹開發,分支發佈的模式,但在實際操做的時候,難以執行下去,這屬於執行的問題。docker

在《不斷進化的分支和需求管理》一文的最後提到會引入 release 分支和 tag,實際也這麼作了,但效果並不理想,緣由是執行的不嚴格,沒有作到位,具體緣由以下:bash

  • 發佈時是對分支進行構建發佈,發佈後再在 GitLab 中打上 tag,一忙起來很容易忘記;
  • 鏡像的版本也是如此。

解決思路

目的其實很簡單,就是讓代碼的 tag 和鏡像的 tag 可以一致,靠人工去作這些事情比想象的要更加困難,因此稍微轉換了下思路就能實現自動化,也就能夠解決這個問題。工具

  • 以前提到的 release 分支只作最終的集成測試;
  • 須要發佈時就從 release 分支建立 tag,對 tag 來作發佈,經過腳本自動建立鏡像 tag 進行 push 。

流程圖以下:測試

實際操做

原來在 jenkins 中對分支進行發佈,須要設置特定的分支,如今須要對 tag 進行發佈,tag 是不斷進行建立的,就須要用到 jenkisn 的參數化功能。ui

jenkins 的參數化須要用到 Git Parameter 插件,能夠在 jenkins 的插件管理界面中直接安裝,若是安裝失敗,能夠在這個地址進行下載:http://mirror.xmission.com/jenkins/plugins/git-parameter/latest/,更多插件的使用說明參考官網:https://plugins.jenkins.io/git-parameter/插件

具體配置步驟以下:

一、在 General 下面勾選 This project is parameterized 。

  • Name:參數名稱,能夠隨便填寫,在後面配置分支名稱時會用到;
  • Parameter Type:這裏我選擇 Tag,你也能夠根據須要選擇 Branch 或者其餘類型。

二、在 Source Code Management 選擇 git 進行設置 。

  • Branch Specifier:${tag}, tag 爲第一步中輸入的參數名稱。

設置完成後,能夠看到在構建界面中由原來的 Build Now 變成了 Build with Parameters 。

三、點擊 Build with Parameters 選擇須要構建的 tag 就能夠了 。

按照 tag 進行構建搞定後,剩下就是須要在構建腳本中獲取到最新的 tag 名稱,並做爲參數設置到容器的環境變量和鏡像的 tag 中:

  • 首先進入到 jenkins 配置的程序目錄,使用 git describe --abbrev=0 --tags 獲取 tab 名稱;
  • 前端容器使用環境變量的方式將 tag 名稱傳入,並最終在界面顯示;
  • 容器鏡像使用參數的方式拼接上 tag 名稱。

完整腳本以下:

#!/bin/bash

docker rm -f vue_demo
echo "old container vue_demo del success"

echo "begin docker build"
if [ ! -d web ]; then
  mkdir -p web
  echo "web dir created"
fi

# "獲取最新tag 名稱"
cd /root/code/vue_demo
tagName=`git describe --abbrev=0 --tags`
echo "tag name is:" $tagName

cd /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/* ./web

echo "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_demo

cd ..
rm -rf web

echo "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"

最後

任什麼時候候,若是發現事情作起來彆扭,或者流程難以執行,就須要咱們停下來進行思考或者和他人討論,每每一個細小的調整或許就能帶來巨大的收益。

相關文章
相關標籤/搜索