如何在 GitLab CI 管道中设置变量

x33g5p2x  于2022-03-04 转载在 其他  
字(2.9k)|赞(0)|评价(0)|浏览(341)

GitLab CI 的变量系统可让您将数据注入 CI 工作环境。您可以使用变量来提供配置值,创建可重用的管道,并避免将敏感信息硬编码到.gitlab-ci.yml文件中。

在本指南中,我们将了解如何在自己的 CI 系统中设置和使用变量。有几个选项可用,具体取决于您希望在哪里显示值以及您希望更改它们的频率。

基础

最简单的变量是键值对,它们作为环境变量注入到管道的执行上下文中。您可以在.gitlab-ci.yml文件中将它们作为标准环境变量引用:

test:
  script:
    - echo "$EXAMPLE_VARIABLE"

您可以使用以下语法转义字 符 : 字符:字符:$VARIABLE

test:
  script:
    - echo "$$EXAMPLE_VARIABLE"

此示例将导致$EXAMPLE_VARIABLE被记录,而不是如上所示的变量值。EXAMPLE_VARIABLE

变量在作业环境中可用。它们还可以插入到.gitlab-ci.yml文件中其他字段的值中,从而启用动态管道配置:

build:
  image: $CI_REGISTRY_IMAGE/build-utils:latest

GitLab CI 定义了几个始终可用的内置变量。这些包括管道运行所针对的提交、分支和合并请求的详细信息。预定义变量还提供对每个作业凭据的访问,以访问其他 GitLab 功能,例如Container Registry和Dependency Proxy。

除了这些内置变量之外,您还可以在多个位置设置自己的值。实例、组、项目和管道级别支持变量,使您在设置回退值、默认值和覆盖时具有灵活性。您可以使用 GitLab UI 或API设置变量;我们在本指南中专注于 UI。

定义变量

变量是在您希望它们可用的范围的 Settings > CI/CD > Variables 屏幕上创建的。对于项目级变量,这意味着在查看页面时从 GitLab 的左侧边栏中转到 Settings > CI/CD项目。同样,对于组级变量,导航到组并使用侧边栏访问其 CI 设置。实例级变量通过 GitLab 管理区域中的相同路径定位。

展开“变量”部分以查看已定义的所有变量。单击蓝色的“添加变量”按钮开始向列表中添加新项目。

每个变量都需要一个唯一的 Key;这就是您在管道及其脚本中引用变量的方式。您选择的名称必须与运行您的作业的 shell 兼容——如果您选择保留关键字,您的作业可能会失败。所有变量都应该是仅包含字母数字字符和下划线的有效字符串。

接下来设置变量的值。当“类型”下拉菜单保留在“变量”时,每次您在管道中引用该变量时,都会按原样注入此值。将类型更改为“文件”会将值作为临时文件注入到您的构建环境中;环境变量的值将是该临时文件的路径。如果您的应用程序准备从指定文件中读取最终值,这可能是一种更安全的注入敏感数据的方法。

完成后,单击绿色的“添加变量”按钮以完成该过程。您现在可以在定义它的范围内执行的管道中引用您的变量。对于项目变量,它将为该项目内的管道定义,而实例级变量将可用于 GitLab 服务器上的每个管道。

可以随时通过返回到设置范围的设置屏幕来管理变量。单击任何变量旁边的编辑按钮(铅笔图标)以显示编辑对话框并更改变量的属性。此对话框还提供了一种删除冗余变量的方法。

受保护的变量

通过选择“添加变量”对话框中的复选框,可以将变量标记为“受保护”。此选项意味着该变量将仅在针对受保护分支或标签运行的管道中定义。

受保护的变量在您公开敏感值(例如不会在每个管道中使用的部署密钥)的情况下是理想的。将该值限制为仅实际需要它的管道(例如针对受保护release分支运行的部署作业)可以降低意外泄漏的风险。

掩码变量

“掩码变量”选项是提高变量安全性的另一种方法。启用此复选框后,GitLab 将自动从收集的作业日志中过滤变量的值。任何无意echo $SECRET_VALUE的都将被清除,从而降低用户在使用 GitLab Web UI 检查作业日志时看到敏感令牌值的风险。

成功的屏蔽需要在日志中可靠地检测到变量值。因此,它仅适用于满足特定格式要求的值。大多数常见的身份验证令牌格式以及所有 Base64 编码的数据都将兼容。屏蔽仅适用于大小不超过 4 KiB 的值。

环境级变量

变量可以分配给特定的环境。此功能使您的管道可以根据部署到的环境以不同的配置运行。

使用“添加变量”对话框中的“环境范围”下拉菜单为您的变量选择环境。该变量将仅在通过文件中的environment字段引用所选环境的管道中定义.gitlab-ci.yml。

设置变量.gitlab-ci.yml

可以使用块在文件中.gitlab-ci.yml定义变量。如果此处列出的变量尚不存在,将为作业创建它们;否则,它们将覆盖在项目级别或更高级别设置的值。variables

可以使用全局variables部分在管道级别设置变量。个别工作也可以有自己的变量。两种方法如下所示,其中暂存作业覆盖管道级变量的值并另外设置唯一的作业特定变量。

variables:
  DEPLOY_URL: example.com

deploy_staging:
  variables:
    DEPLOY_URL: staging.example.com
    DEPLOY_IS_STAGING_ENV: true
  script:
    - ./deploy.sh

deploy_production:
  script:
    - ./deploy.sh

文件中定义的变量.gitlab-ci.yml有时可以以与 GitLab UI 或 API 中设置的方式不同的方式使用。您可以使用变量来避免重复文件的部分,即使这些值将来不太可能更改或被覆盖。因此variables,与项目级别和更高级别中常见的类似配置的键相比,部分可以感觉更接近编程语言的变量。

覆盖变量

GitLab 的变量系统为您提供了多个点,您可以在这些点覆盖变量的值,然后再为管道或作业修复它。优先顺序相对复杂,但可以总结如下:

  • GitLab 的预定义变量总是首先设置。
  • 接下来设置其中定义的.gitlab-ci.yml变量(作业变量比管道变量更具体)。
  • 在实例、组和项目级别设置的变量是分层的。
  • 来自特定管道触发器的变量会覆盖之前的所有内容。

您始终可以使用手动执行来运行具有特定变量值的管道。前往项目的 CI/CD > Pipelines 页面,然后单击右上角的蓝色“运行管道”按钮。

使用下拉菜单选择要运行管道的分支或标签。接下来使用“变量”表定义要添加到此管道运行的变量。这些将成为最具体的值,作为变量优先顺序的最后阶段应用。此处设置的变量不会被保存或在任何未来的管道中重复使用。

概括

GitLab 的 CI 变量实现是一种用于配置管道的强大而灵活的机制。有很多地方可以定义变量,因此很难确定值的位置。

一般来说,在组级别设置尽可能多的值通常是最有效的,这样您就不必在项目中重复自己。您可以稍后在需要不同值的特定项目中覆盖变量。自托管 GitLab 管理员可以使用实例变量来公开公共共享值,尽管如果不仔细管理,这可能会导致无意的信息泄露。

相关文章