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

up9lanfz  于 6个月前  发布在  Jenkins
关注(0)|答案(2)|浏览(73)

问题:我正在尝试让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

7y4bm7vi

7y4bm7vi1#

要按照您想要的方式重用变量,使用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文件中,您不需要包含env vars文件,因为您似乎没有使用它们,并且其他两个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

1cklez4t

1cklez4t2#

Gitlab变量并不像你想的那样工作。如果在一个作业中设置了全局变量,它们不会在另一个作业中保留值。每个作业中的脚本部分只继承全局“变量”部分中指定(初始化)的值。
要实现您正在寻找的内容,您需要使用**“artifacts:reports:dotenv”**
dotenv报告从作业(在您的示例中为job 1)中收集一组环境变量作为工件。
去掉变量.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


回声输出输入job 2

dev
1.0.0


所以现在job 1中设置的变量可以在job 2中访问

相关问题