在 gitlab 中, 不同 job 之间的变量是不能直接传递的。 但如果有需求, 则必须要借助 artifacts:reports:dotenv 实现。

  1. 在 job1 中保存在 script 下执行命令, 保存到 xxx.env 文件中。
  • 将变量已 k=v 的形式保存
  • 每行一个
  • 不支持换行符
  1. 使用 artifacts:reports:dotenv 传递文件

在后续 job 中, 会自动加载 job1 传递 xxx.env 中的变量键值对。

另外如果在后续 job 中定义了同名变量,则这些变量值将被覆盖, 以 xxx.env 中的值优先。

CI/CD 变量覆盖优先级参考: https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
build:
  stage: build
  script:
    - echo "BUILD_VARIABLE=value_from_build_job" >> build.env
  artifacts:
    reports:
      dotenv: build.env

deploy:
  stage: deploy
  variables:
    BUILD_VARIABLE: value_from_deploy_job  # 变量被 build job 中的值覆盖
  script:
    - echo "$BUILD_VARIABLE"  # Output is: 'value_from_build_job' due to precedence

需要注意的是 默认情况下 同一个 stage 下的不同 job 是并行的。 因此需要在相同 stage 下的多个 job 之间传递变量就需要使用 dependenciesneeds 关键字控制执行顺序。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15

build:
  stage: build
  script:
    - echo "BUILD_VERSION=hello" >> build.env
  artifacts:
    reports:
      dotenv: build.env

deploy_one:
  stage: deploy
  script:
    - echo "$BUILD_VERSION"  # Output is: 'hello'
  dependencies:
    - build