簡體   English   中英

GitLab-CI 在管道中獲取 pom 版本

[英]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 腳本做任何你想做的事情。 在命令腳本中做到這一點並不難。 您可以安裝xmllintapt 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.artifactIdDexpression=project.groupId來獲取groupIdartifactId

有關更多信息,請參閱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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM