【问题标题】:GitLab-CI get pom version in pipelineGitLab-CI 在管道中获取 pom 版本
【发布时间】: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 并没有。

标签: maven docker gitlab 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) .
            

            【讨论】:

            • 不是真的,如果它从属性文件或父文件继承版本怎么办?
            猜你喜欢
            • 2021-09-06
            • 2021-08-15
            • 2016-10-02
            • 1970-01-01
            • 2022-01-19
            • 2017-07-06
            • 2022-01-09
            • 2022-01-19
            • 2021-12-12
            相关资源
            最近更新 更多