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 中获取所有工件并使其成为工件
如何从 .net 项目文件中获取 gitlab-ci.yml 文件中的项目版本?
Gitlab-ci:如果 MR 存在则触发 merge_request 分离管道,如果不存在则触发源分支管道。这两条管道不应同时运行