DevOps課程-Jenkins 13

Dynamically Increment App Version — Maven pom(with NEW branch)

ZONGRU Li
12 min readJan 25, 2022

為了跟前面區別開來,我複製前面做的普通pipeline使用的branch來做改造:

拉下目前的jenkins-jobs這個branch:

透過以下指令建立新的branch — jenkins-jobs-version-ctl

拉下Repo:
git clone {url}
切換到既有的jenkins-jobs這個branch:
git checkout jenkins-jobs
複製上述branch到新的branch:
git checkout -b jenkins-jobs-version-ctl
過程要輸入github的ssh密碼

重新import到eclipse,並且修改專案的pom檔內的名稱:

先仔細看看目前的應用程式結構:

這邊看道上圖有所謂的版本version — >0.0.1-SNAPSHOT

通常應用程式版本有三個數字,位置分別表示:

MAJOR.Minor.patch

後面的dependency也有版本,也通常是三碼,一樣的概念推升版本

接下來就是要想辦法讓這個pom檔內的上圖中的版本自動推升

因為打包的Jar檔名稱後面帶的版本就會是這個版本號

而目前名稱是:0.0.1-SNAPSHOT

還好Maven本身有升級版本對應得指令可以使用,如下範例:

先確認有安裝Maven工具:
mvn --version

執行生pom檔內版本指令:

在Linux下執行:
mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit
在Window下改執行:
mvn build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit

注意上面"nextIncrementalVersion"就是+1版本號,其他位置也可以這樣用!

各個位置+1的指令對應:
majorVersion --> nextMajorVersion
minorVersion --> nextMinorVersionincrementalVersion --> nextIncrementalVersion
CMD超糊...不過就是上面wimdow版指令

如上圖執行過程中還看到舊的版本號

最後看到:

因為仔細看到有做版本轉換:

同理我要增加中間版本號執行(windows):

mvn build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.nextMinorVersion}.${parsedVersion.incrementalVersion} versions:commit

以上大概就是透過Maven工具本身來控制版本

而pom檔內的版本號則影響後面執行package的時候所帶的版本號!

更後面希望能同時沿用版本號給image tag版本使用

同樣要在Jenkins上面實現,所以複製原本做的普通pipeline的Job:

原本該專案內的Jenkinsfile內容:

為了版本控制調整,我改造為不吃script.groovy檔的方式

在Jenkins (Linux環境)執行Jenkins指令會跟上面window有些不同

並且在Jenkins Job內透過sh執行指令,還需要跳脫字元!

所以指令變為:
mvn build-helper:parse-version versions:set \
-DnewVersion=\\\${parsedVersion.majorVersion}.\\\${parsedVersion.minorVersion}.\\\${parsedVersion.nextIncrementalVersion} \
versions:commit

其中一段很長如下:

解釋:

完整如下:

如上內容,有影響到既有的Dockerfile打包image的方式

所以原本的Dockerfile內容:

要改造為:

其中ENTRYPOINT轉變成CMD!

這是因為ENTRYPOINT後面是字串式的執行方式,會無法使用*號

所以上面特別改成CMD方式執行,後面才能當作sh指令!

特別注意因為有改pom內的成品名子,所以現在package後的名稱是:

將上述改變推上github,這邊順便加入一個gitignore

vi .gitignore

執行以下git指令推上這個新branch:

git add .
git commit -m "message"
git push -u origin jenkins-jobs-version-ctl

得到:

測試剛剛的Jenkins Job →my-pipeline-version-ctl

第一次會比較久,因為要做mvn加版號指令,需要載額外套件

仔細看看console log:

第一次加版號的下載maven套件

看起來是用到parent那邊的版號

為了實驗,我拿掉docker打包image那段的withCredentials

改成:

先確定拿到的env.IMAGE_NAME

目前找到比較可行的是:

matcher[1][1]拿到就會是"0.1.2"這個內容

也就是最終成品的Jenkinsfile改成:

實際推到docker-hub上的image打得tag(有增加版號):

透過pipeline把新的版本號commit回git server branch上

在上面目前完成的Jenkins pipeline會針對當前pom檔上的版本號tag

進行版本號增加後打包->打成image及tag->推上docker-hub

但是重複執行會有版本號不會繼續增加的問題

因為在github source code上的version tag仍然一樣

需要有人主動更新該version的tag

但是Jenkins其實也可以透過git指令自動化這一部分

首先在Jenkinsfile內後面增加兩個steps:

針對上面新增加的git相關流程,在下面詳加解說:

#先設定執行git指令的身分(email & name),也可以直接在Jenkins Server設定
#其中--global是不只這次Job的全域設定:
git config --global user.email "jenkins@example.com"
git config --global user.name "jenkins"
#BJ4:
git status
#確認當前的branch(但是其實顯示出來的將是當前的hash,而不是branch名稱):
git branch
#確認當前的git相關設定:
git config --list
#設定要推的git Repo的URL位置(下面是一整行):
git remote set-url origin @github.com/JavaNoobPig/SimpleSpringRestful.git">https://${USER}:${PASS}@github.com/JavaNoobPig/SimpleSpringRestful.git
#BJ4:
git add .
git commit -m "ci: version bump"
#要推的branch要用以下指令指定:
git push origin HEAD:jenkins-jobs-version-ctl

以上Jenkinsfile修改完成後一樣推到github上面:

先看看目前pom檔的version的tag:

嘗試執行Jenkins Job:

另外發現線上的groovy format online很會搞事:

常常因為這樣導致Jenkins Job跑失敗...要小心

當前的完整Jenkinsfile:

仔細看看該筆console log:

回頭看看github上該branch的commit紀錄:

讚啦!
有增加版號!

多了一位貢獻者!!:

看到docker-hub也有推上去:

以上針對版本的Jenkins pipeline更迭就完成了

但是其實還有一個問題,就是若該pipeline有設定webhook

這樣不就可能造成無限循環?

Jenkins觸發git上pom version更新->又觸發pipeline->loop

實際的無限loop實驗就看講師的8-17堂後半,這邊直接講如何避免:

— >當執行git push的name是jenkins時不觸發webhook功能就好!

由於講師用的是GitLab跟我用Github不同

不過看看其實都是用外掛做,選的外掛不太一樣罷了

我這邊直接載Github用的那一個:

研究一通才發現跟GitLab設定方法不一樣

首先在取得source code的區塊要真得改成github的:

上圖下面要改用GitHub版的:

(這邊就不實際執行了)

以下若是用GitLab外掛的設定參考:

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet