gitlab 管道中使用的全局变量不起作用

问题描述 投票:0回答:2

问题:我正在尝试让全局变量在 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  
jenkins gitlab yaml pipeline
2个回答
0
投票

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 中访问


0
投票

要按照您想要的方式重用变量,请使用

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  
© www.soinside.com 2019 - 2024. All rights reserved.