Where variables can be used

原文:https://docs.gitlab.com/ee/ci/variables/where_variables_can_be_used.html

Where variables can be used

CI / CD 变量文档中所述,您可以定义许多不同的变量. 其中一些可用于所有 GitLab CI / CD 功能,但其中某些功能或多或少受到限制.

本文档描述了在何处以及如何使用不同类型的变量.

Variables usage

有两个地方可以使用定义的变量. 在:

  1. GitLab 端,位于.gitlab-ci.yml .
  2. 跑步者方面,位于config.toml .

.gitlab-ci.yml file

Definition 可以扩大吗? 扩展地点 Description
environment:url yes GitLab 变量扩展由 GitLab 的内部变量扩展机制完成 .

支持为作业定义的所有变量(项目/组变量, .gitlab-ci.yml中的变量,触发器中的变量,管道计划中的变量).

不支持在 Runner 的config.toml定义的变量和在 job 的script创建的变量. | | environment:name | yes | GitLab | 与environment:url相似,但是变量扩展不支持以下内容:

-基于环境名称的变量( CI_ENVIRONMENT_NAMECI_ENVIRONMENT_SLUG ). -与环境相关的任何其他变量(当前仅CI_ENVIRONMENT_URL ).

  • 持久变量 . | | resource_group | yes | GitLab | 与environment:url相似,但是变量扩展不支持以下内容:

-基于环境名称的变量( CI_ENVIRONMENT_NAMECI_ENVIRONMENT_SLUG ). -与环境相关的任何其他变量(当前仅CI_ENVIRONMENT_URL ).

-基于环境名称的变量( CI_ENVIRONMENT_NAMECI_ENVIRONMENT_SLUG ). -与环境相关的任何其他变量(当前仅CI_ENVIRONMENT_URL ).

config.toml file

注意:您可以在Runner 的 docs 中阅读有关config.toml更多信息.

Definition 可以扩大吗? Description
runners.environment yes 变量扩展由 Runner 的内部变量扩展机制完成
runners.kubernetes.pod_labels yes 变量扩展由 Runner 的内部变量扩展机制完成
runners.kubernetes.pod_annotations yes 变量扩展由 Runner 的内部变量扩展机制完成

Expansion mechanisms

共有三种扩展机制:

  • GitLab
  • 亚搏体育 app Runner
  • 执行外壳环境

GitLab internal variable expansion mechanism

扩展部分需要采用$variable${variable}%variable% . 每种格式都以相同的方式处理,无论最终由哪个 OS / shell 处理,因为扩展是在任何 Runner 获得该工作之前在 GitLab 中完成的.

GitLab Runner internal variable expansion mechanism

  • 支持:项目/组变量, .gitlab-ci.yml变量, config.toml变量以及触发器,管道计划和手动管道中的变量.
  • 不支持:在脚本内部定义的变量(例如, export MY_VARIABLE="test" ).

跑步者使用 Go 的os.Expand()方法进行变量扩展. 这意味着它将仅处理定义为$variable${variable} . 同样重要的是,扩展只能执行一次,因此嵌套变量可能会或可能不会起作用,这取决于变量定义的顺序.

Execution shell environment

这是script执行期间发生的扩展. 它的工作方式取决于所使用的 shell( bashshcmd ,PowerShell). 例如,如果作业的script包含行echo $MY_VARIABLE-${MY_VARIABLE_2} ,则应由 bash / sh 正确处理(保留空字符串或某些值,具体取决于是否定义了变量),但不适用于 Windows 的cmd或 PowerShell,因为这些外壳使用不同的变量语法.

Supported:

  • script可以使用外壳默认的所有可用变量(例如,应在所有 bash / sh 外壳中包含的$PATH )以及 GitLab CI / CD 定义的所有变量(项目/组变量, .gitlab-ci.yml变量, config.toml变量以及触发器和管道计划中的变量).
  • script还可以使用前面各行中定义的所有变量. 因此,例如,如果您定义变量export MY_VARIABLE="test"
    • before_script ,这将在以下几行工作before_script和相关的所有行script .
    • script ,它将在以下script行中工作.
    • after_script ,它将在after_script以下行中after_script .

对于after_script脚本,它们可以:

  • 仅在同一after_script部分中使用在脚本之前定义的变量.
  • 不要使用在before_scriptscript定义的变量.

这些限制是因为after_script脚本在单独的 shell 上下文中执行.

Persisted variables

注意:一些持久变量包含令牌,由于安全原因,某些定义不能使用它们.

以下变量称为”持久”:

  • CI_PIPELINE_ID
  • CI_JOB_ID
  • CI_JOB_TOKEN
  • CI_BUILD_ID
  • CI_BUILD_TOKEN
  • CI_REGISTRY_USER
  • CI_REGISTRY_PASSWORD
  • CI_REPOSITORY_URL
  • CI_DEPLOY_USER
  • CI_DEPLOY_PASSWORD

他们是:

Variables with an environment scope

支持使用环境范围定义的变量. 鉴于在review/staging/*范围内定义了一个变量$STAGING_SECRET ,将基于匹配的变量表达式创建以下使用动态环境的作业:

  1. my-job:
  2. stage: staging
  3. environment:
  4. name: review/$CI_JOB_STAGE/deploy
  5. script:
  6. - 'deploy staging'
  7. only:
  8. variables:
  9. - $STAGING_SECRET == 'something'