简体   繁体   中英

GitLab-CI get pom version in pipeline

I'd like to build docker image via gitlab CI with project's version as a tag:

docker build -t dockerimage:VERSION-IN-POM .

In jenkins' pipeline i'm getting the version like that:

${pom.version}

Is it possible to read the version in a similar, convenient way from gitlab CI? Or do I have to write scripts for that?

Assuming you have maven in build environment, you could use maven help plugin and grep to extract version.

VERSION=$(mvn --non-recursive help:evaluate -Dexpression=project.version | grep -v '\[.*')
echo $VERSION

Gitlab-CI doesn't offer such comforts, instead it offers you to do whatever you want with the shell script. It's not very hard to do it in command script. You can install xmllint ( apt install libxml2-utils on Ubuntu) and then you can get it by a simple query :

xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' pom.xml

So it can all be solved by these two lines:

- 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

You can use sed or grep.

It's faster than using mvn --non-recursive help:evaluate ...

Get the artifactID

grep -m1 '<artifactId>' pom.xml | grep -oP  '(?<=>).*(?=<)'

Get the version

grep -m1 '<version>' pom.xml | grep -oP  '(?<=>).*(?=<)'

If you are using docker, some images don't have newest version of grep, so you need to use come creative solution with cut, example:

grep -m1 '<artifactId>' pom.xml |cut -d '<' -f2  |cut -d '>' -f2 

if you know the project name, here is another approach using shell; is to cut the version from the target .jar file created under ./target directory.

Note: This will work only after successful build commands:

   cd target
   version=`ls <PROJECT_NAME>*.jar`
   version=${version#<PROJECT_NAME>} 
   version=${version%.jar}
   cd ..
   echo $version

<PROJECT_NAME> is the name of the project (use without <> marks)

You can use the below command in your .gitlab-ci.yml file :

VERSION=$(mvn --non-recursive help:evaluate -Dexpression=project.version -q -DforceStdout)

echo $VERSION

Furthermore you can get groupId and artifactId by changing Dexpression=project.version to Dexpression=project.artifactId and Dexpression=project.groupId

For more information see the maven documentation for help:evaluate .

As indicated by Ivan in his post , this worked in my script:

-RELEASE_VERSION= xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' pom.xml

-echo $RELEASE_VERSION

I ended up using

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM