CI/CD 变量是环境变量的一种,通过设置 CI/CD 变量可以:

  1. 控制 job 与 pipeline 的行为

  2. 存储想复用的变量

  3. 避免在 .gitlab-ci.yml 文件中硬编码

CD/CD 的变量定义主要通过两种方式:

  • 通过配置文件

  • 通过项目设置

1. 通过配置文件

.gitlab-ci.yml 文件中,使用 variables 关键词可以定义变量。

1.1 变量作用域

.gitlab-ci.yml 中,变量的作用域有两种,一种是 job 可访问,另一种是全局可访问。

如果在配置文件的顶部区域定义变量,那么该变量在当前 CI 中的所有 job 均可访问。同理,如果在一个单独的 job 中定义变量,则该变量仅在该 job 中可访问。

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

variables:

TEST_VAR: "All jobs can use this variable's value"



job1:

variables:

TEST_VAR_JOB: "Only job1 can use this variable's value"

script:

- echo "$TEST_VAR" and "$TEST_VAR_JOB"
  • .gitlab-ci.yml 仅存储非敏感配置 (non-sensitive configuration)

  • 敏感配置 (sensitive configuration) 请通过项目设置进行配置

1.2 忽略全局变量

在一个 job 中,如果不想使用全局的变量,需要将 variables 设置为 {}:

1
2
3
4
5
6
job1:

variables: {}

script:
  - echo This job does not need any variables

1.3 变量中使用变量

变量可以在其他变量中使用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
job:

variables:

FLAGS: "-al"

LS_CMD: 'ls "$FLAGS"'

script:
  - 'eval "$LS_CMD"' # Executes 'ls -al'

1.4 变量中的转义符号

默认情况下,$ 会被认为是变量的识别符,如果想作为常量使用,需要使用 $$ 进行转义:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
job:

variables:

FLAGS: "-al"

LS_CMD: 'ls "$FLAGS" $$TMP_DIR'

script:
  - 'eval "$LS_CMD"' # Executes 'ls -al $TMP_DIR'

2. 通过项目设置

CI/CD 的变量也可以在项目设置中进行配置。只有项目的 Maintainer 拥有添加和更新 CI/CD 变量的权限。

在项目中维护变量的步骤:

  1. 进入到项目的 Settings > CI/CD,展开 Variables 部分

  2. 点击 Add variable image.png

添加完变量后,就可以直接在 .gitlab-ci.yml 中访问了:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
test_variable:

stage: test

script:
  - echo "$CI_JOB_STAGE" # calls a predefined variable

  - echo "$TEST" # calls a custom variable of type `env_var`

  - echo "$GREETING" # calls a custom variable of type `file` that contains the path to the temp file

  - cat "$GREETING" # the temp file itself contains the variable value

预设的变量

为了更好地了解当前任务的执行情况,GitLab 会把很多关键信息打包成预设变量,如当前 Pipeline 是哪个分支提交触发的,commit hash 是多少,谁提交,有没有发起 Merge Request 等。在每一个 Pipeline 中都可以直接使用预设变量。

常用的预设值主要是:

变量备注
CI_COMMIT_BRANCH提交的分支
CI_COMMIT_MESSAGE提交的信息
CI_COMMIT_SHA提交的 hash 值
CI_COMMIT_TAG发布的 tag
CI_COMMIT_AUTHOR提交的人
CI_MERGE_REQUEST_IDMergeRequest ID

参考文档