我想通过从pom.xml文件中获取值来设置一些变量。这些变量必须是全局变量,因为它们将在多个阶段和工作中使用。
根据gitlab-ci文档,我可以通过两种不同的方式设置全局变量:
使用变量语句:
variable:
pom_artifactID: $(grep -m1 '<artifactId>' pom.xml | cut -d '<' -f2 |cut -d '>' -f2)
使用“之前”脚本:
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。
还有另一种设置全局变量或在阶段和作业之间传递变量的方法吗?
答案 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元素可能跨越多行。
至少有几个选项,例如:
xmllint
的{{1}}工具中使用XPath libxml2-utils
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