Pipeline语法2:
tags <用于指定运行该项目的runner>
allow_failure <允许作业失败,默认值为false,如果作业失败将显示橙色警告,但管道的逻辑流程为作业成功,并不会阻塞>
when <控制作业运行>
- on_success 前面阶段中的所有作业都成功时才执行- on_failure 当前面阶段出现失败时执行- always 总是执行- manual 手动执行- delayed 延迟执行(特殊属性 start_in)
retry <在失败的情况下重试作业的次数,大于等于0,小于等于2>
- max: 最大重试次数
- 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 :检测到结构完整性问题。
timeout <超时>:作业级别的超时可以超过项目级别的超时,但是不能超过runner特点的超时时间。
parallel <并行作业>:配置要并行运行的作业实例数,此值必须大于或等于2并且小于或等于50
实例
4个作业依次顺序bulid-unittest-codescan-deploy,unittest延迟5秒执行,ech “run test”执行失败后重试1次且不阻塞;deploy需要手动执行,前面所有作业执行成功后执行最后一个codescan(when: on_success),并行执行。
before_script:
- echo "before-script!!"
variables:
DOMAIN: example.com
stages:
- build
- test
- codescan
- deploy
build:
before_script:
- echo "before-script in job"
stage: build
script:
- echo "mvn clean "
- echo "mvn install"
- echo "$DOMAIN"
after_script:
- echo "after script in buildjob"
unittest:
stage: test
script:
- ech "run test"
when: delayed
start_in: '5'
allow_failure: true
retry:
max: 1
when:
- script_failure
timeout: 1 hours 10 minutes
deploy:
stage: deploy
script:
- echo "hello deploy"
- sleep 2;
when: manual
codescan:
stage: codescan
script:
- echo "codescan"
- sleep 5;
when: on_success
parallel: 5
after_script:
- echo "after-script"
- ech
:::info 实例中没有用tags,我在运行时会找不到runner一直处于等待状态,要指定tags才可以,可能是版本低了。 :::
Pipeline语法3:
only&ecxept <限制分支标签>
- only 定义哪些分支和标签的项目会被job执行
- except 定义哪些分支和标签的项目将不会被执行
rules <构建规则>
- 允许按顺序评估单个规则,就是逐个匹配从上到下匹配即停止,如果都不匹配这个条件就是false。
- rules不能与only/except组合使用
可用的规则:
- if(如果条件匹配,多个条件使用&&或者||)
- changes(指定文件发生变化)
- exists(指定文件存在)
rules-if
如果DOMAIN的值匹配,则需要手动执行。 ```yaml variables: DOMAIN: example.com
stages: -codescan
codescan: tags:
- build
stage: codescan script:
- echo "codescan"
- sleep 5;
rules:
- if:'$DOMAIN == "example.com"'
when: manual
- when: on_success
<a name="kSZUa"></a>
#### rules-changes
```yaml
codescan:
stage: codescan
tags:
- build
script:
- echo "codescan"
- sleep 5;
#parallel: 5
rules:
- changes:
- Dockerfile
when: manual
- if: '$DOMAIN == "example.com"'
when: on_success
- when: on_success
rules-exists
codescan:
stage: codescan
tags:
- build
script:
- echo "codescan"
- sleep 5;
#parallel: 5
rules:
- exists:
- Jenkinsfile
when: manual
- changes:
- Dockerfile
when: on_success
- if: '$DOMAIN == "example.com"'
when: on_success
- when: on_success
workflow-rules
<管道创建> 顶级关键词,作用于整个管道,并将确定是否创建管道。
如下:当USERNAME的值为rose时,会执行所有job,值不是rose时整个工作流都不执行(没有任何操作)
variables:
USERNAME: rose
PASSWORD: 123.com
workflow:
rules:
- if: '$USERNAME == "rose"'
when: always
- when: never
:::info rules在gitlab版本低于12.5时会报语法错误 :::
