gitlab-CI中使用tag作为版本号硬编译进程序中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gitlab-CI中使用tag作为版本号硬编译进程序中相关的知识,希望对你有一定的参考价值。

参考技术A 在使用gitlab过程中,我发现如果能直接将gitlab的tag与自动生成的软件版本做成一致的话,在后续的维护上会更加方便.于是研究了一番如何将tag作为版本号硬编译进程序中的方法.主要是一下几个方面:

指定只对tag生效

可以使用类似c++的方式,生成version.go文件来实现,也可以编译命令中直接修改源文件中指定的值,比如:

version.go中:

那么在gitlab-ci.yml中就可以

即可将Version修改为当前tag

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

【中文标题】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中使用tag作为版本号硬编译进程序中的主要内容,如果未能解决你的问题,请参考以下文章

持续集成 Gitlab-CI Maven部署至服务器

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

多个分支中的.gitlab-ci.yml的多个版本

GitLab-CI环境搭建与操作手册

GitLab-CI环境搭建与操作手册

公众号硬核文章大汇总,看这一篇就够了!