gitlab--job 作业运行控制 tag、when、allow_failure、retry、timeout、parallel
job 作业设置
定义一个 job
的时候,一般定义哪些关键字呢?作业在哪个 Runner
运行?作业属于流水线的哪个阶段?这个 job
要做什么?
stages:
- test
- deploy
variables: # 全局变量
VERSIONS: "1.32.1"
RUNNER_TAG: "k8s" # 定义一个 Runner 的 tag,其他地方引用就可以了
deploy1: # job 的名称
tags: # job 要运行 Runner 的 tag
- ${RUNNER_TAG} # 引用变量
- build
stage: deploy # 运行阶段
before_script:
- echo "job 运行之前要执行的"
script:
- echo "job 运行阶段执行的"
after_script:
- echo "job 运行之后要执行的"
test1: # 没有指定要运行的 runner,就在可以运行的 runner 上选择一台运行
stage: test
script:
- echo "Do a test here"
- echo "For example run a test suite"
before_script:
- echo "流水线运行之前要执行的"
after_script:
- echo "流水线运行之后要执行的"
tags
用于从允许运行该项目的所有 Runner
列表中选择特定的 Runner
,在 Runner
注册期间,您可以指定 Runner
的标签。
stages: # 指定运行的顺序
- test
- deploy
deploy:
tags: # runner 要同时有这两个标签
- docker
- k8s
stage: deploy
script:
- echo "我是部署阶段"
test:
stage: test
script:
- echo "我是测试阶段"
现在我们的 runer 只有一个 k8s 的标签,看下流水线会不会运行
可以看到 test 阶段运行成功了,因为 runner 勾选了没有标签的任务也可以运行。但 deploy 阶段阻塞住了,因为没有满足该 job 的 runner
job 作业运行控制
语法关键字 |
作用 | 备注 |
allow_failure |
控制作业状态,是否允许作业失败。默认值为 false。启用后,如果作业运行失败,该作业将在用户界面中显示橙色警告 |
管道将认为作业通过,不会被阻塞 假设所有其他作业均成功,则该作业的阶段及其管道将显示相同的橙色警告。但是,关联的提交将被标记为"通过",而不会发出警告。 |
when | 根据状态控制作业运行,当前面作业成功或者失败时运行 |
on_ success:前面阶段成功时执行(默认值) on_failure:前面阶段失败时执行 always:总是执行 manual:手动执行 delayed:延迟执行 never:永不执行
|
retry | 作业重新运行,遇到错误重新运行的次数 | 值为整数,等于或大于 0,但小于或等于 2 |
timeout | job 运行超时时间 | |
rules | 根据特定的变量或文件变更来控制 job 的运行 |
if changes exists |
needs | job 依赖控制 | needs: ["job名称"] |
paraller | 生成多个 job,并行运行 |
paraller: 5 值 2-50 之间 |
allow_failure
allow_failure 允许作业失败,默认值为 false。启用后,如果作业失败,该作业将在用户界面中显示橙色警告。但是流水线将认为该 job 成功,并且不会阻塞。假设其他所有作业均运行成功,则该 job 的阶段及其流水线将显示相同的橙色警告。但是,关联的提交将被标记为通过,而不会发出失败
我们将一个阶段写错,看 pipeline 怎么处理
stages: # 指定运行的步骤,没有指定就顺序执行
- build
- deploy
- test
build1: # job 的名称
tags:
- k8s # 运行的 runner 标签
stage: build
script:
- echo "Do your build here"
test1:
stage: test
script:
- echo "Do a test here"
- echo "For example run a test suite"
test2:
stage: test
script:
- echo "Do another parallel test here"
- echo "For example run a lint test"
deploy1:
tags:
- k8s
stage: deploy
script:
- ech "Do your deploy here" # 这里写错
上面我们将 deploy 阶段的脚本改错了,查看运行结果
我们发现,deploy 阶段运行失败后,后面的阶段 test 就跳过了
那我们如果想 deploy 阶段运行失败后,后面的不跳过,就可以加上 allow_failure 参数,如下
stages: # 指定运行的步骤,没有指定就顺序执行
- build
- deploy
- test
build1:
tags:
- k8s
stage: build
script:
- echo "Do your build here"
test1:
stage: test
script:
- echo "Do a test here"
- echo "For example run a test suite"
test2:
stage: test
script:
- echo "Do another parallel test here"
- echo "For example run a lint test"
deploy1:
tags:
- k8s
stage: deploy
script:
- ech "Do your deploy here" # 这里写错
allow_failure: true # 这个阶段失败不影响后面的阶段
在来查看结果,从结果我们可以看出,加上 allow_failure: true 后,某个阶段运行失败后,不会影响后面的流程。只是会加上一个橙色的警告
when
when 可以控制该流水线以什么样的方式运行,例如
- on_success:前面阶段中的所有作业都成功(或由于标记为
allow_failure
而被视为成功)时才执行作业。 这是默认值。 - on_failure:当前面阶段出现失败则执行。
- always: 执行作业,而不管先前阶段的作业状态如何,放到最后执行。总是执行。
-
manual:手动执行作业,不会自动执行,需要由用户显式启动. 手动操作的示例用法是部署到生产环境. 可以从管道,作业,环境和部署视图开始手动操作。
假如在 deploy 阶段添加manual,则流水线运行到 deploy 阶段为锁定状态,需要手动点击按钮才能运行 deploy 阶段。
stages: # 指定运行的步骤,没有指定就顺序执行
- build
- deploy
- test
build1:
tags:
- k8s
stage: build
script:
- echo "Do your build here"
when: manual # 手动执行
test1:
stage: test
script:
- echo "Do a test here"
- echo "For example run a test suite"
test2:
stage: test
script:
- echo "Do another parallel test here"
- echo "For example run a lint test"
deploy1:
tags:
- k8s
stage: deploy
script:
- echo "Do your deploy here"
allow_failure: true # 这个阶段失败不影响后面的阶段
when: delayed # 延迟执行
start_in: "5" # 延迟 5 秒
例子二
retry
配置在失败的情况下重试作业的次数。
当作业失败并配置了retry
,将再次处理该作业,直到达到retry
关键字指定的次数。如果retry
设置为 2,并且作业在第二次运行成功(第一次重试),则不会再次重试。 retry
值必须是一个正整数,等于或大于0,但小于或等于2(最多两次重试,总共运行3次)
stages: # 指定运行的顺序
- test
- deploy
deploy:
tags:
- k8s
stage: deploy
retry: 2 # 最多重试 2 次,加上默认的一次,最多运行三次
script:
- ech "我是部署阶段" # 这里我写错了
test:
stage: test
script:
- echo "我是测试阶段"
查看流水线
- :最大重试次数.
- when
always :# 在发生任何故障时重试(默认).
unknown_failure :# 当失败原因未知时。
script_failure :# 脚本失败时重试。
api_failure :# API失败重试。
stuck_or_timeout_failure :# 作业卡住或超时时。
runner_system_failure :# 运行系统发生故障。
missing_dependency_failure: # 如果依赖丢失。
runner_unsupported :# Runner不受支持。
stale_schedule :# 无法执行延迟的作业。
job_execution_timeout :# 脚本超出了为作业设置的最大执行时间。
archived_failure :# 作业已存档且无法运行。
unmet_prerequisites :# 作业未能完成先决条件任务。
scheduler_failure :# 调度程序未能将作业分配给运行scheduler_failure。
data_integrity_failure :# 检测到结构完整性问题。
例如
stages: # 指定运行的顺序
- test
- deploy
deploy:
tags:
- k8s
stage: deploy
retry:
max: 2 # 最多重试 2 次
when:
- script_failure # 只有脚本失败的时候才会重试
script:
- ech "我是部署阶段" # 这里我写错了
test:
stage: test
script:
- echo "我是测试阶段"
查看流水线
timeout 超时
特定作业配置超时,作业级别的超时可以超过但不能超过 Runner 特定的超时
job 的超时时间
stages: # 指定运行的顺序
- test
- deploy
deploy:
tags:
- k8s
stage: deploy
retry:
timeout: 3 hours 30 minutes # job 的超时时间
script:
- echo "我是部署阶段"
test:
stage: test
script:
- echo "我是测试阶段"
此功能如何工作:
- 运行程序超时大于项目超时:runner超时设置为24小时,项目的CI / CD超时设置为**2小时。该工作将在2小时后超时。
- 未配置运行程序超时:runner不设置超时时间,项目的CI / CD超时设置为2小时。该工作将在2小时后超时。
- 运行程序超时小于项目超时:runner超时设置为30分钟,项目的CI / CD超时设置为2小时。工作在30分钟后将超时
配置要并行运行的作业实例数,此值必须大于或等于 2 并且小于或等于 50。
这将创建 N 个并行运行的同一作业实例. 它们从job_name 1/N
到job_name N/N
依次命名
stages: # 指定运行的顺序
- test
- deploy
deploy:
tags:
- k8s
stage: deploy
retry:
parallel: 5 # 要并行运行的作业实例数
script:
- echo "我是部署阶段" # 这里我写错了
test:
stage: test
script:
- echo "我是测试阶段"
可以看到运行结果如下