Help us learn about your current experience with the documentation. Take the survey.

CI/CD YAML 语法参考

  • 层级:免费版、高级版、旗舰版
  • 提供方式:GitLab.com、GitLab 自托管、GitLab 专用

本文档列出了 GitLab .gitlab-ci.yml 文件的配置选项。该文件用于定义构成你的管道的 CI/CD 任务。

当你编辑 .gitlab-ci.yml 文件时,可使用 CI Lint 工具验证它。

关键词

一个 GitLab CI/CD 流水线配置包含:

  • 全局关键词,用于配置流水线行为:

    关键词 描述
    default 作业关键字的自定义默认值。
    include 从其他 YAML 文件导入配置。
    stages 流水线阶段的名字和顺序。
    workflow 控制运行哪些类型的流水线。
  • 头部关键词

    关键词 描述
    spec 定义外部配置文件的规范。
  • 作业,通过作业关键词配置:

    关键词 描述
    after_script 覆盖在作业后执行的命令集。
    allow_failure 允许作业失败(失败的作业不会导致流水线失败)。
    artifacts 成功时附加到作业的文件和目录列表。
    before_script 覆盖在作业前执行的命令集。
    cache 应该在后续运行之间缓存的文件列表。
    coverage 给定作业的代码覆盖率设置。
    dast_configuration 在作业级别使用 DAST 配置文件的配置。
    dependencies 通过提供要获取工件的作业列表,限制传递给特定作业的工件。
    environment 作业部署到的环境的名称。
    extends 此作业继承的配置项。
    identity 使用身份联合验证第三方服务。
    image 使用 Docker 镜像。
    inherit 选择所有作业继承的全局默认值。
    interruptible 定义当作业因新运行而变得冗余时是否可以取消。
    manual_confirmation 为手动作业定义自定义确认消息。
    needs 比阶段排序更早执行作业。
    pages 上传作业结果以供 GitLab Pages 使用。
    parallel 应并行运行的作业实例数量。
    release 指示 runner 生成一个 发布 对象。
    resource_group 限制作业并发性。
    retry 作业在失败时可自动重试的时间和次数。
    rules 要评估的条件列表,以确定作业的选定属性以及是否创建作业。
    script 由 runner 执行的 shell 脚本。
    run 由 runner 执行的运行配置。
    secrets 作业所需的 CI/CD 密钥。
    services 使用 Docker 服务镜像。
    stage 定义作业阶段。
    tags 用于选择 runner 的标签列表。
    timeout 定义自定义作业级超时,优先于项目级设置。
    trigger 定义下游流水线触发器。
    when 运行作业的时间。
  • CI/CD 变量

    关键词 描述
    默认 variables 为流水线中的所有作业定义默认 CI/CD 变量。
    作业 variables 为单个作业定义 CI/CD 变量。
  • 已弃用的关键词,不再建议使用。

全局关键词

有些关键词未在作业中定义。这些关键词控制流水线行为或导入额外的流水线配置。

default

你可以为一些关键字设置全局默认值。每个默认关键字都会被复制到所有未定义该关键字的作业中。如果作业已定义该关键字,则不会使用默认值。

关键字类型:全局关键字。

支持的值:这些关键字可以有自定义默认值:

default 示例

default:
  image: ruby:3.0
  retry: 2

rspec:
  script: bundle exec rspec

rspec 2.7:
  image: ruby:2.7
  script: bundle exec rspec

在此示例中:

  • image: ruby:3.0retry: 2 是管道中所有作业的默认关键字。
  • rspec 作业未定义 imageretry,因此它使用默认值 image: ruby:3.0retry: 2
  • rspec 2.7 作业未定义 retry,但明确定义了 image。它使用默认的 retry: 2,但忽略默认的 image 并使用作业中定义的 image: ruby:2.7

额外详情

  • 使用 inherit:default 控制作业中默认关键字的继承。
  • 全局默认值不会传递给 下游管道,下游管道独立于触发它的上游管道运行。

include

使用 include 将外部 YAML 文件包含在你的 CI/CD 配置中。你可以将一个长的 .gitlab-ci.yml 文件拆分为多个文件以提高可读性,或在多个地方减少相同配置的重复。

你也可以将模板文件存储在中央仓库中,并在项目中包含它们。

包含的文件:

  • .gitlab-ci.yml 文件中的内容合并。
  • 无论 include 关键字的位置如何,始终先进行评估,然后再与 .gitlab-ci.yml 文件的内容合并。

解析所有文件的时间限制为 30 秒。

关键字类型:全局关键字。

支持的值include 子键:

以及可选的:

额外详情

  • 只有 特定的 CI/CD 变量 可以与 include 关键字一起使用。
  • 使用合并来自定义并覆盖包含的 CI/CD 配置(使用本地配置)。
  • 你可以通过在 .gitlab-ci.yml 文件中使用相同的作业名称或全局关键字来覆盖包含的配置。两个配置会合并在一起,.gitlab-ci.yml 文件中的配置优先于包含的配置。
  • 如果你重新运行:
    • 作业,include 文件不会被再次获取。管道中的所有作业都使用创建管道时的配置。对源 include 文件的任何更改都不会影响作业的重跑。
    • 管道,include 文件会被再次获取。如果在最后一次管道运行后发生了变化,新管道会使用变更后的配置。
  • 默认情况下,每个管道最多可以有 150 个包含项(包括 嵌套包含)。此外:

include:component

使用 include:componentCI/CD 组件 添加到流水线配置中。

关键字类型:全局关键字。

支持值:CI/CD 组件的完整地址,格式为 <完全限定域名>/<项目路径>/<组件名称>@<特定版本>

include:component 示例

include:
  - component: $CI_SERVER_FQDN/my-org/security-components/secret-detection@1.0

相关主题

include:local

使用 include:local 包含与包含 include 关键字的配置文件位于同一仓库和分支的文件。请改用 include:local 而不是符号链接。

关键字类型:全局关键字。

支持值

相对于根目录(/)的完整路径:

include:local 示例

include:
  - local: '/templates/.gitlab-ci-template.yml'

你也可以使用更简短的语法定义路径:

include: '.gitlab-ci-production.yml'

额外细节

  • .gitlab-ci.yml 文件和本地文件必须在同一分支上。
  • 你不能通过 Git 子模块路径包含本地文件。
  • include 配置始终基于包含 include 关键字文件的所在位置进行评估,而不是运行流水线的项目。如果 嵌套的 include 位于不同项目的配置文件中,include: local 会检查该其他项目以获取文件。

include:project

若要从同一 GitLab 实例上的另一个私有项目中包含文件,请使用 include:projectinclude:file

关键字类型:全局关键字。

支持值

  • include:project:完整的 GitLab 项目路径。
  • include:file:相对于根目录(/)的完整文件路径或文件路径数组。YAML 文件必须具有 .yml.yaml 扩展名。
  • include:ref:可选。用于检索文件的引用。未指定时默认为项目的 HEAD
  • 你可以使用 某些 CI/CD 变量

include:project 示例

include:
  - project: 'my-group/my-project'
    file: '/templates/.gitlab-ci-template.yml'
  - project: 'my-group/my-subgroup/my-project-2'
    file:
      - '/templates/.builds.yml'
      - '/templates/.tests.yml'

你也可以指定一个 ref

include:
  - project: 'my-group/my-project'
    ref: main                                      # Git 分支
    file: '/templates/.gitlab-ci-template.yml'
  - project: 'my-group/my-project'
    ref: v1.0.0                                    # Git 标签
    file: '/templates/.gitlab-ci-template.yml'
  - project: 'my-group/my-project'
    ref: 787123b47f14b552955ca2786bc9542ae66fee5b  # Git SHA
    file: '/templates/.gitlab-ci-template.yml'

额外细节

  • include 配置始终基于包含 include 关键字文件的所在位置进行评估,而不是运行流水线的项目。如果 嵌套的 include 位于不同项目的配置文件中,include: local 会检查该其他项目以获取文件。
  • 当流水线启动时,所有方法包含的 .gitlab-ci.yml 文件配置都会被评估。该配置是某个时间点的快照并存储在数据库中。直到下一次流水线启动前,GitLab 不会反映对所引用 .gitlab-ci.yml 文件配置所做的任何更改。
  • 当你从另一个私有项目中包含 YAML 文件时,运行流水线的用户必须是这两个项目的成员,并且拥有运行流水线的适当权限。如果用户无权访问任何包含的文件,可能会显示 找不到或拒绝访问 错误。
  • 包含另一个项目的 CI/CD 配置文件时要小心。当 CI/CD 配置文件发生变化时,不会触发任何流水线或通知。从安全角度来看,这类似于拉取第三方依赖项。对于 ref,请考虑:
    • 使用特定的 SHA 哈希,这应该是最稳定的选项。使用完整的 40 位字符 SHA 哈希以确保引用所需的提交,因为使用短 SHA 哈希作为 ref 可能会产生歧义。
    • 对其他项目中的 ref 同时应用 受保护分支受保护标签 规则。受保护标签和分支更有可能经过变更管理后再进行修改。

include:remote

使用 include:remote 结合完整URL来从不同位置包含文件。

关键字类型:全局关键字。

支持值: 可通过HTTP/HTTPS GET请求访问的公共URL:

  • 不支持通过远程URL进行身份验证。
  • YAML文件必须具有扩展名 .yml.yaml
  • 你可以使用某些CI/CD变量

include:remote 示例

include:
  - remote: 'https://gitlab.com/example-project/-/raw/main/.gitlab-ci.yml'

附加详情

  • 所有嵌套包含以公共用户身份无上下文执行, 因此你只能包含公开项目或模板。在嵌套包含的 include 部分中不可用任何变量。
  • 包含另一个项目的CI/CD配置文件时要小心。当其他项目的文件更改时,不会触发流水线或通知。 从安全角度看,这类似于拉取第三方依赖项。若要验证所包含文件的完整性,可考虑使用integrity 关键字。 若你链接到拥有的另一个GitLab项目,请同时考虑使用受保护分支受保护标签 来强制实施变更管理规则。

include:template

使用 include:template 来包含.gitlab-ci.yml 模板

关键字类型:全局关键字。

支持值CI/CD模板

  • 所有模板可在lib/gitlab/ci/templates 中查看。 并非所有模板都设计用于与 include:template 配合使用,因此在使用前请检查模板注释。
  • 你可以使用某些CI/CD变量

include:template 示例

# 文件源自GitLab模板集合
include:
  - template: Auto-DevOps.gitlab-ci.yml

多个 include:template 文件:

include:
  - template: Android-Fastlane.gitlab-ci.yml
  - template: Auto-DevOps.gitlab-ci.yml

附加详情

  • 所有嵌套包含以公共用户身份无上下文执行, 因此你只能包含公开项目或模板。在嵌套包含的 include 部分中不可用任何变量。

include:inputs

使用 include:inputs 为输入参数设置值,当包含的配置使用 spec:inputs 且被添加到流水线时。

关键字类型:全局关键字。

支持值:字符串、数值或布尔值。

include:inputs 示例

include:
  - local: 'custom_configuration.yml'
    inputs:
      website: "我的网站"

在此示例中:

  • custom_configuration.yml 中包含的配置会被添加到流水线, 其中包含的配置的 website 输入设置为值 我的网站

附加详情

  • 如果包含的配置文件使用了 spec:inputs:type, 则输入值必须匹配定义的类型。
  • 如果包含的配置文件使用了 spec:inputs:options, 则输入值必须匹配列出的选项之一。

相关主题

include:rules

你可以使用 rulesinclude 配合,有条件地包含其他配置文件。

关键字类型:全局关键字。

支持值:这些 rules 子键:

一些CI/CD变量受支持

include:rules 示例

include:
  - local: build_jobs.yml
    rules:
      - if: $INCLUDE_BUILDS == "true"

test-job:
  stage: test
  script: echo "这是一个测试作业"

在此示例中,如果 INCLUDE_BUILDS 变量为:

  • true,则 build_jobs.yml 配置会包含在流水线中。
  • true 或不存在,则 build_jobs.yml 配置不会包含在流水线中。

相关主题

#### `include:integrity`

使用 `integrity``include:remote` 配合来指定包含的远程文件的SHA256哈希值。 如果 `integrity` 与实际内容不匹配,远程文件将不被处理,且管道失败。 **关键字类型**:全局关键字。 **支持值**:包含内容的Base64编码SHA256哈希值。 **`include:integrity` 示例**: ```yaml include: - remote: 'https://gitlab.com/example-project/-/raw/main/.gitlab-ci.yml' integrity: 'sha256-L3/GAoKaw0Arw6hDCKeKQlV1QPEgHYxGBHsH4zG1IY8='

stages

使用 stages 定义包含作业组的阶段。在作业中使用 stage 配置作业运行的特定阶段。

如果在 .gitlab-ci.yml 文件中未定义 stages,则默认管道阶段为:

stages 中项目的顺序定义了作业的执行顺序:

  • 同一阶段内的作业并行运行。
  • 下一阶段的作业在前一阶段作业全部成功完成后运行。

如果管道仅包含 .pre.post 阶段的作业,则不会运行。 必须至少有一个其他阶段的作业。

关键字类型:全局关键字。

stages 示例

stages:
  - build
  - test
  - deploy

在此示例中:

  1. 所有 build 阶段作业并行执行。
  2. 如果所有 build 作业成功,test 作业并行执行。
  3. 如果所有 test 作业成功,deploy 作业并行执行。
  4. 如果所有 deploy 作业成功,管道标记为 passed

如果任何作业失败,管道标记为 failed,后续阶段作业不会启动。当前阶段作业不会停止,继续运行。

额外细节

  • 如果作业未指定 stage,则该作业分配到 test 阶段。
  • 如果定义了某个阶段但无作业使用,该阶段在管道中不可见,这有助于合规管道配置
    • 合规配置中可定义阶段,但未被使用时保持隐藏。
    • 当开发者在作业定义中使用这些阶段时,定义的阶段才会可见。

相关主题

  • 要让作业提前开始并忽略阶段顺序,使用 needs 关键字。

workflow

使用 workflow 控制管道行为。

可在 workflow 配置中使用一些预定义CI/CD变量,但不能使用仅在作业启动时定义的变量。

相关主题

workflow:auto_cancel:on_new_commit

使用 workflow:auto_cancel:on_new_commit 配置自动取消冗余管道功能的行为。

支持值

  • conservative:取消管道,但仅当无 interruptible: false 的作业已启动时。未定义时默认此值。
  • interruptible:仅取消 interruptible: true 的作业。
  • none:不自动取消任何作业。

workflow:auto_cancel:on_new_commit 示例

workflow:
  auto_cancel:
    on_new_commit: interruptible

job1:
  interruptible: true
  script: sleep 60

job2:
  interruptible: false  # 未定义时默认值。
  script: sleep 60

在此示例中:

  • 当新提交推送到分支时,GitLab创建新管道,job1job2 启动。
  • 若在新提交推送前作业未完成,仅 job1 被取消。

#### `workflow:auto_cancel:on_job_failure`

使用 `workflow:auto_cancel:on_job_failure` 来配置在某个作业失败时应取消哪些作业。 **支持的值**: - `all`:一旦一个作业失败,就取消流水线和所有正在运行的作业。 - `none`:不自动取消任何作业。 **`workflow:auto_cancel:on_job_failure` 示例**: ```yaml stages: [stage_a, stage_b] workflow: auto_cancel: on_job_failure: all job1: stage: stage_a script: sleep 60 job2: stage: stage_a script: - sleep 30 - exit 1 job3: stage: stage_b script: - sleep 30

在此示例中,如果 job2 失败,若 job1 仍在运行则会取消它,且 job3 不会启动。

相关主题

workflow:name

您可以在 workflow: 中使用 name 为流水线定义名称。

所有流水线都会被分配已定义的名称。名称中前导或尾随的空格会被删除。

支持的值

workflow:name 示例

带有预定义变量的简单流水线名称:

workflow:
  name: 'Pipeline for branch: $CI_COMMIT_BRANCH'

根据流水线条件配置不同名称:

variables:
  PROJECT1_PIPELINE_NAME: 'Default pipeline name'  # 默认不是必需的

workflow:
  name: '$PROJECT1_PIPELINE_NAME'
  rules:
    - if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby3/'
      variables:
        PROJECT1_PIPELINE_NAME: 'Ruby 3 pipeline'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      variables:
        PROJECT1_PIPELINE_NAME: 'MR pipeline: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME'
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH  # 对于默认分支流水线,使用默认名称

附加细节

  • 如果名称是空字符串,则流水线不会被分配名称。仅由 CI/CD 变量组成的名称可能会评估为空字符串(如果所有变量也都是空的)。
  • workflow:rules:variables 成为默认变量,可用于所有作业,包括默认转发变量到下游流水线的trigger作业。如果下游流水线使用了相同的变量,则该变量会被覆盖为上游变量的值。请确保要么:
    • 在每个项目的流水线配置中使用唯一的变量名,例如 PROJECT1_PIPELINE_NAME
    • 在触发作业中使用 inherit:variables,并列出要转发到下游流水线的确切变量。

workflow:rules

工作流(workflow)中的 rules 关键字与作业中定义的 rules 类似,但它控制是否创建整个流水线。

当没有规则评估为真时,流水线不会运行。

支持值:你可以使用一些与作业级 rules 相同的关键字:

workflow:rules 示例

workflow:
  rules:
    - if: $CI_COMMIT_TITLE =~ /-draft$/
      when: never
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

在此示例中,如果提交标题(提交消息的第一行)不以 -draft 结尾,并且流水线用于以下任一情况,则流水线会运行:

  • 合并请求
  • 默认分支

额外细节

  • 如果你的规则同时匹配分支流水线(除默认分支外)和合并请求流水线,可能会出现重复流水线
  • start_inallow_failureneedsworkflow:rules 中不受支持,但不会导致语法错误。尽管它们无效,但不要在 workflow:rules 中使用它们,因为这可能在将来引起语法失败。有关更多详情,请参阅 issue 436473

相关主题

workflow:rules:variables

你可以在 workflow:rules 中使用 variables 为特定流水线条件定义变量。

当条件匹配时,该变量会被创建,并可被流水线中的所有作业使用。如果该变量已在顶级定义为默认变量,则 workflow 变量优先并覆盖默认变量。

关键字类型:全局关键字。

支持值:变量名和值的对:

  • 名称只能使用数字、字母和下划线(_)。
  • 值必须是字符串。

workflow:rules:variables 示例

variables:
  DEPLOY_VARIABLE: "default-deploy"

workflow:
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      variables:
        DEPLOY_VARIABLE: "deploy-production"  # 覆盖全局定义的 DEPLOY_VARIABLE
    - if: $CI_COMMIT_BRANCH =~ /feature/
      variables:
        IS_A_FEATURE: "true"                  # 定义新变量。
    - if: $CI_COMMIT_BRANCH                   # 其他情况下运行流水线

job1:
  variables:
    DEPLOY_VARIABLE: "job1-default-deploy"
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      variables:                                   # 覆盖作业级别定义的 DEPLOY_VARIABLE
        DEPLOY_VARIABLE: "job1-deploy-production"  # 
    - when: on_success                             # 其他情况下运行作业
  script:
    - echo "以 $DEPLOY_VARIABLE 作为参数运行脚本"
    - echo "如果存在 $IS_A_FEATURE 则运行另一个脚本"

job2:
  script:
    - echo "以 $DEPLOY_VARIABLE 作为参数运行脚本"
    - echo "如果存在 $IS_A_FEATURE 则运行另一个脚本"

当分支是默认分支时:

  • job1 的 DEPLOY_VARIABLEjob1-deploy-production
  • job2 的 DEPLOY_VARIABLEdeploy-production

当分支是 feature 时:

  • job1 的 DEPLOY_VARIABLEjob1-default-deploy,且 IS_A_FEATUREtrue
  • job2 的 DEPLOY_VARIABLEdefault-deploy,且 IS_A_FEATUREtrue

当分支是其他情况时:

  • job1 的 DEPLOY_VARIABLEjob1-default-deploy
  • job2 的 DEPLOY_VARIABLEdefault-deploy

额外细节

  • workflow:rules:variables 会成为可在所有作业中使用的默认变量,包括默认转发变量到下游流水线的 trigger 作业。如果下游流水线使用了相同的变量,则该变量会被上游变量的值覆盖。请务必做到以下一点:
    • 在每个项目的流水线配置中使用唯一的变量名,例如 PROJECT1_VARIABLE_NAME
    • 在触发作业中使用 inherit:variables,并列出你要转发到下游流水线的确切变量。

workflow:rules:auto_cancel

使用 workflow:rules:auto_cancel 来配置 workflow:auto_cancel:on_new_commitworkflow:auto_cancel:on_job_failure 功能的行为。

支持值

workflow:rules:auto_cancel 示例

workflow:
  auto_cancel:
    on_new_commit: interruptible
    on_job_failure: all
  rules:
    - if: $CI_COMMIT_REF_PROTECTED == 'true'
      auto_cancel:
        on_new_commit: none
        on_job_failure: none
    - when: always                  # 其他情况始终运行流水线

test-job1:
  script: sleep 10
  interruptible: false

test-job2:
  script: sleep 10
  interruptible: true

在此示例中,默认情况下所有作业的 workflow:auto_cancel:on_new_commit 设置为 interruptible,而 workflow:auto_cancel:on_job_failure 设置为 all。但如果流水线运行于受保护的分支,规则会将默认值覆盖为 on_new_commit: noneon_job_failure: none。例如,如果流水线正在运行以下情况:

  • 非受保护分支且推送了新提交时,test-job1 继续运行,test-job2 被取消。
  • 受保护分支且推送了新提交时,test-job1test-job2 都继续运行。

头部关键字

某些关键字必须在 YAML 配置文件的头部部分定义。头部必须位于文件顶部,通过 --- 与其余配置分隔。

spec

在 YAML 文件的头部添加一个 spec 部分,以在使用 include 关键字向流水线添加配置时配置流水线的行为。

Spec 必须在配置文件顶部声明,位于通过 --- 与其余配置分隔的头部部分。

spec:inputs

你可以使用 spec:inputs 为 CI/CD 配置定义 inputs

使用插值格式 $[[ inputs.input-id ]] 引用头部部分之外的其他值。当在流水线创建期间获取配置时,输入会被评估并插值。使用 inputs 时,插值会在配置与 .gitlab-ci.yml 文件内容合并之前完成。

关键字类型:头部关键字。spec 必须在配置文件顶部的头部部分声明。

支持值:表示预期输入的字符串哈希。

spec:inputs 示例

spec:
  inputs:
    environment:
    job-stage:
---

scan-website:
  stage: $[[ inputs.job-stage ]]
  script: ./scan-website $[[ inputs.environment ]]

额外细节

  • 输入是强制的,除非你使用 spec:inputs:default 设置默认值。避免强制输入,除非你仅在与 include:inputs 一起使用输入时。
  • 输入期望字符串,除非你使用 spec:inputs:type 设置不同的输入类型。
  • 包含插值块的字符串不得超过 1 MB。
  • 插值块内的字符串不得超过 1 KB。
  • 你可以在运行新的流水线时定义输入值。

相关主题

spec:inputs:default

当包含输入时,它们是必需的,除非你通过 spec:inputs:default 设置了默认值。

使用 default: '' 表示无默认值。

关键字类型:头部关键字。spec 必须在配置文件顶部的头部区域声明。

支持值:表示默认值的字符串,或 ''

spec:inputs:default 示例

spec:
  inputs:
    website:
    user:
      default: 'test-user'
    flags:
      default: ''
title: The pipeline configuration would follow...
---

在此示例中:

  • website 是必需的,必须定义。
  • user 是可选的。如果未定义,值为 test-user
  • flags 是可选的。如果未定义,则没有值。

额外细节

  • 当输入满足以下条件时,管道会因验证错误而失败:
    • 同时使用 defaultoptions,但默认值不在选项列表中。
    • 同时使用 defaultregex,但默认值与正则表达式不匹配。
    • 值与 type 不匹配。

spec:inputs:description

使用 description 为特定输入提供说明。该说明不影响输入的行为,仅用于帮助文件使用者理解输入。

关键字类型:头部关键字。spec 必须在配置文件顶部的头部区域声明。

支持值:表示说明的字符串。

spec:inputs:description 示例

spec:
  inputs:
    flags:
      description: 'Sample description of the `flags` input details.'
title: The pipeline configuration would follow...
---

spec:inputs:options

输入可以使用 options 指定允许值的列表。每个输入最多支持 50 个选项。

关键字类型:头部关键字。spec 必须在配置文件顶部的头部区域声明。

支持值:输入选项数组。

spec:inputs:options 示例

spec:
  inputs:
    environment:
      options:
        - development
        - staging
        - production
title: The pipeline configuration would follow...
---

在此示例中:

  • environment 是必需的,必须定义为列表中的一个值。

额外细节

  • 当满足以下条件时,管道会因验证错误而失败:
    • 同时使用 optionsdefault,但默认值不在选项列表中。
    • 任何输入选项与 type 不匹配(使用 options 时不能是 boolean)。

spec:inputs:regex

使用 spec:inputs:regex 指定输入必须匹配的正则表达式。

关键字类型:头部关键字。spec 必须在配置文件顶部的头部区域声明。

支持值:必须是正则表达式。

spec:inputs:regex 示例

spec:
  inputs:
    version:
      regex: ^v\d\.\d+(\.\d+)?$
title: The pipeline configuration would follow...
---

在此示例中,v1.0v1.2.3 匹配正则表达式并通过验证。v1.A.B 不匹配并失败。

额外细节

  • inputs:regex 只能与 typestring 一起使用,不能是 numberboolean
  • 不要用 / 包裹正则表达式(例如,使用 regex.* 而非 /regex.*/)。
  • inputs:regex 使用 RE2 解析正则表达式。

spec:inputs:type

默认情况下,输入期望字符串。使用 spec:inputs:type 设置不同的所需类型。

关键字类型:头部关键字。spec 必须在配置文件顶部的头部区域声明。

支持值:可以是以下之一:

  • array:接受输入数组。
  • string:接受字符串输入(未定义时默认)。
  • number:仅接受数字输入。
  • boolean:仅接受 truefalse 输入。

spec:inputs:type 示例

spec:
  inputs:
    job_name:
    website:
      type: string
    port:
      type: number
    available:
      type: boolean
    array_input:
      type: array
title: The pipeline configuration would follow...
---

作业关键词

以下主题解释如何使用关键词配置CI/CD管道。

after_script

使用after_script定义一个命令数组,这些命令在作业的before_scriptscript部分完成后最后运行。after_script命令还会在以下情况运行:

  • before_scriptscript部分仍在运行时,作业被取消。
  • 作业因script_failure类型的失败而失败,但不是其他失败类型

关键词类型:作业关键词。你只能在作业中使用它,或在default部分中使用。

支持的值:包含以下内容的数组:

CI/CD变量受支持

after_script示例:

job:
  script:
    - echo "An example script section."
  after_script:
    - echo "Execute this command after the `script` section completes."

额外细节:

你在after_script中指定的脚本会在一个新的shell中执行,与任何before_scriptscript命令分开。因此,它们:

  • 当前工作目录会重置为默认值(根据定义运行器如何处理Git请求的变量)。
  • 无法访问before_scriptscript中定义的命令所做的更改,包括:
    • script脚本中导出的命令别名和变量。
    • 工作树外的更改(取决于运行器执行器),例如由before_scriptscript脚本安装的软件。
  • 有单独的超时时间。对于GitLab Runner 16.4及更高版本,默认为5分钟,可通过RUNNER_AFTER_SCRIPT_TIMEOUT变量进行配置。在GitLab 16.3及更早版本中,超时时间是硬编码为5分钟的。
  • 不影响作业的退出码。如果script部分成功,而after_script超时或失败,作业将以代码0Job Succeeded)退出。
  • 使用CI/CD作业令牌after_script存在已知问题。你可以在after_script命令中使用作业令牌进行身份验证,但如果作业被取消,该令牌会立即失效。有关更多详情,请参阅问题

对于超时的作业:

  • 默认情况下,after_script命令不会执行。
  • 你可以配置超时值,通过设置不超过作业超时的适当RUNNER_SCRIPT_TIMEOUTRUNNER_AFTER_SCRIPT_TIMEOUT值来确保after_script运行。

相关主题:

allow_failure

使用 allow_failure 来确定当作业失败时,管道是否应继续运行。

  • 若要让管道继续运行后续作业,请使用 allow_failure: true
  • 若要停止管道运行后续作业,请使用 allow_failure: false

当允许作业失败(allow_failure: true)时,会显示橙色警告( status_warning ),表示该作业失败。不过,管道仍算成功,相关提交会被标记为通过且无警告。

以下情况也会显示此警告:

  • 该阶段的所有其他作业均成功。
  • 管道中的所有其他作业均成功。

allow_failure 的默认值为:

  • 对于手动作业,为 true
  • 对于在rules中使用 when: manual 的作业,为 false
  • 其他所有情况均为 false

关键词类型:作业关键词。你只能将其用作作业的一部分。

支持的值

  • truefalse

allow_failure 示例

job1:
  stage: test
  script:
    - execute_script_1

job2:
  stage: test
  script:
    - execute_script_2
  allow_failure: true

job3:
  stage: deploy
  script:
    - deploy_to_staging
  environment: staging

在此示例中,job1job2 并行运行:

  • 如果 job1 失败,deploy 阶段的作业不会启动。
  • 如果 job2 失败,deploy 阶段的作业仍可启动。

附加详情

  • 你可以将 allow_failure 用作 rules 的子键。
  • 若设置 allow_failure: true,该作业始终被视为成功;若此作业失败,使用 when: on_failure 的后续作业不会启动。
  • 你可以使用 allow_failure: false 与手动作业结合,创建一个阻塞型手动作业。被阻塞的管道在手动作业启动并成功完成前,不会运行后续阶段的任何作业。

allow_failure:exit_codes

使用 allow_failure:exit_codes 来控制何时允许作业失败。对于列出的任意退出码,作业视为 allow_failure: true;对于其他任意退出码,则为 allow_failure: false

关键词类型:作业关键词。你只能将其用作作业的一部分。

支持的值

  • 单个退出码。
  • 退出码数组。

allow_failure 示例

test_job_1:
  script:
    - echo "Run a script that results in exit code 1. This job fails."
    - exit 1
  allow_failure:
    exit_codes: 137

test_job_2:
  script:
    - echo "Run a script that results in exit code 137. This job is allowed to fail."
    - exit 137
  allow_failure:
    exit_codes:
      - 137
      - 255

artifacts

使用 artifacts 指定要作为作业制品保存的文件。作业制品是一组文件和目录,会在作业成功、失败或始终时附加到作业中。

制品在作业完成后发送至 GitLab。如果大小小于最大制品大小,则可在 GitLab UI 中下载。

默认情况下,后续阶段的作业会自动下载由较早阶段作业创建的所有制品。你可以通过 dependencies 控制作业中的制品下载行为。

使用 needs 关键字时,作业只能从 needs 配置中定义的作业下载制品。

默认情况下,仅对成功的作业收集制品,且制品会在缓存后恢复。

阅读更多关于制品的内容

artifacts:paths

路径相对于项目目录($CI_PROJECT_DIR),不能直接链接到其外部。

关键词类型:作业关键字。你只能在作业中或 default 部分 中使用它。

支持的值

CI/CD 变量 受支持

artifacts:paths 示例

job:
  artifacts:
    paths:
      - binaries/
      - .config

此示例创建一个包含 .configbinaries 目录中所有文件的工件。

额外细节

  • 如果未与 artifacts:name 一起使用,则工件文件名为 artifacts,下载时会变为 artifacts.zip

相关主题


artifacts:exclude

使用 artifacts:exclude 防止文件被添加到工件存档中。

关键词类型:作业关键字。你只能在作业中或 default 部分 中使用它。

支持的值

artifacts:exclude 示例

artifacts:
  paths:
    - binaries/
  exclude:
    - binaries/**/*.o

此示例存储 binaries/ 中的所有文件,但不包括 binaries/ 子目录中的 *.o 文件。

额外细节

  • artifacts:exclude 路径不会递归搜索。
  • artifacts:untracked 匹配的文件也可以用 artifacts:exclude 排除。

相关主题


artifacts:expire_in

使用 expire_in 指定 作业工件 在过期并被删除前存储的时间。expire_in 设置不影响:

过期后,工件默认每小时(通过 cron 作业)删除一次,且不再可访问。

关键词类型:作业关键字。你只能在作业中或 default 部分 中使用它。

支持的值:过期时间。如果未提供单位,则以秒为单位。有效值包括:

  • '42'
  • 42 seconds
  • 3 mins 4 sec
  • 2 hrs 20 min
  • 2h20min
  • 6 mos 1 day
  • 47 yrs 6 mos and 4d
  • 3 weeks and 2 days
  • never

artifacts:expire_in 示例

job:
  artifacts:
    expire_in: 1 week

额外细节

  • 过期时间从工件上传并存储到 GitLab 时开始计算。如果未定义过期时间,则默认为 实例范围的设置
  • 要覆盖过期日期并防止工件被自动删除:
    • 在作业页面上选择 Keep
    • expire_in 的值设为 never
  • 如果过期时间过短,长流水线后续阶段的作业可能会尝试从早期作业中获取已过期的工件。如果工件已过期,尝试获取它们的作业会因 无法检索所需工件 错误 而失败。延长过期时间,或在后续作业中使用 dependencies,以确保它们不会尝试获取已过期的工件。
  • artifacts:expire_in 不影响 GitLab Pages 部署。要配置 Pages 部署的过期时间,请使用 pages.expire_in

artifacts:expose_as

使用 artifacts:expose_as 关键字可在合并请求界面中展示作业工件

关键字类型:作业关键字。你只能在作业内或 default 部分 中使用它。

支持值

  • 在合并请求界面中显示的工件下载链接的名称。必须与 artifacts:paths 配合使用。

artifacts:expose_as 示例

test:
  script: ["echo 'test' > file.txt"]
  artifacts:
    expose_as: 'artifact 1'
    paths: ['file.txt']

附加细节

  • 工件会被保存,但如果 artifacts:paths 的值满足以下条件,则不会在界面中显示:
    • 使用了 CI/CD 变量
    • 定义了目录,但未以 / 结尾(例如,directory/ 可配合 artifacts:expose_as 使用,但 directory 不行)。
    • ./ 开头(例如,file 可配合 artifacts:expose_as 使用,但 ./file 不行)。
  • 每个合并请求最多可暴露 10 个作业工件。
  • 不支持 glob 模式。
  • 如果指定了目录且目录内有多个文件,链接会指向作业工件浏览器
  • 若启用了 GitLab Pages,当工件是单个文件且扩展名为以下之一时,GitLab 会自动渲染:
    • .html.htm
    • .txt
    • .json
    • .xml
    • .log

相关主题

artifacts:name

使用 artifacts:name 关键字定义创建的工件存档的名称。你可以为每个存档指定唯一名称。

若未定义,默认名称为 artifacts,下载时会变成 artifacts.zip

关键字类型:作业关键字。你只能在作业内或 default 部分 中使用它。

支持值

artifacts:name 示例
要创建一个名为当前作业的存档:

job:
  artifacts:
    name: "job1-artifacts-file"
    paths:
      - binaries/

相关主题

artifacts:public

artifacts:public 现已被更灵活的 artifacts:access 取代。

使用 artifacts:public 确定作业工件是否应公开可用。

artifacts:publictrue(默认)时,公共流水线中的工件可供匿名用户、访客和报告者用户下载。

若要拒绝公共流水线中这些用户对工件的读取权限,可将 artifacts:public 设为 false

关键字类型:作业关键字。你只能在作业内或 default 部分 中使用它。

支持值

  • true(未定义时默认)或 false

artifacts:public 示例

job:
  artifacts:
    public: false

artifacts:access

使用 artifacts:access 确定谁可以从 GitLab UI 或 API 访问作业工件。此选项不会阻止你将工件转发给下游流水线。

你不能在同一作业中同时使用 artifacts:publicartifacts:access

关键字类型:作业关键字。你只能在作业内使用它。

支持值

  • all(默认):公共流水线中的作业工件可供任何人下载,包括匿名用户、访客和报告者。
  • developer:仅具有开发者角色或更高权限的用户可下载该作业的工件。
  • none:无人可下载该作业的工件。

artifacts:access 示例

job:
  artifacts:
    access: 'developer'

附加细节

artifacts:reports

使用 artifacts:reports 收集由包含模板生成的制品。

关键词类型:作业关键字。你只能在作业中或 default 部分 中使用它。

支持值

artifacts:reports 示例

rspec:
  stage: test
  script:
    - bundle install
    - rspec --format RspecJunitFormatter --out rspec.xml
  artifacts:
    reports:
      junit: rspec.xml

附加详情

  • 在父管道中使用 子管道的制品 组合报告不受支持。跟踪添加支持的进展可在 此问题 中查看。
  • 要能够浏览和下载报告输出文件,请包含 artifacts:paths 关键字。这会两次上传并存储制品。
  • 无论作业结果(成功或失败),为 artifacts: reports 创建的制品总是会上传。你可以使用 artifacts:expire_in 设置制品的过期日期。

artifacts:untracked

使用 artifacts:untracked 添加所有 Git 未跟踪文件作为制品(以及 artifacts:paths 中定义的路径)。artifacts:untracked 忽略仓库 .gitignore 中的配置,因此 .gitignore 中匹配的制品会被包含。

关键词类型:作业关键字。你只能在作业中或 default 部分 中使用它。

支持值

  • truefalse(未定义时默认)。

artifacts:untracked 示例

保存所有 Git 未跟踪文件:

job:
  artifacts:
    untracked: true

相关主题

artifacts:when

使用 artifacts:when 在作业失败或即使失败时上传制品。

关键词类型:作业关键字。你只能在作业中或 default 部分 中使用它。

支持值

  • on_success(默认):仅在作业成功时上传制品。
  • on_failure:仅在作业失败时上传制品。
  • always:始终上传制品(除作业超时外)。例如,当 上传制品 需要排查失败的测试时。

artifacts:when 示例

job:
  artifacts:
    when: on_failure

附加详情

  • artifacts:reports 创建的制品总是会上传,无论作业结果(成功或失败)。artifacts:when 不会改变此行为。

before_script

使用 before_script 定义一组命令,这些命令应在每个作业的 script 命令之前运行,但在恢复 制品 之后。

关键词类型:作业关键字。你只能在作业中或 default 部分 中使用它。

支持值:一个数组,包括:

CI/CD 变量 受支持

before_script 示例

job:
  before_script:
    - echo "Execute this command before any 'script:' commands."
  script:
    - echo "This command executes after the job's 'before_script' commands."

附加详情

  • 你在 before_script 中指定的脚本将与主 script 中指定的任何脚本连接在一起。组合后的脚本将在单个 shell 中一起执行。
  • 在顶级使用 before_script 但不在 default 部分中,已弃用

相关主题

cache

使用 cache 来指定要在作业之间缓存的文件和目录列表。你只能使用本地工作副本中的路径。

缓存具有以下特点:

  • 在流水线和作业之间共享。
  • 默认情况下,不会在 受保护的分支 和非受保护分支之间共享。
  • 制品 之前恢复。
  • 最多限制为四个不同的缓存(使用多个缓存)。

你可以 为特定作业禁用缓存,例如用于覆盖:

  • 使用 default 定义的默认缓存。
  • 通过 include 添加的作业配置。

有关缓存的更多信息,请参阅 GitLab CI/CD 中的缓存

cache:paths

使用 cache:paths 关键字来选择要缓存的文件或目录。

关键字类型:作业关键字。你只能在作业中使用它,或者在 default 部分 中使用。

支持值

cache:paths 示例

缓存 binaries 目录中以 .apk 结尾的所有文件以及 .config 文件:

rspec:
  script:
    - echo "This job uses a cache."
  cache:
    key: binaries-cache
    paths:
      - binaries/*.apk
      - .config

额外细节

  • cache:paths 关键字会包含文件,即使它们未被跟踪或在你的 .gitignore 文件中。

相关主题

cache:key

使用 cache:key 关键字为每个缓存提供一个唯一的标识键。所有使用相同缓存键的作业都会使用相同的缓存,包括在不同流水线中。

如果未设置,默认键为 default。所有带有 cache 关键字但没有 cache:key 的作业都会共享 default 缓存。

必须与 cache:paths 一起使用,否则不会缓存任何内容。

关键字类型:作业关键字。你只能在作业中使用它,或者在 default 部分 中使用。

支持值

  • 一个字符串。
  • 预定义的 CI/CD 变量
  • 两者的组合。

cache:key 示例

cache-job:
  script:
    - echo "This job uses a cache."
  cache:
    key: binaries-cache-$CI_COMMIT_REF_SLUG
    paths:
      - binaries/

额外细节

  • 如果你使用 Windows Batch 运行 shell 脚本,你必须将 $ 替换为 %。例如:key: %CI_COMMIT_REF_SLUG%
  • cache:key 值不能包含:
    • / 字符,或等效的 URI 编码 %2F
    • . 字符(任意数量),或等效的 URI 编码 %2E
  • 缓存在作业之间共享,因此如果你为不同作业使用不同的路径,你也应该设置不同的 cache:key。否则缓存内容可能会被覆盖。

相关主题

cache:key:files

使用 cache:key:files 关键词来生成新的键,当匹配定义的路径或模式的文件发生变化时。cache:key:files 让你可以重用一些缓存,并减少重建次数,从而加快后续流水线运行的效率。

关键词类型:作业关键词。你只能在作业中使用它,或者在默认部分中使用。

支持值

  • 最多包含两个文件路径或模式的数组。

CI/CD 变量不被支持。

cache:key:files 示例

cache-job:
  script:
    - echo "此作业使用缓存。"
  cache:
    key:
      files:
        - Gemfile.lock
        - package.json
    paths:
      - vendor/ruby
      - node_modules

此示例为 Ruby 和 Node.js 依赖项创建缓存。该缓存与当前版本的 Gemfile.lockpackage.json 文件绑定。当其中一个文件更改时,会计算新的缓存键并创建新缓存。任何未来使用相同 Gemfile.lockpackage.json 且配置了 cache:key:files 的作业运行都会使用新缓存,而不是重新构建依赖项。

附加详情

  • 缓存 key 是基于每个列出文件的最近提交计算的 SHA 值。 如果没有任何提交修改这些文件,回退键为 default
  • 可以使用通配符模式,如 **/package.json问题 存在以增加缓存键允许的路径或模式数量。
cache:key:prefix

使用 cache:key:prefix 将前缀与为 cache:key:files 计算的 SHA 结合起来。

关键词类型:作业关键词。你只能在作业中使用它,或者在默认部分中使用。

支持值

  • 一个字符串。
  • 预定义的CI/CD 变量
  • 两者的组合。

cache:key:prefix 示例

rspec:
  script:
    - echo "此 rspec 作业使用缓存。"
  cache:
    key:
      files:
        - Gemfile.lock
      prefix: $CI_JOB_NAME
    paths:
      - vendor/ruby

例如,添加 $CI_JOB_NAME 作为 prefix 会使键看起来像 rspec-feef9576d21ee9b6a32e30c5c79d0a0ceb68d1e5。如果某个分支修改了 Gemfile.lock,该分支会有一个新的 SHA 校验和用于 cache:key:files。会生成新的缓存键,并为该键创建新缓存。如果未找到 Gemfile.lock,前缀会被添加到 default 上,因此示例中的键会是 rspec-default

附加详情

  • 如果 cache:key:files 中的任何文件在任何提交中都未被修改,前缀会被添加到 default 键上。

cache:untracked

使用 untracked: true 来缓存 Git 仓库中所有未跟踪的文件。未跟踪文件包括:

缓存未跟踪文件可能会导致意外的大缓存,如果作业下载:

  • 通常未跟踪的依赖项,如 gem 或 node 模块。
  • 来自不同作业的工件。从工件中提取的文件默认是未跟踪的。

关键词类型:作业关键词。你只能在作业中使用它,或者在默认部分中使用。

支持值

  • truefalse(默认)。

cache:untracked 示例

rspec:
  script: test
  cache:
    untracked: true

附加详情

  • 你可以将 cache:untrackedcache:paths 组合,以缓存所有未跟踪文件以及配置路径中的文件。 使用 cache:paths 缓存任何特定文件,包括已跟踪文件或工作目录外的文件, 并使用 cache: untracked 同时缓存所有未跟踪文件。例如:

    rspec:
      script: test
      cache:
        untracked: true
        paths:
          - binaries/

    在此示例中,作业缓存仓库中所有未跟踪文件,以及 binaries/ 目录下的所有文件。 如果 binaries/ 中存在未跟踪文件,它们会被这两个关键词覆盖。

cache:unprotect

使用 cache:unprotect 设置缓存可在受保护和未受保护的分支之间共享。

当设置为 true 时,无权访问受保护分支的用户可以读取和写入受保护分支使用的缓存键。

关键词类型:作业关键词。你只能在作业中使用它,或者在默认部分中使用。

支持值

  • truefalse(默认)。

cache:unprotect 示例

rspec:
  script: test
  cache:
    unprotect: true

cache:when

使用 cache:when 定义何时保存缓存,依据作业状态而定。

必须与 cache: paths 一起使用,否则不会缓存任何内容。

关键字类型:作业关键字。你只能在作业中使用它,或在 default 部分 中使用。

支持值

  • on_success(默认):仅在作业成功时保存缓存。
  • on_failure:仅在作业失败时保存缓存。
  • always:始终保存缓存。

cache:when 示例

rspec:
  script: rspec
  cache:
    paths:
      - rspec/
    when: 'always'

此示例无论作业是否失败或成功都会存储缓存。

cache:policy

要更改缓存的下载和上传行为,请使用 cache:policy 关键字。
默认情况下,作业开始时会下载缓存,作业结束时会将更改上传到缓存。这种缓存风格是 pull-push 策略(默认)。

若要让作业仅在下一次作业开始时下载缓存,但在作业完成时从不上传更改,请使用 cache:policy:pull

若要让作业仅在作业完成时上传缓存,但在作业开始时不下载缓存,请使用 cache:policy:push

当你有大量并行执行的作业使用相同缓存时,请使用 pull 策略。此策略可加快作业执行速度并减少缓存服务器负载。你可以使用带有 push 策略的作业来构建缓存。

必须与 cache: paths 一起使用,否则不会缓存任何内容。

关键字类型:作业关键字。你只能在作业中使用它,或在 default 部分 中使用。

支持值

cache:policy 示例

prepare-dependencies-job:
  stage: build
  cache:
    key: gems
    paths:
      - vendor/bundle
    policy: push
  script:
    - echo "此作业仅下载依赖项并构建缓存。"
    - echo "下载依赖项..."

faster-test-job:
  stage: test
  cache:
    key: gems
    paths:
      - vendor/bundle
    policy: pull
  script:
    - echo "此作业脚本使用缓存,但不更新它。"
    - echo "运行测试..."

相关主题

cache:fallback_keys

使用 cache:fallback_keys 指定一组键,用于在未找到 cache:key 对应的缓存时尝试从中恢复缓存。缓存按 fallback_keys 部分中指定的顺序检索。

关键字类型:作业关键字。你只能在作业中使用它,或在 default 部分 中使用。

支持值

  • 一组缓存键数组

cache:fallback_keys 示例

rspec:
  script: rspec
  cache:
    key: gems-$CI_COMMIT_REF_SLUG
    paths:
      - rspec/
    fallback_keys:
      - gems
    when: 'always'

coverage

使用 coverage 和自定义正则表达式来配置如何从作业输出中提取代码覆盖率。如果作业输出中至少有一行匹配该正则表达式,则会在 UI 中显示覆盖率。

要从匹配结果中提取代码覆盖率值,GitLab 使用更小的正则表达式:\d+(?:\.\d+)?

支持值

  • 一个 RE2 正则表达式。必须以 / 开头和结尾。必须匹配覆盖率数字。也可以匹配周围的文本,因此无需使用正则表达式字符组来捕获确切的数字。由于它使用 RE2 语法,所有组都必须是非捕获的。

coverage 示例

job1:
  script: rspec
  coverage: '/Code coverage: \d+(?:\.\d+)?/'

在此示例中:

  1. GitLab 检查作业日志以查找与正则表达式的匹配。像 Code coverage: 67.89% of lines covered 这样的行会匹配。
  2. GitLab 然后检查匹配的片段以找到与正则表达式 \d+(?:\.\d+)? 的匹配。示例正则表达式可以匹配 67.89 的代码覆盖率。

附加详情

  • 你可以在 代码覆盖率 中找到正则表达式示例。
  • 如果作业输出中有多个匹配行,则使用最后一行(反向搜索的第一个结果)。
  • 如果单行中有多个匹配项,则会搜索最后一个匹配项以获取覆盖率数字。
  • 如果匹配片段中发现多个覆盖率数字,则使用第一个数字。
  • 会移除前导零。
  • 子流水线 的覆盖率输出不会被记录或显示。有关更多详情,请查看 相关问题

dast_configuration

  • 层级:Ultimate
  • 提供:GitLab.com、GitLab 自托管、GitLab Dedicated

使用 dast_configuration 关键字来指定要在 CI/CD 配置中使用的站点配置文件和扫描器配置文件。这两个配置文件必须先在项目中创建好。作业的阶段必须是 dast

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持值:各一个 site_profilescanner_profile

  • 使用 site_profile 指定作业中要使用的站点配置文件。
  • 使用 scanner_profile 指定作业中要使用的扫描器配置文件。

dast_configuration 示例

stages:
  - build
  - dast

include:
  - template: DAST.gitlab-ci.yml

dast:
  dast_configuration:
    site_profile: "Example Co"
    scanner_profile: "Quick Passive Test"

在此示例中,dast 作业扩展了通过 include 关键字添加的 dast 配置,以选择特定的站点配置文件和扫描器配置文件。

额外细节

  • 包含在站点配置文件或扫描器配置文件中的设置优先于 DAST 模板中包含的设置。

相关主题

dependencies

使用 dependencies 关键字定义要从哪些特定作业获取工件的列表。指定的作业都必须处于更早的阶段。你也可以将作业设置为完全不下载任何工件。

当作业中未定义 dependencies 时,所有较早阶段的作业都被视为依赖项,该作业会从这些作业获取所有工件。

若要从同一阶段的作业获取工件,你必须使用 needs:artifacts。你不应在同一个作业中同时使用 dependenciesneeds

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持值

  • 要从中获取工件的作业名称。
  • 一个空数组([]),用于将该作业配置为不下载任何工件。

dependencies 示例

build osx:
  stage: build
  script: make build:osx
  artifacts:
    paths:
      - binaries/

build linux:
  stage: build
  script: make build:linux
  artifacts:
    paths:
      - binaries/

test osx:
  stage: test
  script: make test:osx
  dependencies:
    - build osx

test linux:
  stage: test
  script: make test:linux
  dependencies:
    - build linux

deploy:
  stage: deploy
  script: make deploy
  environment: production

在此示例中,两个作业有工件:build osxbuild linux。当执行 test osx 时,会下载并提取 build osx 的工件到构建上下文中。test linuxbuild linux 的工件也是如此。

由于阶段的优先级,deploy 作业会从所有之前的作业下载工件。

额外细节

  • 作业状态无关紧要。如果作业失败或手动作业未被触发,不会发生错误。
  • 如果依赖作业的工件已过期被删除,则作业失败。

environment

使用 environment 定义作业部署到的环境

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持值:作业部署到的环境的名称,格式如下:

  • 纯文本,包括字母、数字、空格以及这些字符:-_/${}
  • CI/CD 变量,包括预定义、项目、组、实例或在 .gitlab-ci.yml 文件中定义的变量。不能使用在 script 部分中定义的变量。

environment 示例

deploy to production:
  stage: deploy
  script: git push production HEAD:main
  environment: production

额外细节

  • 如果指定了 environment 且不存在同名的环境,则会创建一个环境。

environment:name

设置环境的名称。

常见环境名称如 qastagingproduction,但你也可以使用任意名称。

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持值:作业部署到的环境的名称,格式如下:

  • 纯文本,包括字母、数字、空格以及这些字符:-_/${}
  • CI/CD 变量,包括预定义、项目、组、实例或在 .gitlab-ci.yml 文件中定义的变量。不能使用在 script 部分中定义的变量。

environment:name 示例

deploy to production:
  stage: deploy
  script: git push production HEAD:main
  environment:
    name: production

environment:url

环境设置一个URL。

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持的值:单个URL,格式如下:

  • 纯文本,如https://prod.example.com
  • CI/CD变量,包括预定义变量、项目变量、组变量、实例变量或.gitlab-ci.yml文件中定义的变量。你不能使用script部分中定义的变量。

environment:url 示例

deploy to production:
  stage: deploy
  script: git push production HEAD:main
  environment:
    name: production
    url: https://prod.example.com

附加细节

  • 作业完成后,你可以通过选择合并请求、环境或部署页面中的按钮来访问该URL。

environment:on_stop

关闭(停止)环境可以通过在environment下定义on_stop关键字来实现。它声明了一个不同的作业,用于关闭环境。

关键字类型:作业关键字。你只能将其用作作业的一部分。

附加细节

environment:action

使用action关键字指定作业如何与环境交互。

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持的值:以下关键字之一:

描述
start 默认值。表示作业启动环境。部署在作业启动后创建。
prepare 表示作业仅准备环境。不会触发部署。了解更多关于准备环境的信息
stop 表示作业停止环境。了解更多关于停止环境的信息
verify 表示作业仅验证环境。不会触发部署。了解更多关于验证环境的信息
access 表示作业仅访问环境。不会触发部署。了解更多关于访问环境的信息

environment:action 示例

stop_review_app:
  stage: deploy
  variables:
    GIT_STRATEGY: none
  script: make delete-app
  when: manual
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    action: stop

environment:auto_stop_in

auto_stop_in 关键字指定环境的生命周期。当环境过期时,GitLab 会自动停止它。

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持的值:用自然语言书写的时间段。例如,以下都是等效的:

  • 168 hours
  • 7 days
  • one week
  • never

CI/CD 变量受支持

environment:auto_stop_in 示例

review_app:
  script: deploy-review-app
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    auto_stop_in: 1 day

review_app 的环境被创建时,环境的生命周期设置为 1 天。每次重新部署评审应用时,该生命周期也会重置为 1 天

auto_stop_in 关键字可用于除 stop 之外的所有环境操作。某些操作可用于重置环境中计划的停止时间。有关更多信息,请参阅访问环境以进行准备或验证目的

相关主题

environment:kubernetes

使用 kubernetes 关键字为环境配置 Kubernetes仪表板

关键字类型:作业关键字。你只能在作业中使用它。

支持值

  • agent:一个字符串,指定 GitLab Kubernetes代理。格式为 path/to/agent/project:agent-name。如果代理连接到运行管道的项目,请使用 $CI_PROJECT_PATH:agent-name
  • namespace:一个字符串,表示部署环境的Kubernetes命名空间。必须与 agent 关键字一起设置。
  • flux_resource_path:一个字符串,表示Flux资源的完整路径(例如HelmRelease)。必须与 agentnamespace 关键字一起设置。

environment:kubernetes 示例

deploy:
  stage: deploy
  script: make deploy-app
  environment:
    name: production
    kubernetes:
      agent: path/to/agent/project:agent-name
      namespace: my-namespace
      flux_resource_path: helm.toolkit.fluxcd.io/v2/namespaces/flux-system/helmreleases/helm-release-resource

此配置:

  • 设置 deploy 作业以部署到 production 环境
  • 将名为 agent-name代理 与环境关联
  • 为具有命名空间 my-namespaceflux_resource_path 设为 helm.toolkit.fluxcd.io/v2/namespaces/flux-system/helmreleases/helm-release-resource 的环境配置 Kubernetes仪表板

附加细节

  • 要使用仪表板,你必须 安装GitLab Kubernetes代理,并为环境的项目或其父组 配置 user_access
  • 运行作业的用户必须有权访问集群代理。否则,仪表板会忽略 agentnamespaceflux_resource_path 属性。
  • 如果你想仅设置 agent,则不必设置 namespace,也不能设置 flux_resource_path。但是,此配置会在Kubernetes仪表板中列出集群中的所有命名空间。

environment:deployment_tier

使用 deployment_tier 关键字指定部署环境的层级。

关键字类型:作业关键字。你只能在作业中使用它。

支持值:以下之一:

  • production
  • staging
  • testing
  • development
  • other

environment:deployment_tier 示例

deploy:
  script: echo
  environment:
    name: customer-portal
    deployment_tier: production

此配置:

  • 创建一个名为 customer-portal 且部署层级为 production 的环境

附加细节

  • 从此作业定义创建的环境会基于此值分配一个 层级
  • 如果稍后添加此值,现有环境的层级不会更新。现有环境必须通过 Environments API 更新其层级。

相关主题

动态环境

使用CI/CD 变量 动态命名环境。

例如:

deploy as review app:
  stage: deploy
  script: make deploy
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    url: https://$CI_ENVIRONMENT_SLUG.example.com/

deploy as review app 作业被标记为部署操作,以动态创建 review/$CI_COMMIT_REF_SLUG 环境。$CI_COMMIT_REF_SLUG 是由runner设置的 CI/CD变量$CI_ENVIRONMENT_SLUG 变量基于环境名称,但适合包含在URL中。如果 deploy as review app 作业在名为 pow 的分支中运行,该环境可通过类似 https://review-pow.example.com/ 的URL访问。

常见用例是为分支创建动态环境并将其用作预览应用。你可以查看使用预览应用的示例:https://gitlab.com/gitlab-examples/review-apps-nginx/

extends

使用 extends 来复用配置片段。它是 YAML 锚点 的替代方案,并且更灵活且可读性更强。

关键词类型:作业关键字。你只能在作业中使用它。

支持的值

  • 另一个管道中的作业名称。
  • 一个列表(数组),包含其他管道中的作业名称。

extends 示例

.tests:
  stage: test
  image: ruby:3.0

rspec:
  extends: .tests
  script: rake rspec

rubocop:
  extends: .tests
  script: bundle exec rubocop

在这个示例中,rspec 作业使用了 .tests 模板作业的配置。创建管道时,GitLab 会:

  • 执行基于键的反向深度合并。
  • .tests 的内容与 rspec 作业合并。
  • 不合并键的值。

组合后的配置等效于这些作业:

rspec:
  stage: test
  image: ruby:3.0
  script: rake rspec

rubocop:
  stage: test
  image: ruby:3.0
  script: bundle exec rubocop

额外细节

  • 你可以为 extends 使用多个父级。
  • extends 关键字支持最多十一层继承,但你应该避免使用超过三层。
  • 在前面的示例中,.tests 是一个 隐藏作业,但你也可以从常规作业中扩展配置。

相关主题

hooks

使用 hooks 来指定要在运行器上执行的命令列表,以在作业执行的某些阶段执行,例如在获取 Git 仓库之前。

关键词类型:作业关键字。你只能在作业或 default 部分 中使用它。

支持的值

  • 钩子及其命令的哈希表。可用的钩子:pre_get_sources_script

hooks:pre_get_sources_script

使用 hooks:pre_get_sources_script 来指定要在运行器上执行的命令列表,以在克隆 Git 仓库及其子模块之前执行。例如可以用于:

支持的值:一个数组,包括:

CI/CD 变量 受支持

hooks:pre_get_sources_script 示例

job1:
  hooks:
    pre_get_sources_script:
      - echo 'hello job1 pre_get_sources_script'
  script: echo 'hello job1 script'

相关主题

identity

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com
  • Status: Beta

此功能处于 beta 阶段。

使用 identity 通过身份联合验证第三方服务。

关键字类型:作业关键字。你只能在作业中或 default: 部分 中使用它。

支持值:标识符。支持的服务商:

identity 示例

job_with_workload_identity:
  identity: google_cloud
  script:
    - gcloud compute instances list

相关主题

id_tokens

使用 id_tokens 创建 JSON Web Tokens (JWT),以通过第三方服务进行身份验证。通过这种方式创建的所有 JWT 都支持 OIDC 身份验证。必需的 aud 子关键字用于配置 JWT 的 aud 声明。

支持值

  • 包含其 aud 声明的令牌名称。aud 支持:

id_tokens 示例

job_with_id_tokens:
  id_tokens:
    ID_TOKEN_1:
      aud: https://vault.example.com
    ID_TOKEN_2:
      aud:
        - https://gcp.com
        - https://aws.com
    SIGSTORE_ID_TOKEN:
      aud: sigstore
  script:
    - command_to_authenticate_with_vault $ID_TOKEN_1
    - command_to_authenticate_with_aws $ID_TOKEN_2
    - command_to_authenticate_with_gcp $ID_TOKEN_2

相关主题

image

使用 image 指定作业运行的 Docker 镜像。

关键字类型:作业关键字。你只能在作业中或 default 部分 中使用它。

支持值:镜像名称,如果需要包含注册表路径,可采用以下格式之一:

  • <image-name>(等同于使用带有 latest 标签的 <image-name>
  • <image-name>:<tag>
  • <image-name>@<digest>

CI/CD 变量 受支持。

image 示例

default:
  image: ruby:3.0

rspec:
  script: bundle exec rspec

rspec 2.7:
  image: registry.example.com/my-group/my-project/ruby:2.7
  script: bundle exec rspec

在此示例中,ruby:3.0 镜像是管道中所有作业的默认镜像。rspec 2.7 作业未使用默认设置,因为它用自己的 image 节覆盖了默认值。

相关主题

image:name

作业运行的 Docker 镜像名称。类似于单独使用的 image

关键字类型:作业关键字。你只能在作业中或 default 部分 中使用它。

支持值:镜像名称,如果需要包含注册表路径,可采用以下格式之一:

  • <image-name>(等同于使用带有 latest 标签的 <image-name>
  • <image-name>:<tag>
  • <image-name>@<digest>

CI/CD 变量 受支持。

image:name 示例

test-job:
  image:
    name: "registry.example.com/my/image:latest"
  script: echo "Hello world"

相关主题

image:entrypoint

作为容器入口点执行的命令或脚本。

当创建 Docker 容器时,entrypoint 会转换为 Docker 的 --entrypoint 选项。 其语法类似于 Dockerfile ENTRYPOINT 指令,其中每个 shell 标记在数组中是一个单独的字符串。

关键字类型:作业关键字。你只能在作业中使用它,或在 default 部分 中使用。

支持的值

  • 一个字符串。

image:entrypoint 示例

test-job:
  image:
    name: super/sql:experimental
    entrypoint: [""]
  script: echo "Hello world"

相关主题

image:docker

使用 image:dockerDocker 执行器Kubernetes 执行器 传递选项。此关键字不适用于其他执行器类型。

关键字类型:作业关键字。你只能在作业中使用它,或在 default 部分 中使用。

支持的值

一个用于 Docker 执行器的选项哈希,可以包含:

  • platform:选择要拉取的镜像架构。未指定时,默认与主机运行程序的平台相同。
  • user:指定运行容器时使用的用户名或 UID。

image:docker 示例

arm-sql-job:
  script: echo "Run sql tests"
  image:
    name: super/sql:experimental
    docker:
      platform: arm64/v8
      user: dave

附加细节

image:kubernetes

使用 image:kubernetes 向 GitLab Runner Kubernetes 执行器 传递选项。此关键字不适用于其他执行器类型。

关键字类型:作业关键字。你只能在作业中使用它,或在 default 部分 中使用。

支持的值

一个用于 Kubernetes 执行器的选项哈希,可以包含:

  • user:指定容器运行时使用的用户名或 UID。你也可以使用 UID:GID 格式来设置 GID。

仅包含 UID 的 image:kubernetes 示例

arm-sql-job:
  script: echo "Run sql tests"
  image:
    name: super/sql:experimental
    kubernetes:
      user: "1001"

同时包含 UID 和 GID 的 image:kubernetes 示例

arm-sql-job:
  script: echo "Run sql tests"
  image:
    name: super/sql:experimental
    kubernetes:
      user: "1001:1001"

image:pull_policy

Runner 用于获取 Docker 镜像的拉取策略。

Keyword type: 作业关键字。你只能在作业中使用它,或在 default 部分 中使用。

Supported values:

  • 单个拉取策略,或数组中的多个拉取策略。可以是 alwaysif-not-presentnever

Examples of image:pull_policy:

job1:
  script: echo "A single pull policy."
  image:
    name: ruby:3.0
    pull_policy: if-not-present

job2:
  script: echo "Multiple pull policies."
  image:
    name: ruby:3.0
    pull_policy: [always, if-not-present]

Additional details:

  • 如果 Runner 不支持定义的拉取策略,作业会失败并显示类似以下错误的错误信息:ERROR: Job failed (system failure): the configured PullPolicies ([always]) are not allowed by AllowedPullPolicies ([never])

Related topics:

inherit

使用 inherit 来控制默认关键字和变量的继承(相关链接)。

inherit:default

使用 inherit:default 来控制默认关键字的继承(相关链接)。

Keyword type: 作业关键字。你只能在作业中使用它。

Supported values:

  • true(默认)或 false 以启用或禁用所有默认关键字的继承。
  • 要继承的特定默认关键字列表。

Example of inherit:default:

default:
  retry: 2
  image: ruby:3.0
  interruptible: true

job1:
  script: echo "This job does not inherit any default keywords."
  inherit:
    default: false

job2:
  script: echo "This job inherits only the two listed default keywords. It does not inherit 'interruptible'."
  inherit:
    default:
      - retry
      - image

Additional details:

  • 你也可以在一行中列出要继承的默认关键字:default: [keyword1, keyword2]

inherit:variables

使用 inherit:variables 来控制默认变量关键字的继承(相关链接)。

Keyword type: 作业关键字。你只能在作业中使用它。

Supported values:

  • true(默认)或 false 以启用或禁用所有默认变量的继承。
  • 要继承的特定变量列表。

Example of inherit:variables:

variables:
  VARIABLE1: "This is default variable 1"
  VARIABLE2: "This is default variable 2"
  VARIABLE3: "This is default variable 3"

job1:
  script: echo "This job does not inherit any default variables."
  inherit:
    variables: false

job2:
  script: echo "This job inherits only the two listed default variables. It does not inherit 'VARIABLE3'."
  inherit:
    variables:
      - VARIABLE1
      - VARIABLE2

Additional details:

  • 你也可以在一行中列出要继承的默认变量:variables: [VARIABLE1, VARIABLE2]

interruptible

使用 interruptible 来配置 自动取消冗余流水线 功能,以便在同一引用的新提交启动新流水线时,在作业完成前将其取消。如果该功能已禁用,此关键字将不起作用。新流水线必须针对包含新更改的提交。例如,如果你在界面中选择“新建流水线”来运行相同提交的流水线,自动取消冗余流水线 功能将不会生效。

自动取消冗余流水线 功能的行为可以通过 workflow:auto_cancel:on_new_commit 设置进行控制。

关键字类型:作业关键字。你只能将它用作作业的一部分或在 default 部分 中使用。

支持的值

  • truefalse(默认)。

带有默认行为的 interruptible 示例

workflow:
  auto_cancel:
    on_new_commit: conservative # the default behavior

stages:
  - stage1
  - stage2
  - stage3

step-1:
  stage: stage1
  script:
    - echo "可以被取消。"
  interruptible: true

step-2:
  stage: stage2
  script:
    - echo "不能被取消。"

step-3:
  stage: stage3
  script:
    - echo "因为 step-2 不能被取消,所以即使设置了 interruptible,这个步骤也永远无法被取消。"
  interruptible: true

在此示例中,新流水线会导致正在运行的流水线:

  • 被取消,仅当 step-1 正在运行或等待执行时。
  • 不被取消,在 step-2 开始之后。

带有 auto_cancel:on_new_commit:interruptible 设置的 interruptible 示例

workflow:
  auto_cancel:
    on_new_commit: interruptible

stages:
  - stage1
  - stage2
  - stage3

step-1:
  stage: stage1
  script:
    - echo "可以被取消。"
  interruptible: true

step-2:
  stage: stage2
  script:
    - echo "不能被取消。"

step-3:
  stage: stage3
  script:
    - echo "可以被取消。"
  interruptible: true

在此示例中,新流水线会导致正在运行或等待执行的 step-1step-3 被取消。

其他详细信息

  • 仅当作业可以在启动后被安全取消时,才应设置 interruptible: true,例如构建作业。部署作业通常不应被取消,以避免部分部署。
  • 当使用默认行为或 workflow:auto_cancel:on_new_commit: conservative 时:
    • 尚未开始的作业始终被视为 interruptible: true,无论作业配置如何。interruptible 配置仅在作业开始后才被考虑。
    • 只有当所有正在运行的作业都配置为 interruptible: true,或者从未有过配置为 interruptible: false 的作业开始时,运行中 的流水线才会被取消。一旦有配置为 interruptible: false 的作业开始,整个流水线就不再被认为是可中断的。
    • 如果流水线触发了下游流水线,但下游流水线中尚未有 interruptible: false 的作业开始,则下游流水线也会被取消。
  • 你可以在流水线的第一阶段添加一个可选的手动作业,并设置 interruptible: false,以允许用户手动阻止流水线被自动取消。用户启动该作业后,流水线将无法通过 自动取消冗余流水线 功能被取消。
  • 当与 trigger job 一起使用 interruptible 时:
    • 由触发作业触发的下游流水线永远不会受到触发作业 interruptible 配置的影响。
    • 如果 workflow:auto_cancel 设置为 conservative,触发作业的 interruptible 配置将不起作用。
    • 如果设置为 interruptible,配置为 interruptible: true 的触发作业可以被自动取消。

needs

使用 needs 可不按顺序执行作业。使用 needs 的作业之间的关系可以可视化为一个有向无环图

你可以忽略阶段顺序,运行一些作业而不等待其他作业完成。多个阶段的作业可以并发运行。

关键字类型:作业关键字。你只能在作业中使用它。

支持值

  • 作业数组(最多50个作业)。
  • 空数组([]),用于设置作业在流水线创建后立即开始。

needs 示例

linux:build:
  stage: build
  script: echo "Building linux..."

mac:build:
  stage: build
  script: echo "Building mac..."

lint:
  stage: test
  needs: []
  script: echo "Linting..."

linux:rspec:
  stage: test
  needs: ["linux:build"]
  script: echo "Running rspec on linux..."

mac:rspec:
  stage: test
  needs: ["mac:build"]
  script: echo "Running rspec on mac..."

production:
  stage: deploy
  script: echo "Running production..."
  environment: production

此示例创建了四条执行路径:

  • Linter:lint 作业立即运行,无需等待 build 阶段完成,因为它没有依赖项(needs: [])。
  • Linux 路径:linux:rspec 作业在 linux:build 作业完成后立即运行,无需等待 mac:build 完成。
  • macOS 路径:mac:rspec 作业在 mac:build 作业完成后立即运行,无需等待 linux:build 完成。
  • production 作业在所有之前的作业完成后立即运行:lintlinux:buildlinux:rspecmac:buildmac:rspec

附加详情

  • 单个作业的 needs 数组中可包含的最大作业数量有限制:
  • 如果 needs 指向使用了 parallel 关键字的作业,它会依赖所有并行创建的作业,而不仅仅是其中一个作业。默认情况下,它会下载所有并行作业的制品;若制品名称相同,则会相互覆盖,仅保存最后下载的一个。
    • 若要让 needs 仅指向并行化作业的子集(而非全部并行化作业),请使用 needs:parallel:matrix 关键字。
  • 你可以引用与你正在配置的作业处于同一阶段的作业。
  • 如果 needs 指向由于 onlyexceptrules 而可能未被添加到流水线的作业,则流水线可能无法创建。使用 needs:optional 关键字来解决流水线创建失败的问题。
  • 如果一个流水线中有 needs: [] 的作业和在 .pre 阶段的作业,它们都会在流水线创建后立即启动。needs: [] 的作业立即启动,.pre 阶段的作业也会立即启动。

needs:artifacts

当作业使用 needs 时,默认情况下不再下载之前阶段的所有制品,因为使用 needs 的作业可以在较早阶段完成前启动。使用 needs 时,你只能从 needs 配置中列出的作业下载制品。

使用 artifacts: true(默认)或 artifacts: false 来控制在使用 needs 的作业中何时下载制品。

关键字类型:作业关键字。你只能在作业中使用它。必须与 needs:job 一起使用。

支持值

  • true(默认)或 false

needs:artifacts 示例

test-job1:
  stage: test
  needs:
    - job: build_job1
      artifacts: true

test-job2:
  stage: test
  needs:
    - job: build_job2
      artifacts: false

test-job3:
  needs:
    - job: build_job1
      artifacts: true
    - job: build_job2
    - build_job3

在此示例中:

  • test-job1 作业下载 build_job1 的制品。
  • test-job2 作业不下载 build_job2 的制品。
  • test-job3 作业下载所有三个 build_jobs 的制品,因为所有三个所需作业的 artifactstrue,或者默认为 true

附加详情

  • 你不应在同一个作业中同时使用 needsdependencies

needs:project

  • 层级:Premium、Ultimate
  • 提供:GitLab.com、GitLab 自托管、GitLab Dedicated

使用 needs:project 可从其他管道中的最多五个作业下载工件。工件将从指定引用的最新成功指定作业中下载。若要指定多个作业,请在 needs 关键字下将每个作业作为单独的数组项添加。

如果存在针对该引用运行的管道,带有 needs:project 的作业不会等待管道完成。相反,工件会从指定作业的最新成功运行中下载。

needs:project 必须与 jobrefartifacts 一起使用。

关键字类型:作业关键字。你只能在作业中使用它。

支持的值

  • needs:project:包含命名空间和组的完整项目路径。
  • job:从中下载工件的作业。
  • ref:从中下载工件的引用。
  • artifacts:必须为 true 才能下载工件。

needs:project 示例

build_job:
  stage: build
  script:
    - ls -lhR
  needs:
    - project: namespace/group/project-name
      job: build-1
      ref: main
      artifacts: true
    - project: namespace/group/project-name-2
      job: build-2
      ref: main
      artifacts: true

在此示例中,build_jobgroup/project-namegroup/project-name-2 项目中 main 分支上的最新成功 build-1build-2 作业下载工件。

你可以在 needs:project 中使用 CI/CD 变量,例如:

build_job:
  stage: build
  script:
    - ls -lhR
  needs:
    - project: $CI_PROJECT_PATH
      job: $DEPENDENCY_JOB_NAME
      ref: $ARTIFACTS_DOWNLOAD_REF
      artifacts: true

额外细节

  • 要从当前项目中的不同管道下载工件,请将 project 设置为与当前项目相同,但使用不同于当前管道的引用。在相同引用上运行的并发管道可能会覆盖工件。
  • 运行管道的用户必须至少具有组或项目的 Reporter 角色,或者组/项目必须具有公开可见性。
  • 你不能在同一作业中使用 needs:projecttrigger
  • 当使用 needs:project 从另一个管道下载工件时,作业不会等待所需作业完成。使用 needs 等待作业完成 仅限于同一管道中的作业。确保其他管道中的所需作业在需要它的作业尝试下载工件之前完成。
  • 你不能从以 parallel 方式运行的作业中下载工件。
  • 支持 在 projectjobref 中使用 CI/CD 变量

相关主题

needs:pipeline:job

一个子流水线可以从其父流水线或同一父子流水线层级中的另一个子流水线中下载成功完成作业的制品。

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持值

  • needs:pipeline:流水线 ID。必须是同一父子流水线层级中存在的流水线。
  • job:要从中下载制品的作业。

needs:pipeline:job 示例

  • 父流水线(.gitlab-ci.yml):

    stages:
      - build
      - test
    
    create-artifact:
      stage: build
      script: echo "sample artifact" > artifact.txt
      artifacts:
        paths: [artifact.txt]
    
    child-pipeline:
      stage: test
      trigger:
        include: child.yml
        strategy: mirror
      variables:
        PARENT_PIPELINE_ID: $CI_PIPELINE_ID
  • 子流水线(child.yml):

    use-artifact:
      script: cat artifact.txt
      needs:
        - pipeline: $PARENT_PIPELINE_ID
          job: create-artifact

在此示例中,父流水线中的 create-artifact 作业创建了一些制品。child-pipeline 作业触发了一个子流水线,并将 CI_PIPELINE_ID 变量作为新的 PARENT_PIPELINE_ID 变量传递给子流水线。子流水线可以在 needs:pipeline 中使用该变量从父流水线下载制品。将 create-artifactchild-pipeline 作业放在后续阶段中,可确保 use-artifact 作业仅在 create-artifact 成功完成后执行。

附加详情

  • pipeline 属性不接受当前流水线 ID($CI_PIPELINE_ID)。若要从当前流水线中的作业下载制品,请使用needs:artifacts
  • 你不能在触发作业中使用 needs:pipeline:job,也不能从多项目流水线获取制品。若要从多项目流水线获取制品,请使用needs:project
  • needs:pipeline:job 中列出的作业必须以 success 状态完成,否则无法获取制品。问题 367229 建议允许从任何有制品的作业中获取制品。

needs:optional

若需要一个有时不存在于流水线中的作业,请在 needs 配置中添加 optional: true。如果未定义,默认值为 optional: false

GitLab 在启动流水线前检查 needs 关系:

  • 如果 needs 条目包含 optional: true 且所需作业存在于流水线中,则该作业会等待其完成后再启动。
  • 如果所需作业不存在,则该作业可在满足其他需求条件后立即启动。
  • 如果 needs 部分仅包含可选作业且均未加入流水线,则该作业会立即启动(与空 needs 条目相同:needs: [])。
  • 如果所需作业的 optional: false 但未加入流水线,则流水线启动失败,错误信息类似:'job1' 作业需要 'job2' 作业,但它未被加入流水线

关键字类型:作业关键字。你只能将其用作作业的一部分。

needs:optional 示例

build-job:
  stage: build

test-job1:
  stage: test

test-job2:
  stage: test
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

deploy-job:
  stage: deploy
  needs:
    - job: test-job2
      optional: true
    - job: test-job1
  environment: production

review-job:
  stage: deploy
  needs:
    - job: test-job2
      optional: true
  environment: review

在此示例中:

  • build-jobtest-job1test-job2 按阶段顺序启动。
  • 当分支是默认分支时,test-job2 被加入流水线,因此:
    • deploy-job 等待 test-job1test-job2 完成后再启动。
    • review-job 等待 test-job2 完成后再启动。
  • 当分支不是默认分支时,test-job2 未被加入流水线,因此:
    • deploy-job 仅等待 test-job1 完成,不会等待缺失的 test-job2
    • review-job 无其他所需作业,会立即启动(与 build-job 同时),如同 needs: []

needs:pipeline

你可以使用 needs:pipeline 关键字将上游管道的状态镜像到一个作业中。默认分支的最新管道状态会被复制到该作业。

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持的值

  • 完整的项目路径,包括命名空间和组。如果项目位于同一组或命名空间内,你可以从 project 关键字中省略它们。例如:project: group/project-nameproject: project-name

needs:pipeline 示例

upstream_status:
  stage: test
  needs:
    pipeline: other/project

额外细节

  • 如果你在 needs:pipeline 中添加 job 关键字,该作业将不再镜像管道状态。行为会变为 needs:pipeline:job

needs:parallel:matrix

作业可以使用 parallel:matrix 在单个管道中多次并行运行一个作业,但每个作业实例使用不同的变量值。

使用 needs:parallel:matrix 可以根据并行化的作业无序执行作业。

关键字类型:作业关键字。你只能将其用作作业的一部分。必须与 needs:job 一起使用。

支持的值:变量的哈希数组:

  • 变量和值必须从 parallel:matrix 作业中定义的变量和值中选择。

needs:parallel:matrix 示例

linux:build:
  stage: build
  script: echo "Building linux..."
  parallel:
    matrix:
      - PROVIDER: aws
        STACK:
          - monitoring
          - app1
          - app2

linux:rspec:
  stage: test
  needs:
    - job: linux:build
      parallel:
        matrix:
          - PROVIDER: aws
            STACK: app1
  script: echo "Running rspec on linux..."

上面的示例生成以下作业:

linux:build: [aws, monitoring]
linux:build: [aws, app1]
linux:build: [aws, app2]
linux:rspec

linux:rspec 作业会在 linux:build: [aws, app1] 作业完成后立即运行。

相关主题

额外细节

  • needs:parallel:matrix 中的矩阵变量顺序必须与所需作业中的矩阵变量顺序匹配。例如,在上面的示例中反转 linux:rspec 作业中的变量顺序将是无效的:

    linux:rspec:
      stage: test
      needs:
        - job: linux:build
          parallel:
            matrix:
              - STACK: app1        # 变量顺序与 `linux:build` 不匹配,无效。
                PROVIDER: aws
      script: echo "Running rspec on linux..."

pages

使用 pages 定义一个 GitLab Pages 作业,将静态内容上传到 GitLab。然后这些内容会作为网站发布。

你必须:

  • 定义 pages: true 以发布名为 public 的目录
  • 或者,如果你想使用不同的内容目录,定义 pages.publish
  • 在内容目录的根目录中有一个非空的 index.html 文件。

关键字类型:作业关键字或作业名称(已弃用)。你只能将其用作作业的一部分。

支持的值

  • 布尔值。设置为 true 时使用默认配置
  • 配置选项的哈希,详见以下章节。

pages 示例

create-pages:
  stage: deploy
  script:
    - mv my-html-content public
  pages: true  # 指定这是一个 Pages 作业,并发布默认的 public 目录
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  environment: production

此示例将 my-html-content/ 目录重命名为 public/。该目录作为工件导出,并通过 GitLab Pages 发布。

使用配置哈希的示例

create-pages:
  stage: deploy
  script:
    - echo "nothing to do here"
  pages:  # 指定这是一个 Pages 作业,并发布默认的 public 目录
    publish: my-html-content
    expire_in: "1 week"
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  environment: production

此示例不移动目录,而是直接使用 publish 属性。它还配置页面部署在一周后自动取消发布。

额外细节

  • pages 用作作业名称 已被弃用
  • 若要将 pages 用作作业名称而不触发 Pages 部署,请将 pages 属性设为 false

pages.publish

使用 pages.publish 配置 pages 作业的内容目录。

关键字类型:作业关键字。你只能将其用作 pages 作业的一部分。

支持值:包含 Pages 内容的目录路径。在 GitLab 17.10 及更高版本中,若未指定,则使用默认的 public 目录;若已指定,此路径会自动附加到 artifacts:paths

pages.publish 示例

create-pages:
  stage: deploy
  script:
    - npx @11ty/eleventy --input=path/to/eleventy/root --output=dist
  pages:
    publish: dist  # 此路径会自动附加到 artifacts:paths
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  environment: production

此示例使用 Eleventy 生成静态网站,并将生成的 HTML 文件输出到 dist/ 目录。该目录作为工件导出并由 GitLab Pages 发布。

你也可以在 pages.publish 字段中使用变量。例如:

create-pages:
  stage: deploy
  script:
    - mkdir -p $CUSTOM_FOLDER/$CUSTOM_PATH
    - cp -r public $CUSTOM_FOLDER/$CUSTOM_SUBFOLDER
  pages:
    publish: $CUSTOM_FOLDER/$CUSTOM_SUBFOLDER  # 此路径会自动附加到 artifacts:paths
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  variables:
    CUSTOM_FOLDER: "custom_folder"
    CUSTOM_SUBFOLDER: "custom_subfolder"

指定的发布路径必须相对于构建根目录。

额外细节

  • 顶级 publish 关键字已弃用,现在必须嵌套在 pages 关键字下

pages.path_prefix

  • Tier: Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
  • Status: Beta

使用 pages.path_prefix 为 GitLab Pages 的并行部署配置路径前缀。

关键字类型:作业关键字。你只能将其用作 pages 作业的一部分。

支持值

给定值会被转换为小写并缩短至 63 字节。除字母数字字符或句点外的所有字符都会被替换为连字符。不允许以连字符或句点开头或结尾。

pages.path_prefix 示例

create-pages:
  stage: deploy
  script:
    - echo "Pages 可通过 ${CI_PAGES_URL}/${CI_COMMIT_BRANCH} 访问"
  pages:  # 指定这是一个 Pages 作业并发布默认的 public 目录
    path_prefix: "$CI_COMMIT_BRANCH"

在此示例中,为每个分支创建不同的 Pages 部署。

pages.expire_in

  • Tier: 高级版, 旗舰版
  • Offering: GitLab.com, GitLab 自托管, GitLab 专用

使用 expire_in 来指定部署在过期前应可用的时间。部署过期后,会由每10分钟运行一次的cron作业停用。

默认情况下,并行部署 会在24小时后自动过期。 若要禁用此行为,请将值设置为 never

关键字类型:作业关键字。你只能将其用作 pages 作业的一部分。

支持的值:过期时间。如果未提供单位,则以秒为单位。也支持变量。有效值包括:

  • '42'
  • 42 秒
  • 3 分钟 4 秒
  • 2 小时 20 分钟
  • 2h20min
  • 6 个月 1 天
  • 47 年 6 个月 4天
  • 3 周和 2 天
  • never
  • $DURATION

pages.expire_in 示例

创建页面:
  stage: deploy
  script:
    - echo "页面可通过 ${CI_PAGES_URL} 访问"
  pages:  # 指定这是一个 Pages 作业并发布默认公共目录
    expire_in: 1 

parallel

使用 parallel 在单个管道中多次并行运行一个作业。

必须存在多个 runner,或单个 runner 必须配置为同时运行多个作业。

并行作业按顺序命名为 job_name 1/Njob_name N/N

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持的值

  • 介于 1200 之间的数值。

parallel 示例

测试:
  script: rspec
  parallel: 5

此示例创建了5个并行运行的作业,命名为 测试 1/5测试 5/5

额外细节

  • 每个并行作业都设置了 CI_NODE_INDEXCI_NODE_TOTAL 预定义CI/CD变量。
  • 使用 parallel 的作业的管道可能会:
    • 创建比可用runner更多的并行运行作业。多余的作业会被排队并标记为 pending,等待可用runner。
    • 创建过多作业,导致管道因 job_activity_limit_exceeded 错误而失败。活跃管道中可存在的作业数量受实例级限制。

相关主题

parallel:matrix

使用 parallel:matrix 在单个流水线中并行运行一个作业多次,但每个作业实例使用不同的变量值。

必须存在多个 runner,或者单个 runner 必须配置为同时运行多个作业。

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持值:变量的哈希数组:

  • 变量名只能使用数字、字母和下划线(_)。
  • 值必须是字符串或字符串数组。
  • 排列数量不能超过 200。

parallel:matrix 示例

deploystacks:
  stage: deploy
  script:
    - bin/deploy
  parallel:
    matrix:
      - PROVIDER: aws
        STACK:
          - monitoring
          - app1
          - app2
      - PROVIDER: ovh
        STACK: [monitoring, backup, app]
      - PROVIDER: [gcp, vultr]
        STACK: [data, processing]
  environment: $PROVIDER/$STACK

该示例生成 10 个并行的 deploystacks 作业,每个作业的 PROVIDERSTACK 值不同:

deploystacks: [aws, monitoring]
deploystacks: [aws, app1]
deploystacks: [aws, app2]
deploystacks: [ovh, monitoring]
deploystacks: [ovh, backup]
deploystacks: [ovh, app]
deploystacks: [gcp, data]
deploystacks: [gcp, processing]
deploystacks: [vultr, data]
deploystacks: [vultr, processing]

额外详情

  • parallel:matrix 作业会将变量值添加到作业名称中以区分各个作业,但大值可能导致名称超出限制

    • 作业名称 必须不超过 255 个字符。
    • 当使用 needs 时,作业名称必须不超过 128 个字符。
  • 你不能创建具有相同变量值但不同变量名的多个矩阵配置。作业名称由变量值生成,而非变量名,因此具有相同值的矩阵条目会生成相同的作业名称,从而相互覆盖。

    例如,这个 test 配置会尝试创建两个系列相同的作业,但 OS2 版本会覆盖 OS 版本:

    test:
      parallel:
        matrix:
          - OS: [ubuntu]
            PROVIDER: [aws, gcp]
          - OS2: [ubuntu]
            PROVIDER: [aws, gcp]

相关主题

release

使用 release 来创建一个发布

发布作业必须能够访问 release-cli,且该工具必须在 $PATH 环境变量中。

如果您使用Docker执行器,可以使用来自GitLab容器注册表的此镜像:registry.gitlab.com/gitlab-org/release-cli:latest

如果您使用Shell执行器或类似方式,请在Runner注册的服务器上安装 release-cli

关键字类型:作业关键字。您只能在作业中使用它。

支持值release 的子键:

release 关键字示例

release_job:
  stage: release
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  rules:
    - if: $CI_COMMIT_TAG                  # 当手动创建标签时运行此作业
  script:
    - echo "Running the release job."
  release:
    tag_name: $CI_COMMIT_TAG
    name: 'Release $CI_COMMIT_TAG'
    description: 'Release created using the release-cli.'

此示例会在以下情况创建发布:

  • 推送Git标签时。
  • 在UI的代码 > 标签处添加Git标签时。

附加详情

  • 所有发布作业(除触发作业外)都必须包含 script 关键字。发布作业可使用脚本命令的输出。若无需脚本,可使用占位符:

    script:
      - echo "release job"

    存在问题以移除此要求。

  • release 部分在 script 关键字之后、after_script 之前执行。

  • 仅当作业的主脚本成功时才会创建发布。

  • 若发布已存在,则不会更新,且带有 release 关键字的作业会失败。

相关主题

release:tag_name

必需项。用于发布的Git标签。

若项目中尚不存在该标签,则会与发布同时创建。新标签使用与管道关联的SHA。

关键字类型:作业关键字。您只能在作业中使用它。

支持值

  • 标签名。

CI/CD 变量受支持

release:tag_name 示例

要在项目新增标签时创建发布:

  • 使用 $CI_COMMIT_TAG CI/CD 变量作为 tag_name
  • 使用 rules:if 配置作业仅在新增标签时运行。
job:
  script: echo "Running the release job for the new tag."
  release:
    tag_name: $CI_COMMIT_TAG
    description: 'Release description'
  rules:
    - if: $CI_COMMIT_TAG

要同时创建发布和新标签,您的 rules配置仅在新标签时运行作业。语义化版本示例如下:

job:
  script: echo "Running the release job and creating a new tag."
  release:
    tag_name: ${MAJOR}_${MINOR}_${REVISION}
    description: 'Release description'
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"

release:tag_message

若标签不存在,新创建的标签会用 tag_message 指定的消息进行标注。若省略,则创建轻量级标签。

关键字类型:作业关键字。您只能在作业中使用它。

支持值

  • 文本字符串。

release:tag_message 示例

  release_job:
    stage: release
    release:
      tag_name: $CI_COMMIT_TAG
      description: 'Release description'
      tag_message: 'Annotated tag message'

release:name

发布名称。若省略,则填充为 release:tag_name 的值。

关键字类型:作业关键字。您只能在作业中使用它。

支持值

  • 文本字符串。

release:name 示例

  release_job:
    stage: release
    release:
      name: 'Release $CI_COMMIT_TAG'

release:description

发布的长描述。

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持值

  • 包含长描述的字符串。
  • 包含描述的文件的路径。
    • 文件位置必须相对于项目目录($CI_PROJECT_DIR)。
    • 如果文件是符号链接,它必须位于$CI_PROJECT_DIR内。
    • ./path/to/file和文件名不能包含空格。

release:description 示例

job:
  release:
    tag_name: ${MAJOR}_${MINOR}_${REVISION}
    description: './path/to/CHANGELOG.md'

额外细节

  • description 由运行 release-cli 的 shell 进行评估。你可以使用 CI/CD 变量定义描述,但某些 shell 使用不同的语法 引用变量。同样,某些 shell 可能需要特殊字符转义。例如,反引号(`)可能需要用反斜杠(\)转义。

release:ref

如果 release: tag_name 尚未存在,则为发布的 ref

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持值

  • 提交 SHA、另一个标签名或分支名。

release:milestones

发布所关联的每个里程碑的标题。

release:released_at

发布准备就绪的日期和时间。

支持值

  • 用引号括起的 ISO 8601 格式日期。

release:released_at 示例

released_at: '2021-03-15T08:00:00Z'

额外细节

  • 如果未定义,则使用当前日期和时间。

使用 release:assets:links 在发布中包含 资产链接

release-cli 版本 v0.4.0 或更高。

release:assets:links 示例

assets:
  links:
    - name: 'asset1'
      url: 'https://example.com/assets/1'
    - name: 'asset2'
      url: 'https://example.com/assets/2'
      filepath: '/pretty/url/1' # 可选
      link_type: 'other' # 可选

resource_group

使用 resource_group 创建一个 资源组,确保同一项目的不同管道中的作业互斥。

例如,如果有多个属于同一资源组的作业同时排队,仅有一个作业会启动。其余作业会等待直至 resource_group 空闲。

资源组的行为类似其他编程语言中的信号量。

你可以选择一种 进程模式 来策略性控制部署偏好中的作业并发性。默认进程模式为 unordered。若要更改资源组的进程模式,可使用 API 发送请求编辑现有资源组。

你可在每个环境中定义多个资源组。例如,部署到物理设备时,你可能拥有多台物理设备。每台设备都可部署,但任意时刻每台设备只能执行一次部署。

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持值

  • 仅字母、数字、-_/${}. 和空格。不能以 / 开头或结尾。CI/CD 变量 受支持

resource_group 示例

deploy-to-production:
  script: deploy
  resource_group: production

在此示例中,两个不同管道中的 deploy-to-production 作业绝不会同时运行。因此,你可确保生产环境不会发生并发部署。

相关主题

retry

使用 retry 来配置作业在失败时重试的次数。
如果未定义,默认值为 0,作业不会重试。

当作业失败时,该作业会最多再处理两次,直到成功或达到最大重试次数。

默认情况下,所有失败类型都会导致作业重试。使用 retry:whenretry:exit_codes 来选择哪些失败情况需要重试。

关键字类型:作业关键字。你只能在作业中使用它,或者在 default 部分 中使用。

支持值

  • 0(默认)、12

retry 示例

test:
  script: rspec
  retry: 2

test_advanced:
  script:
    - echo "Run a script that results in exit code 137."
    - exit 137
  retry:
    max: 2
    when: runner_system_failure
    exit_codes: 137

test_advanced 将会在退出码为 137 或者出现运行系统故障时最多重试 2 次。

retry:when

使用 retry:when 结合 retry:max 仅针对特定失败情况重试作业。
retry:max 是最大重试次数,类似于 retry,可以是 012

关键字类型:作业关键字。你只能在作业中使用它,或者在 default 部分 中使用。

支持值

  • 单个失败类型,或一个或多个失败类型的数组:
  • always:任何失败都重试(默认)。
  • unknown_failure:未知原因失败时重试。
  • script_failure:脚本失败时重试,包括运行器未能拉取 Docker 镜像的情况(适用于 dockerdocker+machinekubernetes 执行器)。
  • api_failure:API 失败时重试。
  • stuck_or_timeout_failure:作业卡住或超时时重试。
  • runner_system_failure:运行系统故障时重试(例如,作业设置失败)。
  • runner_unsupported:运行器不受支持时重试。
  • stale_schedule:延迟作业无法执行时重试。
  • job_execution_timeout:脚本超过作业设定的最大执行时间时重试。
  • archived_failure:作业被归档且无法运行时重试。
  • unmet_prerequisites:作业因未完成先决条件任务而失败时重试。
  • scheduler_failure:调度程序未能将作业分配给运行器时重试。
  • data_integrity_failure:存在未知作业问题时重试。

retry:when 示例(单个失败类型):

test:
  script: rspec
  retry:
    max: 2
    when: runner_system_failure

若失败原因不是运行系统故障,作业不会重试。

retry:when 示例(失败类型数组):

test:
  script: rspec
  retry:
    max: 2
    when:
      - runner_system_failure
      - stuck_or_timeout_failure

retry:exit_codes

使用 retry:exit_codes 结合 retry:max 仅针对特定失败情况重试作业。
retry:max 是最大重试次数,类似于 retry,可以是 012

关键字类型:作业关键字。你只能在作业中使用它,或者在 default 部分 中使用。

支持值

  • 单个退出码。
  • 退出码数组。

retry:exit_codes 示例

test_job_1:
  script:
    - echo "Run a script that results in exit code 1. This job isn't retried."
    - exit 1
  retry:
    max: 2
    exit_codes: 137

test_job_2:
  script:
    - echo "Run a script that results in exit code 137. This job will be retried."
    - exit 137
  retry:
    max: 1
    exit_codes:
      - 255
      - 137

相关主题

你可以使用变量指定某些作业执行阶段的重试尝试次数

rules

使用 rules 来包含或排除流水线中的作业。

规则在流水线创建时被评估,并按顺序执行。当找到匹配项时,不再检查其他规则,根据配置决定是否将作业包含或排除在流水线中。如果没有规则匹配,该作业不会被添加到流水线。

rules 接受一个规则数组。每个规则必须至少包含以下一项:

  • if
  • changes
  • exists
  • when

规则还可以可选地与以下组合:

  • allow_failure
  • needs
  • variables
  • interruptible

你可以组合多个关键词来实现复杂规则

作业会被添加到流水线中:

  • 如果 ifchangesexists 规则匹配,并且配置了 when: on_success(未定义时默认)、when: delayedwhen: always
  • 如果一个仅包含 when: on_successwhen: delayedwhen: always 的规则被触发。

作业不会被添加到流水线中:

  • 如果没有规则匹配。
  • 如果一个规则匹配且设置了 when: never

有关额外示例,请参阅使用 rules 指定作业运行时机

rules:if

使用 rules:if 子句来指定何时将作业添加到流水线中:

  • 如果 if 语句为真,则将作业添加到流水线中。
  • 如果 if 语句为真,但结合了 when: never,则不要将作业添加到流水线中。
  • 如果 if 语句为假,则检查下一个 rules 项(如果还有更多的话)。

if 子句的评估基于:

关键字类型:作业特定和流水线特定。你可以将其用作作业的一部分来配置作业行为,或者与 workflow 结合来配置流水线行为。

支持值

rules:if 示例

job:
  script: echo "Hello, Rules!"
  rules:
    - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
      when: never
    - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/
      when: manual
      allow_failure: true
    - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME

附加细节

相关主题

rules:changes

使用 rules:changes 通过检查特定文件的更改,来指定何时将作业添加到管道中。

对于新分支管道或没有 Git push 事件的情况,rules:changes 始终评估为 true,作业总会运行。标签管道、计划管道和手动管道等类型的管道,都没有关联的 Git push 事件。为了覆盖这些情况,请使用 rules: changes: compare_to 指定要与管道 ref 进行比较的分支。

如果不使用 compare_to,则应仅在与分支管道合并请求管道 配合使用 rules:changes,尽管在创建新分支时 rules:changes 仍会评估为 true。具体来说:

  • 合并请求管道中,rules:changes 会将变更与目标 MR 分支进行比较。
  • 分支管道中,rules:changes 会将变更与分支上的前一个提交进行比较。

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持的值

包含任意数量的数组项:

  • 文件路径。文件路径可以包含CI/CD 变量
  • 通配符路径,例如:
    • 单目录,例如 path/to/directory/*
    • 目录及其所有子目录,例如 path/to/directory/**/*
  • 所有具有相同扩展名或多个扩展名的文件的通配符glob 路径,例如 *.mdpath/to/directory/*.{rb,py,sh}
  • 根目录或所有目录中文件的通配符路径,需用双引号包裹。例如 "*.json""**/*.json"

rules:changes 示例

docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        - Dockerfile
      when: manual
      allow_failure: true

docker build alternative:
  variables:
    DOCKERFILES_DIR: 'path/to/dockerfiles'
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        - $DOCKERFILES_DIR/**/*

在此示例中:

  • 如果管道是合并请求管道,则检查 Dockerfile$DOCKERFILES_DIR/**/* 中的文件是否有变更。
  • 如果 Dockerfile 发生变更,则将该作业以手动作业的形式添加到管道中,即使该作业未触发,管道也会继续运行(allow_failure: true)。
  • 如果 $DOCKERFILES_DIR/**/* 中的文件发生变更,则将该作业添加到管道中。
  • 如果列出的文件均未变更,则不会向任何管道添加这两个作业(等同于 when: never)。

附加细节

  • Glob 模式使用 Ruby 的 File.fnmatch 解释,带有 标志 File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB
  • 每个 rules:changes 部分最多可以定义 50 个模式或文件路径。
  • 如果任何匹配文件发生变更,changes 将解析为 true(即 OR 操作)。
  • 更多示例,请参阅使用 rules 指定作业何时运行
  • 你可以在变量和路径中使用 $ 字符。例如,如果存在 $VAR 变量,则使用其值;如果不存在,$ 会被解释为路径的一部分。

相关主题

rules:changes:paths

使用 rules:changes 指定仅在特定文件发生更改时才将作业添加到管道中,并使用 rules:changes:paths 指定文件。

rules:changes:paths 与不使用任何子键的 rules:changes 效果相同。所有附加细节和相关主题也一致。

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持的值

  • rules:changes 相同。

rules:changes:paths 示例

docker-build-1:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        - Dockerfile

docker-build-2:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        paths:
          - Dockerfile

在此示例中,两个作业的行为完全相同。

rules:changes:compare_to

使用 rules:changes:compare_to 指定与哪些引用(ref)对比文件变更,这些文件列在 rules:changes:paths 下。

关键字类型:作业关键字。你只能在作业中使用它,并且必须与 rules:changes:paths 结合使用。

支持的值

  • 分支名,例如 mainbranch1refs/heads/branch1
  • 标签名,例如 tag1refs/tags/tag1
  • 提交 SHA,例如 2fg31ga14b

CI/CD 变量受支持

rules:changes:compare_to 示例

docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        paths:
          - Dockerfile
        compare_to: 'refs/heads/branch1'

在此示例中,仅当 Dockerfile 相对于 refs/heads/branch1 发生变更且管道源是合并请求事件时,才会包含 docker build 作业。

额外细节

  • compare_to合并结果管道一起使用可能导致意外结果,因为比较基准是 GitLab 创建的内部提交。

相关主题

rules:exists

使用 exists 在仓库中存在特定文件或目录时运行作业。

关键词类型:作业关键词。你可以将其用作作业的一部分或一个 include

支持的值

  • 文件或目录路径的数组。路径相对于项目目录($CI_PROJECT_DIR),不能直接指向外部。文件路径可以使用 glob 模式和 CI/CD 变量

rules:exists 示例

job:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - exists:
        - Dockerfile

job2:
  variables:
    DOCKERPATH: "**/Dockerfile"
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - exists:
        - $DOCKERPATH

在这个例子中:

  • job1 在仓库根目录下存在 Dockerfile 时运行。
  • job2 在仓库任何位置存在 Dockerfile 时运行。

额外细节

  • Glob 模式由 Ruby 的 File.fnmatch 解释,使用标志 File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB
  • 出于性能考虑,GitLab 对 exists 模式或文件路径执行最多 50,000 次检查。在第 50,001 次检查后,带模式的规则始终匹配。换句话说,如果项目包含超过 50,000 个文件,或者文件数量较少但 exists 规则被检查超过 50,000 次,exists 规则会始终假设匹配。
    • 如果有多个模式化 glob,限制为 50,000 除以 glob 数量。例如,包含 5 个模式化 glob 的规则文件限制为 10,000。
  • 每个 rules:exists 部分最多可定义 50 个模式或文件路径。
  • 如果列出的任意文件被找到(即 OR 操作),exists 解析为 true
  • 使用作业级别的 rules:exists 时,GitLab 会在运行管道的项目和引用中搜索文件。当使用 include 配合 rules:exists 时,GitLab 会在包含 include 部分的文件所在项目和引用中搜索文件或目录。在使用以下功能时,包含 include 部分的项目可能与运行管道的项目不同:
  • rules:exists 无法搜索 工件 的存在,因为 rules 评估发生在作业运行之前且工件尚未获取。
  • 要测试目录的存在,路径必须以正斜杠(/)结尾。
rules:exists:paths

rules:exists:paths 与不使用任何子键的 rules:exists 相同。所有额外细节都相同。

关键词类型:作业关键词。你可以将其用作作业的一部分或一个 include

支持的值

  • 文件路径的数组。

rules:exists:paths 示例

docker-build-1:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      exists:
        - Dockerfile

docker-build-2:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      exists:
        paths:
          - Dockerfile

在这个例子中,两个作业的行为相同。

额外细节

  • 在某些情况下,你不能在 CI/CD 变量中使用 /./ 配合 exists。更多详情请参见 issue 386595
rules:exists:project

使用 rules:exists:project 指定在何处搜索 rules:exists:paths 下列出的文件。必须与 rules:exists:paths 配合使用。

关键字类型:作业关键字。可作为作业或 include 的一部分使用,且必须与 rules:exists:paths 组合。

支持值

  • exists:project:包含命名空间和组的完整项目路径。
  • exists:ref:可选。用于搜索文件的提交引用。可以是标签、分支名或 SHA。未指定时默认为项目的 HEAD

rules:exists:project 示例

docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - exists:
        paths:
          - Dockerfile
        project: my-group/my-project
        ref: v1.0.0

在此示例中,仅当 my-group/my-project 项目在标记为 v1.0.0 的提交中存在 Dockerfile 时,才会包含 docker build 作业。

rules:when

单独使用 rules:when 或作为其他规则的组成部分,以控制将作业添加到流水线的条件。rules:when 类似于 when,但输入选项略有不同。

如果 rules:when 规则未与 ifchangesexists 组合,则在评估作业规则时若被命中,始终匹配。

关键字类型:作业特定。仅能作为作业的一部分使用。

支持值

  • on_success(默认):仅在之前阶段的作业均未失败时运行该作业。
  • on_failure:仅在之前阶段至少有一个作业失败时运行该作业。
  • never:无论之前阶段的作业状态如何,都不运行该作业。
  • always:无论之前阶段的作业状态如何,都运行该作业。
  • manual:将该作业作为 手动作业 添加到流水线。allow_failure 的默认值变为 false
  • delayed:将该作业作为 延迟作业 添加到流水线。

rules:when 示例

job1:
  rules:
    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
    - if: $CI_COMMIT_REF_NAME =~ /feature/
      when: delayed
    - when: manual
  script:
    - echo

在此示例中,job1 会添加到流水线:

  • 对于默认分支,使用 when: on_success(这是未定义 when 时的默认行为)。
  • 对于功能分支,作为延迟作业。
  • 其他情况作为手动作业。

附加详情

  • 评估 on_successon_failure 的作业状态时:
  • 使用 rules:when: manual 添加 手动作业 时:
    • allow_failure 默认变为 false。此默认值与在 rules 外部使用 when: manual 添加手动作业的行为相反。
    • 若要实现与 rules 外部定义 when: manual 相同的行为,需将 rules: allow_failure 设为 true

rules:allow_failure

rules 中使用 allow_failure: true 允许作业失败而不停止流水线。

也可对手动作业使用 allow_failure: true。流水线会继续运行,无需等待手动作业的结果。在 rules 中结合 when: manualallow_failure: false 会导致流水线等待手动作业运行后再继续。

关键字类型:作业关键字。仅能作为作业的一部分使用。

支持值

  • truefalse。未定义时默认为 false

rules:allow_failure 示例

job:
  script: echo "Hello, Rules!"
  rules:
    - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
      when: manual
      allow_failure: true

若规则匹配,则该作业为带有 allow_failure: true 的手动作业。

附加详情

  • 规则级别的 rules:allow_failure 会覆盖作业级别的 allow_failure,且仅在该特定规则触发作业时生效。

rules:needs

在规则中使用 needs 来根据特定条件更新作业的 needs。当条件匹配规则时,作业的 needs 配置会被完全替换为规则中的 needs

关键字类型:作业专属。你只能将其用作作业的一部分。

支持的值

  • 字符串形式的作业名称数组。
  • 包含作业名称的哈希(可选附带额外属性)。
  • 空数组([]),用于在满足特定条件时将作业需求设置为无。

rules:needs 示例

build-dev:
  stage: build
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
  script: echo "特性分支,所以构建开发版本..."

build-prod:
  stage: build
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  script: echo "默认分支,所以构建生产版本..."

tests:
  stage: test
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
      needs: ['build-dev']
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      needs: ['build-prod']
  script: echo "默认运行开发规格测试,或在默认分支时运行生产规格测试..."

在此示例中:

  • 如果流水线运行在非默认分支上,因此第一个条件匹配,那么 specs 作业需要 build-dev 作业。
  • 如果流水线运行在默认分支上,因此第二个条件匹配,那么 specs 作业需要 build-prod 作业。

附加细节

rules:variables

rules 中使用 variables 为特定条件定义变量。

关键字类型:作业专属。你只能将其用作作业的一部分。

支持的值

  • 格式为 VARIABLE-NAME: value 的变量哈希表。

rules:variables 示例

job:
  variables:
    DEPLOY_VARIABLE: "default-deploy"
  rules:
    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
      variables:                              # 覆盖作业级别定义的 DEPLOY_VARIABLE
        DEPLOY_VARIABLE: "deploy-production"  
    - if: $CI_COMMIT_REF_NAME =~ /feature/
      variables:
        IS_A_FEATURE: "true"                  # 定义新变量。
  script:
    - echo "以 $DEPLOY_VARIABLE 作为参数运行脚本"
    - echo "如果存在 $IS_A_FEATURE 则运行另一个脚本"

rules:interruptible

在规则中使用 interruptible 来根据特定条件更新作业的 interruptible 值。

关键字类型:作业专属。你只能将其用作作业的一部分。

支持的值

  • truefalse

rules:interruptible 示例

job:
  script: echo "你好,规则!"
  interruptible: true
  rules:
    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
      interruptible: false  # 覆盖作业级别定义的 interruptible。
    - when: on_success

附加细节

  • 规则级别的 rules:interruptible 会覆盖作业级别的 interruptible,并且仅在特定规则触发作业时生效。

run

  • 状态:实验性

此功能可用于测试,但尚未准备好用于生产环境。

使用 run 定义要在作业中执行的一系列步骤。每个步骤可以是脚本或预定义步骤。

你还可以提供可选的环境变量和输入参数。

关键字类型:作业关键字。你只能在作业中使用它。

支持的值

  • 一个哈希数组,其中每个哈希代表一个步骤,包含以下可能的键:
    • name:表示步骤名称的字符串。
    • script:包含要执行的 shell 命令的字符串或字符串数组。
    • step:标识要运行的预定义步骤的字符串。
    • env:可选。特定于此步骤的环境变量哈希。
    • inputs:可选。预定义步骤的输入参数哈希。

数组的每个条目必须有一个 name,以及一个 scriptstep(但不能同时有两者)。

run 示例

job:
  run:
    - name: 'hello_steps'
      script: 'echo "hello from step1"'
    - name: 'bye_steps'
      step: gitlab.com/gitlab-org/ci-cd/runner-tools/echo-step@main
      inputs:
        echo: 'bye steps!'
      env:
        var1: 'value 1'

在此示例中,作业有两个步骤:

  • hello_steps 运行 echo shell 命令。
  • bye_steps 使用带有环境变量和输入参数的预定义步骤。

额外细节

script

使用 script 指定运行器要执行的命令。

除了 触发作业 外的所有作业都需要 script 关键字。

关键字类型:作业关键字。你只能在作业中使用它。

支持的值:包括以下内容的数组:

CI/CD 变量 受支持

script 示例

job1:
  script: "bundle exec rspec"

job2:
  script:
    - uname -a
    - bundle exec rspec

额外细节

  • 当你在 script 中使用 特殊字符 时,必须使用单引号(')或双引号(")。

相关主题

secrets

  • 层级:高级版、旗舰版
  • 提供:GitLab.com、GitLab 自托管、GitLab 专用

使用 secrets 指定 CI/CD 密钥以:

secrets:vault

使用 secrets:vault 指定由 HashiCorp Vault 提供的密钥。

关键词类型:作业关键词。你只能在作业中使用它。

支持的值

  • engine:name:密钥引擎的名称。可以是 kv-v2(默认)、kv-v1generic
  • engine:path:密钥引擎的路径。
  • path:秘密的路径。
  • field:存储密码的字段的名称。

secrets:vault 示例

若要显式指定所有细节并使用 KV-V2 密钥引擎:

job:
  secrets:
    DATABASE_PASSWORD:  # 将此 CI/CD 变量中存储的秘密路径
      vault:  # 对应到 secret: `ops/data/production/db`,field: `password`
        engine:
          name: kv-v2
          path: ops
        path: production/db
        field: password

你可以缩短此语法。使用简写语法时,engine:nameengine:path 均默认为 kv-v2

job:
  secrets:
    DATABASE_PASSWORD:  # 将此 CI/CD 变量中存储的秘密路径
      vault: production/db/password  # 对应到 secret: `kv-v2/data/production/db`,field: `password`

若要在简写语法中指定自定义密钥引擎路径,添加以 @ 开头的后缀:

job:
  secrets:
    DATABASE_PASSWORD:  # 将此 CI/CD 变量中存储的秘密路径
      vault: production/db/password@ops  # 对应到 secret: `ops/data/production/db`,field: `password`

secrets:gcp_secret_manager

使用 secrets:gcp_secret_manager 指定由 GCP Secret Manager 提供的密钥。

关键词类型:作业关键词。你只能在作业中使用它。

支持的值

  • name:密钥的名称。
  • version:密钥的版本。

secrets:gcp_secret_manager 示例

job:
  secrets:
    DATABASE_PASSWORD:
      gcp_secret_manager:
        name: 'test'
        version: 2

相关主题

secrets:azure_key_vault

使用 secrets:azure_key_vault 指定由 Azure Key Vault 提供的密钥。

关键词类型:作业关键词。你只能在作业中使用它。

支持的值

  • name:密钥的名称。
  • version:密钥的版本。

secrets:azure_key_vault 示例

job:
  secrets:
    DATABASE_PASSWORD:
      azure_key_vault:
        name: 'test'
        version: 'test'

相关主题

secrets:file

使用 secrets:file 配置密钥,使其存储为 filevariable 类型的 CI/CD 变量

默认情况下,密钥会作为 file 类型的 CI/CD 变量传递给作业。秘密的值存储在文件中,变量包含文件的路径。

如果你的软件无法使用 file 类型的 CI/CD 变量,请设置 file: false 以将秘密值直接存储在变量中。

关键词类型:作业关键词。你只能在作业中使用它。

支持的值

  • true(默认)或 false

secrets:file 示例

job:
  secrets:
    DATABASE_PASSWORD:
      vault: production/db/password@ops
      file: false

附加详情

  • file 关键字是 CI/CD 变量的设置,必须嵌套在 CI/CD 变量名下,而不是 vault 部分。

secrets:token

使用 secrets:token 通过引用令牌的 CI/CD 变量,在通过外部密钥提供者进行身份验证时明确选择要使用的令牌。

关键字类型:作业关键字。你只能将其用作作业的一部分。

支持值

  • ID 令牌的名称

secrets:token 示例:

job:
  id_tokens:
    AWS_TOKEN:
      aud: https://aws.example.com
    VAULT_TOKEN:
      aud: https://vault.example.com
  secrets:
    DB_PASSWORD:
      vault: gitlab/production/db
      token: $VAULT_TOKEN

额外细节

  • 当未设置 token 关键字且仅定义了一个令牌时,将自动使用已定义的令牌。
  • 如果定义了多个令牌,你应该通过设置 token 关键字来指定使用哪个令牌。如果不指定使用哪个令牌,每次作业运行时无法预测使用哪个令牌。

services

使用 services 来指定脚本成功运行所需的任何其他 Docker 镜像。services 镜像 会链接到 image 关键字中指定的镜像。

关键字类型:作业关键字。你只能将其用作作业的一部分或在 default 部分 中使用。

支持值:服务镜像的名称,包括注册表路径(如果需要),格式如下:

  • <image-name>(等同于使用带 latest 标签的 <image-name>
  • <image-name>:<tag>
  • <image-name>@<digest>

CI/CD 变量受支持,但别名不受支持

services 示例:

default:
  image:
    name: ruby:2.6
    entrypoint: ["/bin/bash"]

  services:
    - name: my-postgres:11.7
      alias: db-postgres
      entrypoint: ["/usr/local/bin/db-postgres"]
      command: ["start"]

  before_script:
    - bundle install

test:
  script:
    - bundle exec rake spec

在此示例中,GitLab 为作业启动两个容器:

  • 运行 script 命令的 Ruby 容器。
  • PostgreSQL 容器。Ruby 容器中的 script 命令可以连接到 db-postgres 主机名上的 PostgreSQL 数据库。

相关主题

services:docker

使用 services:docker 向 GitLab Runner 的 Docker 执行器传递选项。

关键字类型:作业关键字。你只能将其用作作业的一部分或在 default 部分 中使用。

支持值

Docker 执行器的选项哈希,可包含:

  • platform:选择要拉取的镜像架构。未指定时,默认与宿主 Runner 的平台相同。
  • user:指定运行容器时的用户名或 UID。

services:docker 示例:

arm-sql-job:
  script: echo "Run sql tests in service container"
  image: ruby:2.6
  services:
    - name: super/sql:experimental
      docker:
        platform: arm64/v8
        user: dave

额外细节

services:kubernetes

使用 services:kubernetes 向 GitLab Runner 的 Kubernetes 执行器 传递选项。

关键字类型:作业关键字。你只能在作业中使用它,或者在 default 部分 中使用。

支持值

用于 Kubernetes 执行器的选项哈希,可以包含:

  • user:指定容器运行时使用的用户名或 UID。你也可以通过 UID:GID 格式来设置 GID。

仅使用 UID 的 services:kubernetes 示例

arm-sql-job:
  script: echo "运行 SQL 测试"
  image: ruby:2.6
  services:
    - name: super/sql:experimental
      kubernetes:
        user: "1001"

同时使用 UID 和 GID 的 services:kubernetes 示例

arm-sql-job:
  script: echo "运行 SQL 测试"
  image: ruby:2.6
  services:
    - name: super/sql:experimental
      kubernetes:
        user: "1001:1001"

services:pull_policy

Runner 用于获取 Docker 镜像的拉取策略。需要 GitLab Runner 15.1 或更高版本。

关键字类型:作业关键字。你只能在作业中使用它,或者在 default 部分 中使用。

支持值

  • 单个拉取策略,或多个拉取策略组成的数组。可以是 alwaysif-not-presentnever

services:pull_policy 示例

job1:
  script: echo "单个拉取策略。"
  services:
    - name: postgres:11.6
      pull_policy: if-not-present

job2:
  script: echo "多个拉取策略。"
  services:
    - name: postgres:11.6
      pull_policy: [always, if-not-present]

附加详情

  • 如果 Runner 不支持配置的拉取策略,作业会失败并报错,类似:ERROR: Job failed (system failure): the configured PullPolicies ([always]) are not allowed by AllowedPullPolicies ([never])

相关主题

stage

使用 stage 定义作业运行的阶段(stage)。同一 stage 中的作业可以并行执行(见附加详情)。

如果未定义 stage,作业默认使用 test 阶段。

关键字类型:作业关键字。你只能在作业中使用它。

支持值:字符串,可以是:

stage 示例

stages:
  - build
  - test
  - deploy

job1:
  stage: build
  script:
    - echo "这个作业编译代码。"

job2:
  stage: test
  script:
    - echo "这个作业测试已编译的代码。它在构建阶段完成后运行。"

job3:
  script:
    - echo "这个作业也在测试阶段运行。"

job4:
  stage: deploy
  script:
    - echo "这个作业部署代码。它在测试阶段完成后运行。"
  environment: production

附加详情

  • 阶段名称必须不超过 255 个字符。
  • 如果作业运行在不同的 Runner 上,它们可以并行运行。
  • 如果只有一台 Runner,当 Runner 的 concurrent 设置 大于 1 时,作业可以并行运行。

stage: .pre

使用 .pre 阶段让作业在流水线开始时运行。默认情况下,.pre 是流水线中的第一个阶段。用户定义的阶段在其之后执行。你不需要在 stages 中定义 .pre

如果流水线中只有 .pre.post 阶段的作业,则不会运行。必须至少有一个其他阶段的作业。

关键字类型:只能与作业的 stage 关键字一起使用。

stage: .pre 示例

stages:
  - build
  - test

job1:
  stage: build
  script:
    - echo "这个作业在构建阶段运行。"

first-job:
  stage: .pre
  script:
    - echo "这个作业在 .pre 阶段运行,在其他所有阶段之前。"

job2:
  stage: test
  script:
    - echo "这个作业在测试阶段运行。"

附加细节

  • 如果流水线包含带有 needs: [] 的作业和 .pre 阶段的作业,它们会在流水线创建后立即启动。带有 needs: [] 的作业会立即启动,忽略任何阶段配置。
  • 流水线执行策略可以定义一个 .pipeline-policy-pre 阶段,该阶段在 .pre 之前运行。

stage: .post

使用 .post 阶段让作业在流水线结束时运行。默认情况下,.post 是流水线中的最后一个阶段。用户定义的阶段在其之前执行。你不需要在 stages 中定义 .post

如果流水线中只有 .pre.post 阶段的作业,则不会运行。必须至少有一个其他阶段的作业。

关键字类型:只能与作业的 stage 关键字一起使用。

stage: .post 示例

stages:
  - build
  - test

job1:
  stage: build
  script:
    - echo "这个作业在构建阶段运行。"

last-job:
  stage: .post
  script:
    - echo "这个作业在 .post 阶段运行,在其他所有阶段之后。"

job2:
  stage: test
  script:
    - echo "这个作业在测试阶段运行。"

附加细节

  • 流水线执行策略可以定义一个 .pipeline-policy-post 阶段,该阶段在 .post 之后运行。

tags

使用 tags 从项目中所有可用的运行器中选择特定运行器。

注册运行器时,你可以指定其标签,例如 rubypostgresdevelopment。要选取并运行作业,运行器必须分配到作业列出的每个标签。

关键字类型:作业关键字。只能在作业或 default 部分 中使用。

支持的值

  • 标签名称数组(区分大小写)。
  • CI/CD 变量 受支持

tags 示例

job:
  tags:
    - ruby
    - postgres

在此示例中,只有同时具有 rubypostgres 标签的运行器才能运行该作业。

附加细节

  • 标签数量必须小于 50

相关主题

timeout

使用 timeout 为特定作业配置超时。如果作业运行时间超过超时,作业失败。

作业级超时可长于项目级超时,但不能长于运行器的超时

关键字类型:作业关键字。只能在作业或 default 部分 中使用。

支持的值:用自然语言表示的时间段。例如,以下都是等效的:

  • 3600 秒
  • 60 分钟
  • 一小时

timeout 示例

build:
  script: build.sh
  timeout: 3 小时 30 分钟

test:
  script: rspec
  timeout: 3h 30m

trigger

使用 trigger 声明一个作业是“触发作业”,该作业会启动一个下游管道,这个下游管道可以是:

触发作业只能使用有限的 GitLab CI/CD 配置关键词。可在触发作业中使用的关键词有:

关键词类型:作业关键字。你只能在作业中使用它。

支持的值

trigger 示例

trigger-multi-project-pipeline:
  trigger: my-group/my-project

附加详情

  • 你可以在同一个作业中使用 when:manualtrigger,但不能通过 API 启动 when:manual 触发作业。更多详情请参阅 问题 284086
  • 在运行手动触发作业前,你不能 手动指定 CI/CD 变量
  • 在顶级 variables 部分(全局)或在触发作业中定义的 CI/CD 变量 会作为 触发变量 转发给下游管道。
  • 默认情况下,管道变量 不会转发给下游管道。使用 trigger:forward 将这些变量转发给下游管道。
  • 仅限作业的变量 在触发作业中不可用。
  • 运行器配置文件 config.toml 中定义的环境变量(参见 此处)对触发作业不可用,也不会转发给下游管道。
  • 不能在触发作业中使用 needs:pipeline:job

相关主题

trigger:inputs

使用 trigger:inputs 为多项目管道设置 输入,当下游管道配置使用 spec:inputs 时。

trigger:inputs 示例

trigger:
  - project: 'my-group/my-project'
    inputs:
      website: "My website"

trigger:include

使用 trigger:include 声明一个作业是“触发作业”,该作业会启动一个 子管道

此外,还可以使用:

关键词类型:作业关键字。你只能在作业中使用它。

支持的值

  • 子管道配置文件的路径。

trigger:include 示例

trigger-child-pipeline:
  trigger:
    include: path/to/child-pipeline.gitlab-ci.yml

相关主题

trigger:include:inputs

使用 trigger:include:inputs 为子流水线设置 inputs,当下游流水线配置使用了 spec:inputs 时。

trigger:inputs 示例

trigger-job:
  trigger:
    include:
      - local: path/to/child-pipeline.yml
        inputs:
          website: "我的网站"

trigger:project

使用 trigger:project 声明一个作业是“触发作业”(trigger job),它会启动一个 多项目流水线

默认情况下,多项目流水线会针对默认分支触发。使用 trigger:branch 指定不同的分支。

关键字类型:作业关键字。你只能在作业中使用它。

支持值

trigger:project 示例

trigger-multi-project-pipeline:
  trigger:
    project: my-group/my-project

指定不同分支的 trigger:project 示例

trigger-multi-project-pipeline:
  trigger:
    project: my-group/my-project
    branch: development

相关主题

trigger:strategy

使用 trigger:strategy 强制 trigger 作业等待下游流水线完成后再标记为 成功

这种行为与默认行为不同,默认情况下,下游流水线创建后立即将 trigger 作业标记为 成功

此设置使你的流水线执行变为线性而非并行。

支持值

  • mirror:完全镜像下游流水线的状态。
  • depend:触发作业的状态显示为 失败成功运行中,具体取决于下游流水线的状态。详见附加详情。

trigger:strategy 示例

trigger_job:
  trigger:
    include: path/to/child-pipeline.yml
    strategy: mirror

在此示例中,后续阶段的作业会等待触发的流水线成功完成后才开始。

附加详情

  • 可选手动作业 不会影响下游流水线或上游触发作业的状态。下游流水线可以在未运行任何可选手动作业的情况下成功完成。
  • 默认情况下,后续阶段的作业不会在触发作业完成前开始。
  • 阻塞手动作业 必须在触发作业标记为成功或失败前运行。
  • 当使用 strategy:depend 时:
    • 如果下游流水线因手动作业处于 等待手动操作 status_manual )状态,则触发作业显示为 运行中 status_running )。
    • 如果下游流水线有失败的作业,但该作业使用了 allow_failure: true,则下游流水线被视为成功,且触发作业显示为 成功

trigger:forward

使用 trigger:forward 指定要转发到下游管道的内容。你可以控制将哪些内容转发到 父子管道多项目管道

默认情况下,转发的变量不会在嵌套的下游管道中再次转发,除非嵌套的下游触发作业也使用了 trigger:forward

支持值

  • yaml_variablestrue(默认)或 false。当为 true 时,触发作业中定义的变量会传递到下游管道。
  • pipeline_variablestruefalse(默认)。当为 true 时,管道变量 会传递到下游管道。

trigger:forward 示例

手动运行此管道,并设置 CI/CD 变量 MYVAR = my value

variables: # 默认每个作业的变量
  VAR: value

# 默认行为:

# - VAR 被传递给子管道

# - MYVAR 不被传递给子管道
child1:
  trigger:
    include: .child-pipeline.yml

# 转发管道变量:

# - VAR 被传递给子管道

# - MYVAR 被传递给子管道
child2:
  trigger:
    include: .child-pipeline.yml
    forward:
      pipeline_variables: true

# 不转发 YAML 变量:

# - VAR 不被传递给子管道

# - MYVAR 不被传递给子管道
child3:
  trigger:
    include: .child-pipeline.yml
    forward:
      yaml_variables: false

额外细节

  • 使用 trigger:forward 转发到下游管道的 CI/CD 变量是 管道变量,具有高优先级。如果下游管道中定义了同名的变量,该变量通常会被转发的变量覆盖。

when

使用 when 配置作业运行的时机条件。如果在作业中未定义,默认值为 when: on_success

关键字类型:作业关键字。可作为作业的一部分使用。when: alwayswhen: never 也可用于 workflow:rules

支持值

  • on_success(默认):仅当之前阶段的所有作业都成功时才运行作业。
  • on_failure:仅当之前阶段至少有一个作业失败时才运行作业。
  • never:无论之前阶段的作业状态如何,都不运行作业。仅能在 rules 部分或 workflow: rules 中使用。
  • always:无论之前阶段的作业状态如何,都运行作业。
  • manual:将作业添加为 手动作业 到管道中。
  • delayed:将作业添加为 延迟作业 到管道中。

when 示例

stages:
  - build
  - cleanup_build
  - test
  - deploy
  - cleanup

build_job:
  stage: build
  script:
    - make build

cleanup_build_job:
  stage: cleanup_build
  script:
    - cleanup build when failed
  when: on_failure

test_job:
  stage: test
  script:
    - make test

deploy_job:
  stage: deploy
  script:
    - make deploy
  when: manual
  environment: production

cleanup_job:
  stage: cleanup
  script:
    - cleanup after jobs
  when: always

在这个例子中,脚本执行:

  1. 仅当 build_job 失败时执行 cleanup_build_job
  2. 无论成功与否,始终作为管道的最后一步执行 cleanup_job
  3. 当你在 GitLab UI 中手动运行时,执行 deploy_job

额外细节

相关主题

  • when 可与 rules 结合使用以实现更动态的作业控制。
  • when 可与 workflow 结合使用以控制管道何时可以启动。

manual_confirmation

使用 manual_confirmation 结合 when: manual 为手动作业定义自定义确认消息。
若未使用 when: manual 定义手动作业,此关键字将无效果。

手动确认适用于所有手动作业,包括使用 environment:action: stop 的环境停止作业。

关键字类型:作业关键字。仅能在作业中使用。

支持值

  • 包含确认消息的字符串。

manual_confirmation 示例

delete_job:
  stage: post-deployment
  script:
    - make delete
  when: manual
  manual_confirmation: 'Are you sure you want to delete this environment?'

stop_production:
  stage: cleanup
  script:
    - echo "Stopping production environment"
  environment:
    name: production
    action: stop
  when: manual
  manual_confirmation: "Are you sure you want to stop the production environment?"

variables

使用 variables 定义 CI/CD 变量

变量可在 CI/CD 作业中定义,也可作为顶级(全局)关键字为所有作业定义 默认 CI/CD 变量

额外细节

相关主题

作业 variables

你可在作业的 scriptbefore_scriptafter_script 部分的命令中使用作业变量,也可在某些 作业关键字 中使用。查看各作业关键字的 支持值 部分以确认是否支持变量。

不能将作业变量用作 include全局关键字 的值。

支持值:变量名与值的配对:

  • 名称仅能使用数字、字母和下划线(_)。部分 Shell 要求首字符为字母。
  • 值必须为字符串。

CI/CD 变量 受支持

作业 variables 示例

review_job:
  variables:
    DEPLOY_SITE: "https://dev.example.com/"
    REVIEW_PATH: "/review"
  script:
    - deploy-review-script --url $DEPLOY_SITE --path $REVIEW_PATH

在此示例中:

  • review_job 定义了 DEPLOY_SITEREVIEW_PATH 作业变量。两者均可在 script 部分使用。

默认 variables

在顶层 variables 部分定义的变量会作为所有作业的默认变量。

每个默认变量都会提供给管道中的每个作业(除非该作业已定义同名变量)。作业中定义的变量优先级更高,因此同名默认变量的值无法在该作业中使用。

与作业变量类似,你不能将默认变量用作其他全局关键词(如 include)的值。

支持的值:变量名和值对:

  • 名称只能使用数字、字母和下划线(_)。在某些 shell 中,第一个字符必须是字母。
  • 值必须是字符串。

CI/CD 变量受支持

variables 示例

variables:
  DEPLOY_SITE: "https://example.com/"

deploy_job:
  stage: deploy
  script:
    - deploy-script --url $DEPLOY_SITE --path "/"
  environment: production

deploy_review_job:
  stage: deploy
  variables:
    DEPLOY_SITE: "https://dev.example.com/"
    REVIEW_PATH: "/review"
  script:
    - deploy-review-script --url $DEPLOY_SITE --path $REVIEW_PATH
  environment: production

在此示例中:

  • deploy_job 未定义任何变量。默认 DEPLOY_SITE 变量会被复制到作业中,并可在 script 部分使用。
  • deploy_review_job 已定义 DEPLOY_SITE 变量,因此默认 DEPLOY_SITE 不会被复制到作业中。作业还定义了 REVIEW_PATH 作业变量。这两个作业变量都可在 script 部分使用。

variables:description

使用 description 关键字为默认变量定义描述。当手动运行管道时,描述会与预填充的变量名一同显示。

关键字类型:此关键字仅可用于默认 variables,不能用于作业 variables

支持的值

  • 字符串。可使用 Markdown。

variables:description 示例

variables:
  DEPLOY_NOTE:
    description: "部署备注。解释此次部署的原因。"

额外细节

  • 当未使用 value 时,该变量存在于非手动触发的管道中,默认值为空字符串('')。

variables:value

使用 value 关键字定义管道级别(默认)变量的值。当与 variables: description 结合使用时,变量值会在手动运行管道时被预填充

关键字类型:此关键字仅可用于默认 variables,不能用于作业 variables

支持的值

  • 字符串。

variables:value 示例

variables:
  DEPLOY_ENVIRONMENT:
    value: "staging"
    description: "部署目标。如有需要,可将此变量更改为 'canary' 或 'production'。"

额外细节

variables:options

使用 variables:options 定义一个值数组,这些值在手动运行管道时可从 UI 中选择

必须与 variables: value 一起使用,且为 value 定义的字符串:

  • 也必须是 options 数组中的一个字符串。
  • 是默认选择项。

如果没有 description,此关键字无效。

关键字类型:此关键字仅可用于默认 variables,不能用于作业 variables

支持的值

  • 字符串数组。

variables:options 示例

variables:
  DEPLOY_ENVIRONMENT:
    value: "staging"
    options:
      - "production"
      - "staging"
      - "canary"
    description: "部署目标。默认设置为 'staging'。"

variables:expand

使用 expand 关键字来配置变量是否可展开。

关键字类型:你可以将此关键字用于默认变量和作业变量。

支持的值

  • true(默认):变量可展开。
  • false:变量不可展开。

variables:expand 示例

variables:
  VAR1: value1
  VAR2: value2 $VAR1
  VAR3:
    value: value3 $VAR1
    expand: false
  • VAR2 的结果是 value2 value1
  • VAR3 的结果是 value3 $VAR1

额外详情