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

问题描述 投票:0回答:12

我想通过 gitlab CI 构建 docker 镜像,并以项目版本作为标签:

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

在詹金斯的管道中,我得到了这样的版本:

${pom.version}

是否可以以类似、方便的方式从 gitlab CI 读取版本?或者我必须为此编写脚本吗?

maven docker gitlab gitlab-ci
12个回答
14
投票

假设你的构建环境中有maven,你可以使用maven帮助插件和grep来提取版本。

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

12
投票

这适用于我的变量:

gitlab-ci.yml

mvn -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive exec:exec -q

8
投票

Gitlab-CI 并没有提供这样的便利,相反,它让你可以使用 shell 脚本做任何你想做的事情。在命令脚本中做到这一点并不难。您可以安装xmllint(在Ubuntu上为

apt install libxml2-utils
),然后您可以通过简单查询来获取它:

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) .

5
投票

另一种maven命令行替代方案,直接获取版本信息

mvn --non-recursive help:evaluate -Dexpression=project.version -q -DforceStdout

3
投票

您可以使用 sed 或 grep。

比使用

mvn --non-recursive help:evaluate ...

更快

获取artifactID

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 

3
投票

您可以在您的

.gitlab-ci.yml
文件中使用以下命令:

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

echo $VERSION

此外,您可以通过将

groupId
更改为
artifactId
Dexpression=project.version
 来获得 
Dexpression=project.artifactId
Dexpression=project.groupId

有关更多信息,请参阅 maven 文档以获取帮助:evaluate


1
投票

正如 Ivan 在他的 post 中所指出的,这在我的脚本中有效:

-RELEASE_VERSION=

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

-回显$RELEASE_VERSION


1
投票

如果你知道项目名称,这里是另一种使用 shell 的方法;就是从./target目录下创建的目标.jar文件中剪切版本。

注意:这仅在成功构建命令后才有效:

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

是项目名称(不带<>标记)


1
投票

我最终使用了

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

1
投票

这是一个带有 Maven 帮助的解决方案:评估,但使用正则表达式(请参阅命令中的“-E”):

export VERSION=$(mvn --non-recursive help:evaluate -Dexpression=project.version | grep -E '^[0-9]+.[0-9]+.[0-9]+(-[A-Z]+)?$')
echo $VERSION

它将能够在 Maven 命令的输出中找到例如 5.0.1-SNAPHOT 或仅找到 5.0.1 或再次找到 5.0.1-GA

在这种真实的 Maven 输出上进行了测试:

Downloaded from fodfin: http://your.server/artifactory/com/thoughtworks/xstream/xstream/1.4.11.1/xstream-1.4.11.1.jar (621 kB at 369 kB/s)
[INFO] No artifact parameter specified, using 'be.test.super.package:the-application:pom:5.0.1-SNAPSHOT' as project.
[INFO]
5.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  15.127 s
[INFO] Finished at: 2022-10-06T14:40:29+02:00
[INFO] ------------------------------------------------------------------------

0
投票
jobname:
  stage: stage
  before_script:
    - export "MAVEN_ID=$(mvn help:evaluate -Dexpression=project.id -q -DforceStdout)"
    - >
      IFS=: read -r MAVEN_GROUPID MAVEN_ARTIFACTID MAVEN_PACKAGING MAVEN_VERSION <<< ${MAVEN_ID}
  script:
    - >
      echo -e "groupId: ${MAVEN_GROUPID}\nartifactId: ${MAVEN_ARTIFACTID}\nversion: ${MAVEN_VERSION}\npackaging: ${MAVEN_PACKAGING}"
  • mvn help:evaluate -Dexpression=project.id -q -DforceStdout
    以以下格式打印工件识别信息:
    com.group.id:artifactid:packaging:version
  • MAVEN_ID
    变量使用
    IFS
    进行解析,以冒号(
    :
    )为分隔符,得到常见的maven变量,如artifactId、groupId、版本和打包(解释
  • 稍后这些变量可以在代码中使用,例如用于回显值
  • 这样maven只执行1次即可获取信息,可以加快pipeline速度
  • IFS 是 bash 功能,因此相应的 GitLab 运行器应该安装 bash

0
投票

无需假设任何内容,并使用版本来构建可重复性,以及额外的缓存 maven:

build:
  stage: build
  cache:
    key: maven
    paths:
      - .m2/repository
  script:
    # Extract Maven version
    - export MAVEN_VERSION=$(docker run --rm -v $CI_PROJECT_DIR:/app -w /app maven:3.8.4-openjdk-11-slim mvn org.apache.maven.plugins:maven-help-plugin:3.1.1:evaluate -Dexpression=project.version -q -DforceStdout)
© www.soinside.com 2019 - 2024. All rights reserved.