'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?
Solution 1:[1]
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
Solution 2:[2]
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) .
Solution 3:[3]
This work for my variable: gitlab-ci.yml
mvn -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive exec:exec -q
Solution 4:[4]
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
Solution 5:[5]
Another maven command line alternative to get directly get the version information
mvn --non-recursive help:evaluate -Dexpression=project.version -q -DforceStdout
Solution 6:[6]
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)
Solution 7:[7]
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.
Solution 8:[8]
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
Solution 9:[9]
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
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
