DevOps課程-Jenkins 13
Dynamically Increment App Version — Maven pom(with NEW branch)
為了跟前面區別開來,我複製前面做的普通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
重新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 --> nextMajorVersionminorVersion --> nextMinorVersionincrementalVersion --> nextIncrementalVersion
如上圖執行過程中還看到舊的版本號
最後看到:
因為仔細看到有做版本轉換:
同理我要增加中間版本號執行(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
執行以下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:
看起來是用到parent那邊的版號
為了實驗,我拿掉docker打包image那段的withCredentials
改成:
目前找到比較可行的是:
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版的:
(這邊就不實際執行了)