问题:我正在尝试让global变量在gitlab中工作。我的理解是,需要创建一个central variable file
,然后在所有其他文件中使用它。
在文件*gitlabfiles/variables.yml*
中,我创建了一个variable file
并初始化了变量。在*gitlabfiles/.gitlab-extract-tag-values.yml*
中,变量被赋值,而在*gitlabfiles/.gitlab-merge-sap-into-dev.yml*
中,赋值是引用。
问题是:它们根本不会被赋值。它们只是空的(或者可能是null或undefined)。无论哪种方式,在yml文件*gitlabfiles/.gitlab-extract-tag-values.yml*
中赋值的变量都不存在
**问题:**如何才能让此功能工作(或者它根本就不工作?)
Tia
gitlabfiles/variables.yml
variables:
TARGET_BRANCH: ""
TARGET_TAG: ""
TARGET_TAG_EXISTS: ""
SOURCE_TAG: ""
SOURCE_TAG_EXISTS: ""
VALID_SOURCE_GEN_ABSENT_TAG: ""
SOURCE_GEN_ABSENT_TAG: ""
VALID_SOURCE_SLDC_TAG: ""
SOURCE_SLDC_TAG: ""
VALID_SOURCE_TAG_EXISTS_ON_BRANCH: ""
字符串
在下面的第二个文件中,变量(在variables.yml文件中)被赋值。
gitlabfiles/.gitlab-extract-tag-values.yml
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "test" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "stage" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "prod")'
include:
- gitlabfiles/variables.yml
stages:
- extract_tag_values
job_1:
stage: extract_tag_values # Removed the colon here
tags:
- simba
- bash
- small
script:
- TARGET_BRANCH=$(git rev-parse --abbrev-ref HEAD)
- |
exit_code=$?
if [[ $exit_code -ne 0 ]]; then
echo "Error: generation of target branch failed with exit code $exit_code"
exit 1
fi
[ ... snip ...]
型
在下面的第三个文件中,变量可以被访问-但问题是它们是空白的。我的理解是,当一个人以这种方式定义全局变量时,他们可以在所有的yml文件中访问。下面的文件使用在gitlabfiles/variables.yml中定义的变量。
gitlabfiles/.gitlab-merge-sap-into-dev.yml
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev")'
include:
- gitlabfiles/variables.yml
stages:
- merge_sap_into_dev
job_2:
stage: merge_sap_into_dev # Removed the colon here
tags:
- simba
- bash
- small
script:
# the source branch MUST have a VALID tag before it can be
# passed to Jenkins
- |
JENKINS_TAG=""
if [ "$SOURCE_TAG_EXISTS" == false ]; then
[ ... snip ...]
elif [ "$VALID_SOURCE_TAG_EXISTS_ON_BRANCH" == true ]; then
if [ "$VALID_SOURCE_SLDC_TAG" == true ]; then
JENKINS_TAG=$SOURCE_SLDC_TAG
elif [ "$VALID_SOURCE_GEN_ABSENT_TAG" == true ]; then
JENKINS_TAG=SOURCE_GEN_ABSENT_TAG
else
echo "invalid tag type for target dev branch => $SOURCE_TAG"
echo "Remove tag from the branch and try again"
exit 1
fi
fi
if [ "$JENKINS_TAG" == "" ]; then
echo "Error => Jenkins tag was never assigned "
echo "VALID_SOURCE_TAG_EXISTS_ON_BRANCH => $VALID_SOURCE_TAG_EXISTS_ON_BRANCH "
echo "VALID_SLDC_TAG => $VALID_SLDC_TAG "
echo "VALID_SOURCE_GEN_ABSENT_TAG => $VALID_SOURCE_GEN_ABSENT_TAG "
exit 1
fi
echo "call Jenkins with this tag JENKINS_TAG => $JENKINS_TAG MESSAGE => $CI_COMMIT_MESSAGE"
型
下面的文件是.gitlab-ci.yml文件
.gitlab-ci.yml
workflow:
rules:
# code changed so that it works with MERGE EVENTS ONLY!
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "test" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "stage" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "prod")'
include:
- gitlabfiles/variables.yml
- gitlabfiles/.gitlab-extract-tag-values.yml
- gitlabfiles/.gitlab-merge-sap-into-dev.yml
# new test - making the change
stages:
- extract_tag_values
- merge_sap_into_dev
型
2条答案
按热度按时间7y4bm7vi1#
要按照您想要的方式重用变量,使用
include
,最好使用隐藏作业,然后在需要时使用extend
。使用此策略,您可以将重复信息从一个作业转移到另一个作业,而无需使用artifacts
,这似乎有点矫枉过正。通过这些更改,您的文件将如下所示:gitlabfiles/variables.yaml
字符串
然后在你想要使用的任何文件上,简单地将这个作业添加到
extends
,你就可以开始了,例如:gitlabfiles/.gitlab-extract-tag-values.yaml
型
另外,在最后一个CI文件中,您不需要包含env vars文件,因为您似乎没有使用它们,并且其他两个CI文件已经添加了该依赖项:
型
1cklez4t2#
Gitlab变量并不像你想的那样工作。如果在一个作业中设置了全局变量,它们不会在另一个作业中保留值。每个作业中的脚本部分只继承全局“变量”部分中指定(初始化)的值。
要实现您正在寻找的内容,您需要使用**“artifacts:reports:dotenv”**
dotenv报告从作业(在您的示例中为job 1)中收集一组环境变量作为工件。
去掉变量.yml,因为我们不需要它。我们必须将作业1中设置的变量值导出为工件,并将其注入到作业2的环境中。
下面是一个高级示例
gitlabfiles/.gitlab-extract-tag-values.yml
字符串
gitlabfiles/.gitlab-merge-sap-into-dev.yml
型
回声输出输入job 2
型
所以现在job 1中设置的变量可以在job 2中访问