![](/img/trans.png)
[英]GITLAB-CI: only deploy to DEV if pom version is a snapshot or its a git tag
[英]GitLab-CI get pom version in pipeline
我想通過 gitlab CI 以項目的版本作為標簽來構建 docker 映像:
docker build -t dockerimage:VERSION-IN-POM .
在詹金斯的管道中,我得到了這樣的版本:
${pom.version}
是否可以從 gitlab CI 以類似、方便的方式讀取版本? 還是我必須為此編寫腳本?
假設你在構建環境中有 maven,你可以使用 maven help plugin 和 grep 來提取版本。
VERSION=$(mvn --non-recursive help:evaluate -Dexpression=project.version | grep -v '\[.*')
echo $VERSION
Gitlab-CI 不提供這樣的便利,相反,它讓你可以使用 shell 腳本做任何你想做的事情。 在命令腳本中做到這一點並不難。 您可以安裝xmllint ( apt install libxml2-utils
在 Ubuntu 上),然后您可以通過一個簡單的查詢來獲取它:
xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' pom.xml
所以這一切都可以通過這兩行來解決:
- apt install libxml2-utils
- docker build -t dockerimage:$(xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' pom.xml) .
這適用於我的變量: gitlab-ci.yml
mvn -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive exec:exec -q
直接獲取版本信息的另一個maven命令行替代方案
mvn --non-recursive help:evaluate -Dexpression=project.version -q -DforceStdout
您可以使用 sed 或 grep。
它比使用mvn --non-recursive help:evaluate ...
更快
獲取工件ID
grep -m1 '<artifactId>' pom.xml | grep -oP '(?<=>).*(?=<)'
獲取版本
grep -m1 '<version>' pom.xml | grep -oP '(?<=>).*(?=<)'
如果你使用 docker,有些圖片沒有最新版本的 grep,所以你需要使用帶有 cut 的創意解決方案,例如:
grep -m1 '<artifactId>' pom.xml |cut -d '<' -f2 |cut -d '>' -f2
如果您知道項目名稱,這是另一種使用 shell 的方法; 是從 ./target 目錄下創建的目標 .jar 文件中剪切版本。
注意:這僅在成功構建命令后才有效:
cd target
version=`ls <PROJECT_NAME>*.jar`
version=${version#<PROJECT_NAME>}
version=${version%.jar}
cd ..
echo $version
<PROJECT_NAME> 是項目的名稱(使用不帶 <> 標記)
您可以在.gitlab-ci.yml
文件中使用以下命令:
VERSION=$(mvn --non-recursive help:evaluate -Dexpression=project.version -q -DforceStdout)
echo $VERSION
此外,您可以通過將Dexpression=project.version
更改為Dexpression=project.artifactId
和Dexpression=project.groupId
來獲取groupId
和artifactId
有關更多信息,請參閱Maven 文檔以獲取幫助:評估。
正如 Ivan 在他的帖子中所指出的,這在我的腳本中有效:
-RELEASE_VERSION= xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' pom.xml
-echo $RELEASE_VERSION
我最終使用
vars:
stage: prepare
script:
- echo "POM_VERSION=$(mvn -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive exec:exec -q)" > vars.env
- echo "POM_NAME=$(mvn -Dexec.executable='echo' -Dexec.args='${project.name}' --non-recursive exec:exec -q)" >> vars.env
- echo "POM_GROUP_ID=$(mvn -Dexec.executable='echo' -Dexec.args='${project.groupId}' --non-recursive exec:exec -q)" >> vars.env
- echo "POM_ARTIFACT_ID=$(mvn -Dexec.executable='echo' -Dexec.args='${project.artifactId}' --non-recursive exec:exec -q)" >> vars.env
artifacts:
reports:
dotenv: vars.env
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.