问题:我正在尝试让全局变量在 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*
都不存在
问题: 如何才能使此功能发挥作用(或者它根本起作用吗?)
蒂亚
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
Gitlab 变量无法按照您尝试使用的方式工作。如果在一个作业中设置了全局变量,则它们不会在另一作业中保留该值。每个作业中的脚本部分仅继承全局“变量”部分中分配(初始化)的值。
要实现您正在寻找的内容,您需要使用“artifacts:reports:dotenv”
dotenv 报告收集一组环境变量作为作业(在您的案例中为 job1)的工件。并使用“needs”关键字将工件下载到依赖作业(job2)中并注入到 job2 的环境中
删除变量.yml,因为我们不需要它。我们必须将作业 1 中设置的变量值导出为工件,并将其注入到作业 2 中的环境中。
这是一个高级示例
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")'
stages:
- extract_tag_values
job_1:
stage: extract_tag_values # Removed the colon here
tags:
- simba
- bash
- small
script: |
# set you variables here and put them into variables.env file
# example I am setting only two of your variables with hardcoded values
# This is just a demonstration, you can set them dymamically anyway you want to
TARGET_BRANCH="dev"
TARGET_TAG="1.0.0"
# append the variables to a ".env file"
echo "TARGET_BRANCH=$TARGET_BRANCH" >> variables.env
echo "TARGET_TAG=$TARGET_TAG" >> variables.env
artifacts:
reports:
dotenv: variables.env
gitlabfiles/.gitlab-merge-sap-into-dev.yml
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev")'
stages:
- merge_sap_into_dev
job_2:
stage: merge_sap_into_dev # Removed the colon here
tags:
- simba
- bash
- small
needs: [job_1]
stage: merge_sap_into_dev # Removed the colon here
script: |
echo $TARGET_BRANCH
echo $TARGET_TAG
job2 中的 echo 输出 开发者 1.0.0
现在 job1 中设置的变量可以在 job2 中访问
要按照您想要的方式重用变量,请使用
include
,最好利用隐藏作业,然后在需要时从中使用 extend
。通过这种策略,您可以将重复的信息从一项工作转移到另一项工作,而不必使用 artifacts
,这似乎有点大材小用。通过这些更改,您的文件将如下所示:
gitlabfiles/variables.yaml
.env-vars:
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: ""
然后在您想要使用它们的任何文件上,只需将此作业添加到
extends
即可开始使用,例如:
gitlabfiles/.gitlab-extract-tag-values.yaml
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
extends: .env-vars
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 ...]
另外,在最后一个 CI 文件中,您不需要包含环境变量文件,因为您似乎没有使用它们,并且其他两个 CI 文件已经添加了该依赖项:
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/.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