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

Posted

技术标签:

【中文标题】GitLab-CI 在管道中获取 pom 版本【英文标题】:GitLab-CI get pom version in pipeline 【发布时间】:2019-02-10 19:05:39 【问题描述】:

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

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

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

$pom.version

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

【问题讨论】:

我不相信有一个,但是你可以写一个before_script,它会sed你的pom文件中的版本。在 Jenkins 中有可以简化此类任务的插件,但 GitLab CI 并没有。 【参考方案1】:

您可以在 .gitlab-ci.yml 中使用以下命令:

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

回显 $VERSION

此外,您可以通过将这部分 Dexpression=project.version 更改为 Dexpression=project.artifactId 和 Dexpression=project.groupId 来获取 groupId 和 artifactId

有关更多命令和说明,您可以使用以下链接: https://maven.apache.org/plugins/maven-help-plugin/evaluate-mojo.html

【讨论】:

【参考方案2】:

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

注意:这只有在成功的构建命令后才会起作用:

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

是项目的名称(使用不带 标记)

【讨论】:

【参考方案3】:

另一个可以直接获取版本信息的maven命令行替代方法

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

【讨论】:

【参考方案4】:

您可以使用 sed 或 grep。

比使用mvn --non-recursive help:evaluate ...更快

获取工件ID

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

获取版本

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

如果你使用的是docker,有些图片没有最新版本的grep,所以你需要使用commit creative solution with cut,例如:

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

【讨论】:

“创意剪辑解决方案”帮助了 ;) 谢谢【参考方案5】:

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

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

-echo $RELEASE_VERSION

【讨论】:

【参考方案6】:

这适用于我的变量:gitlab-ci.yml

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

我不得不拖尾输出,我的最终声明: VERSION=$(mvn --batch-mode --non-recursive help:evaluate -Dexpression=project.version | grep -v '[. *' | 尾 -1)【参考方案8】:

Gitlab-CI 不提供这样的便利,相反,它让您可以使用 shell 脚本做任何您想做的事情。在命令脚本中做到这一点并不难。你可以安装xmllint(在Ubuntu上是apt install libxml2-utils)然后你可以通过simple query得到它:

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 在管道中获取 pom 版本的主要内容,如果未能解决你的问题,请参考以下文章

从 gitlab-ci dir 中获取所有工件并使其成为工件

在子项目中获取gitlab父项目详情

Gitlab-CI 又名管道依赖项中的上游触发

如何从 .net 项目文件中获取 gitlab-ci.yml 文件中的项目版本?

Gitlab-ci - 管道无法运行

Gitlab-ci:如果 MR 存在则触发 merge_request 分离管道,如果不存在则触发源分支管道。这两条管道不应同时运行