在gitlab-ci中动态设置全局变量

时间:2020-03-13 14:20:34

标签: global-variables gitlab-ci

我想通过从pom.xml文件中获取值来设置一些变量。这些变量必须是全局变量,因为它们将在多个阶段和工作中使用。

根据gitlab-ci文档,我可以通过两种不同的方式设置全局变量:

  1. 使用变量语句:

    variable:  
     pom_artifactID: $(grep -m1 '<artifactId>' pom.xml | cut -d '<' -f2  |cut -d '>' -f2)
    
  2. 使用“之前”脚本:

     before_script:
       - pom_artifactID=$(grep -m1 '<artifactId>' pom.xml | cut -d '<' -f2  |cut -d '>' -f2)
       - pom_artifactVersion=$(grep -m1 '<version>' pom.xml | cut -d '<' -f2  |cut -d '>' -f2)
       - pom_packaging=$(grep -m1 '<packaging>' pom.xml | cut -d '<' -f2  |cut -d '>' -f2)
       - pom_finalName=$({ grep -m1 '<finalName>' pom.xml |  cut -d '<' -f2 | cut -d '>' -f2; [ ${PIPESTATUS[0]} -eq 0 ] && true || echo ${pom_artifactID}-${pom_artifactVersion}.$pom_packaging}; })
    

第一个无效,因为gitlab-ci不评估$(command),所以pom_artifactID变成了文字“ $(grep -m1”)pom.xml | cut -d'<'- f2 | cut -d'>'-f2)“

第二个也不起作用,因为“ before_script”依赖于“ grep”命令,并且我的管道中使用的某些docker映像具有旧版本的grep。

还有另一种设置全局变量或在阶段和作业之间传递变量的方法吗?

1 个答案:

答案 0 :(得分:1)

在工作和阶段之间传递值

GitLab当前无法在阶段或作业之间传递环境变量。
但是有一个要求:https://gitlab.com/gitlab-org/gitlab/-/issues/22638

当前解决方法是使用工件-基本是传递文件。
我们有一个类似的用例-从pom.xml获取Java应用程序版本,并将其传递给管道中稍后的各种作业。

我们如何在.gitlab-ci.yml中做到这一点:

stages:
  - prepare
  - package

variables:
  VARIABLES_FILE: ./variables.txt  # "." is required for image that have sh not bash

get-version:
  stage: build
  script:
    - APP_VERSION=...
    - echo "export APP_VERSION=$APP_VERSION" > $VARIABLES_FILE
  artifacts:
    paths:
      - $VARIABLES_FILE
package:
  stage: package
  script:
    - source $VARIABLES_FILE
    - echo "Use env var APP_VERSION here as you like ..."


pom.xml提取值

通过这种方式,最好将xml.pom当作XML来从pom.xml提取值而不是单纯的grep,因为XML元素可能跨越多行。

至少有几个选项,例如:

  1. xmllint的{​​{1}}工具中使用XPath
libxml2-utils
  1. 使用get-version: image: ubuntu script: - apt-get update - apt-get install -y libxml2-utils - APP_VERSION=`xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' $POM_FILE` xml处理
python