Pipeline语法2:

tags <用于指定运行该项目的runner>
allow_failure <允许作业失败,默认值为false,如果作业失败将显示橙色警告,但管道的逻辑流程为作业成功,并不会阻塞>
when <控制作业运行>

  1. - on_success 前面阶段中的所有作业都成功时才执行
  2. - on_failure 当前面阶段出现失败时执行
  3. - always 总是执行
  4. - manual 手动执行
  5. - 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时会报语法错误 :::