CI/CD 作业

  • Tier: 基础版,专业版,旗舰版
  • Offering: JihuLab.com, 私有化部署

极狐GitLab CI/CD 任务是 极狐GitLab CI/CD 流水线 的基本元素。任务在 .gitlab-ci.yml 文件中配置,并包含要执行的命令列表,以完成诸如构建、测试或部署代码等任务。

任务:

  • runner 上执行,例如在 Docker 容器中。
  • 独立于其他任务运行。
  • 具有完整执行日志的 任务日志

任务通过 YAML 关键字 定义,涵盖任务执行的各个方面,包括以下关键字:

  • 控制任务 如何何时 运行。
  • 将任务归类到称为 阶段 的集合中。阶段按顺序运行,而阶段中的所有任务可以并行运行。
  • 定义 CI/CD 变量 以实现灵活配置。
  • 定义 缓存 以加快任务执行。
  • 将文件保存为 产物,供其他任务使用。

将任务添加到流水线#

要将任务添加到流水线中,请将其添加到 .gitlab-ci.yml 文件中。任务必须:

例如:

yaml
1my-ruby-job: 2 script: 3 - bundle install 4 - bundle exec my_ruby_command 5 6my-shell-script-job: 7 script: 8 - my_shell_script.sh

任务名称#

不能使用以下关键字作为任务名称:

  • image
  • services
  • stages
  • before_script
  • after_script
  • variables
  • cache
  • include
  • 配置为 deploy 阶段的 pages:deploy

此外,这些名称在被引用时是有效的,但不推荐使用,因为它们可能使流水线配置不清晰:

  • "true":
  • "false":
  • "nil":

任务名称必须少于 255 个字符。

为您的任务使用唯一名称。如果文件中多个任务具有相同的名称,则只有一个被添加到流水线中,并且难以预测选择哪个任务。如果在一个或多个包含的文件中使用相同的任务名称,参数将被合并

隐藏任务#

要临时禁用任务而不从配置文件中删除它,请在任务名称的开头添加一个句点 (.)。隐藏任务不需要包含 scripttrigger 关键字,但必须包含有效的 YAML 配置。

例如:

yaml
.hidden_job: script: - run test

隐藏任务不会被极狐GitLab CI/CD 处理,但可以用于可重用配置的模板:

设置任务关键字的默认值#

您可以使用 default 关键字设置任务关键字和值的默认值,这些默认值将被流水线中的所有任务默认使用。

例如:

yaml
1default: 2 image: 'ruby:2.4' 3 before_script: 4 - echo Hello World 5 6rspec-job: 7 script: bundle exec rspec

当流水线运行时,任务使用默认关键字:

yaml
rspec-job: image: 'ruby:2.4' before_script: - echo Hello World script: bundle exec rspec

控制默认关键字和变量的继承#

您可以控制以下继承:

例如:

yaml
1default: 2 image: 'ruby:2.4' 3 before_script: 4 - echo Hello World 5 6variables: 7 DOMAIN: example.com 8 WEBHOOK_URL: https://my-webhook.example.com 9 10rubocop: 11 inherit: 12 default: false 13 variables: false 14 script: bundle exec rubocop 15 16rspec: 17 inherit: 18 default: [image] 19 variables: [WEBHOOK_URL] 20 script: bundle exec rspec 21 22capybara: 23 inherit: 24 variables: false 25 script: bundle exec capybara 26 27karma: 28 inherit: 29 default: true 30 variables: [DOMAIN] 31 script: karma

在这个例子中:

  • rubocop
    • 继承:无。
  • rspec
    • 继承:默认 imageWEBHOOK_URL 变量。
    • 不继承:默认 before_scriptDOMAIN 变量。
  • capybara
    • 继承:默认 before_scriptimage
    • 不继承DOMAINWEBHOOK_URL 变量。
  • karma
    • 继承:默认 imagebefore_script,以及 DOMAIN 变量。
    • 不继承WEBHOOK_URL 变量。

查看流水线中的任务#

访问流水线时,您可以看到该流水线的相关任务。

流水线中任务的顺序取决于流水线图的类型。

  • 对于 完整流水线图,任务按名称排序。

  • 对于 流水线迷你图,任务按状态排序,然后按名称排序。任务状态顺序为:

    1. failed
    2. warning
    3. pending
    4. running
    5. manual
    6. scheduled
    7. canceled
    8. success
    9. skipped
    10. created

选择一个任务可以查看其 任务日志,并允许您:

  • 取消任务。
  • 如果任务失败,则重试。
  • 如果任务通过,则再次运行。
  • 擦除任务日志。

查看项目中的所有任务#

  • Offering: JihuLab.com, 私有化部署
History
    • 通过任务名称过滤任务在 GitLab 17.3 中作为 实验 引入到 JihuLab.com 和 极狐GitLab 私有化部署中,带有标志 名为 populate_and_use_build_names_table 的 API 和 fe_search_build_by_name 的 UI。默认禁用。

此功能的可用性由功能标志控制。有关更多信息,请参阅历史记录。

按名称过滤任务是一个 实验

要查看项目中运行的任务的完整列表:

  1. 在左侧栏中,选择 搜索或转到 并找到您的项目。
  2. 选择 构建 > 任务

您可以通过 任务状态任务名称任务源 来过滤列表。

查看任务的来源#

History
    • 在极狐GitLab 17.9 中引入,使用名为 populate_and_use_build_source_table 的标志功能标志。默认启用。
    • 在极狐GitLab 17.11 中,在 JihuLab.com、私有化部署上 GA。

极狐GitLab CI/CD 任务现在包括一个来源属性,指示最初触发 CI/CD 任务的操作。使用此属性跟踪任务的发起方式或根据特定来源过滤任务运行。

可用任务来源#

来源属性可以具有以下值:

  • api:通过对任务 API 的 REST 调用发起的任务。
  • chat:通过使用极狐GitLab ChatOps 的聊天命令发起的任务。
  • container_registry_push:通过容器注册表推送发起的任务。
  • external:通过与极狐GitLab 集成的外部存储库中的事件发起的任务。这不包括拉取请求事件。
  • external_pull_request_event:通过外部存储库中的拉取请求事件发起的任务。
  • merge_request_event:通过合并请求事件发起的任务。
  • ondemand_dast_scan:通过按需 DAST 扫描发起的任务。
  • ondemand_dast_validation:通过按需 DAST 验证发起的任务。
  • parent_pipeline:通过父流水线发起的任务。
  • pipeline:通过用户手动运行流水线发起的任务。
  • pipeline_execution_policy:通过触发的流水线执行策略发起的任务。
  • pipeline_execution_policy_schedule:通过计划的流水线执行策略发起的任务。
  • push:通过代码推送发起的任务。
  • scan_execution_policy:通过扫描执行策略发起的任务。
  • schedule:通过计划的流水线发起的任务。
  • security_orchestration_policy:通过安全编排策略发起的任务。
  • trigger:通过另一个任务或流水线发起的任务。
  • unknown:通过未知来源发起的任务。
  • web:通过极狐GitLab UI 发起的任务。
  • webide:通过 Web IDE 发起的任务。

在流水线视图中将相似任务分组在一起#

如果您有许多相似任务,您的 流水线图 会变得冗长且难以阅读。

您可以自动将相似任务分组在一起。如果任务名称以某种方式格式化,它们会在常规流水线图(不是迷你图)中折叠为单个组。

如果您看到任务名称旁边有一个数字而不是重试或取消按钮,则可以识别流水线是否已分组任务。该数字表示分组任务的数量。悬停在它们上面可以显示是否所有任务都已通过或有任务失败。选择以展开它们。

显示多个阶段和任务的流水线图,包括三个分组任务的组。

要创建任务组,请在 .gitlab-ci.yml 文件中,将每个任务名称与一个数字和以下之一分隔:

  • 斜杠 (/),例如 slash-test 1/3slash-test 2/3slash-test 3/3
  • 冒号 (:),例如 colon-test 1:3colon-test 2:3colon-test 3:3
  • 空格,例如 space-test 0 3space-test 1 3space-test 2 3

您可以交替使用这些符号。

在下面的示例中,这三个任务属于名为 build ruby 的组:

yaml
1build ruby 1/3: 2 stage: build 3 script: 4 - echo "ruby1" 5 6build ruby 2/3: 7 stage: build 8 script: 9 - echo "ruby2" 10 11build ruby 3/3: 12 stage: build 13 script: 14 - echo "ruby3"

流水线图显示一个名为 build ruby 的组,包含三个任务。

任务按从左到右比较数字的顺序排列。您通常希望第一个数字为索引,第二个数字为总数。

此正则表达式 评估任务名称:([\b\s:]+((\[.*\])|(\d+[\s:\/\\]+\d+))){1,3}\s*\z。一个或多个 : [...]X YX/YX\Y 序列仅从任务名称的 末尾 移除。在任务名称的开头或中间找到的匹配子字符串不会被移除。

重试任务#

任务完成后,无论其最终状态(失败、成功或取消)如何,您都可以重试任务。

当您重试任务时:

  • 创建一个新的任务实例并生成新的任务 ID。
  • 任务使用与原始任务相同的参数和变量运行。
  • 如果任务生成产物,则创建新的产物并存储。
  • 新任务与发起重试的用户关联,而不是创建原始流水线的用户。
  • 任何先前跳过的后续任务都会重新分配给发起重试的用户。

当您重试触发下游流水线的 触发任务 时:

  • 触发任务生成新的下游流水线。
  • 下游流水线也与发起重试的用户关联。
  • 下游流水线运行时使用重试时的配置,该配置可能与原始运行不同。

重试任务#

前提条件:

  • 您必须至少具有项目的开发者角色。

要从合并请求中重试任务:

  1. 在左侧栏中,选择 搜索或转到 并找到您的项目。
  2. 在您的合并请求中,执行以下操作之一:
    • 在流水线小部件中,选择要重试的任务旁边的 再次运行)。
    • 选择 流水线 选项卡,选择要重试的任务旁边的 再次运行)。

要从任务日志中重试任务:

  1. 转到任务的日志页面。
  2. 在右上角,选择 再次运行)。

要从流水线中重试任务:

  1. 在左侧栏中,选择 搜索或转到 并找到您的项目。
  2. 选择 构建 > 流水线
  3. 找到包含要重试的任务的流水线。
  4. 从流水线图中,选择要重试的任务旁边的 再次运行)。

重试流水线中所有失败或取消的任务#

如果流水线有多个失败或取消的任务,您可以一次重试所有任务:

  1. 在左侧栏中,选择 搜索或转到 并找到您的项目。
  2. 执行以下操作之一:
    • 选择 构建 > 流水线
    • 转到合并请求并选择 流水线 选项卡。
  3. 对于失败或取消任务的流水线,选择 重试所有失败或取消的任务)。

取消任务#

您可以取消尚未完成的 CI/CD 任务。

当您取消任务时,会根据其状态和极狐GitLab Runner 版本决定接下来发生的情况:

  • 对于尚未开始执行的任务,任务会立即取消。
  • 对于正在运行的任务:
    • 对于极狐GitLab Runner 16.10 及以上版本与极狐GitLab 17.0 及以上版本,任务在 runner 运行任务的 after_script 时被标记为 canceling。 当 after_script 完成时,任务被标记为 canceled
    • 对于极狐GitLab Runner 16.9 及以下版本与极狐GitLab 16.11 及以下版本,任务会立即取消,而不运行 after_script
Rendering chart...

如果您需要立即取消任务而不等待 after_script,请使用 强制取消

取消任务#

前提条件:

要从合并请求中取消任务:

  1. 在左侧栏中,选择 搜索或转到 并找到您的项目。
  2. 在您的合并请求中,执行以下操作之一:
    • 在流水线小部件中,选择要取消的任务旁边的 取消)。
    • 选择 流水线 选项卡,选择要取消的任务旁边的 取消)。

要从任务日志中取消任务:

  1. 转到任务的日志页面。
  2. 在右上角,选择 取消)。

要从流水线中取消任务:

  1. 在左侧栏中,选择 搜索或转到 并找到您的项目。
  2. 选择 构建 > 流水线
  3. 找到包含要取消的任务的流水线。
  4. 从流水线图中,选择要取消的任务旁边的 取消)。

取消流水线中的所有运行任务#

您可以一次取消正在运行流水线中的所有任务。

  1. 在左侧栏中,选择 搜索或转到 并找到您的项目。
  2. 执行以下操作之一:
    • 选择 构建 > 流水线
    • 转到合并请求并选择 流水线 选项卡。
  3. 对于您要取消的流水线,选择 取消正在运行的流水线)。

强制取消任务#

History
    • 在极狐GitLab 17.10 中作为 实验 引入,使用名为 force_cancel_build功能标志。默认禁用。
    • 在极狐GitLab 17.11 中 GA。功能标志 force_cancel_build 被移除。

如果您不想等待 after_script 完成或任务无响应,您可以强制取消它。强制取消立即将任务从 canceling 状态移动到 canceled

当您强制取消任务时,任务令牌 会立即被撤销。如果 runner 仍在执行任务,它将失去访问极狐GitLab 的权限。runner 在不等待 after_script 完成的情况下终止任务。

前提条件:

  • 您必须至少具有项目的维护者角色。
  • 任务必须处于 canceling 状态,这需要:
    • 极狐GitLab 17.0 及以上版本。
    • 极狐GitLab Runner 16.10 及以上版本。

要强制取消任务:

  1. 转到任务的日志页面。
  2. 在右上角,选择 强制取消

排查失败的任务#

当流水线失败或允许失败时,有几个地方可以找到原因:

  • 流水线图 中,在流水线详情视图中。
  • 在合并请求和提交页面中的流水线小部件中。
  • 在任务视图中,在任务的全局和详细视图中。

在每个地方,如果您悬停在失败的任务上,您可以看到它失败的原因。

显示失败任务及其失败原因的流水线图。

您还可以在任务详情页面上看到它失败的原因。

部署任务#

部署任务是使用 环境 的 CI/CD 任务。部署任务是使用 environment 关键字和 start 环境 action 的任何任务。部署任务不需要位于 deploy 阶段。以下 deploy me 任务是部署任务的示例。action: start 是默认行为,为了清晰起见已在此定义,但您可以省略它:

yaml
1deploy me: 2 script: 3 - deploy-to-cats.sh 4 environment: 5 name: production 6 url: https://cats.example.com 7 action: start

可以通过 部署安全性 设置来控制部署任务的行为,例如 防止过时的部署任务确保一次只运行一个部署任务