default
这是一个全局关键字,可以在全局设置某些关键字的的默认值,如果在job中没有定义该关键字的值,那么就会使用全局设置的默认值
示例
default:
image: ruby:3.0
rspec:
script: bundle exec rspec
rspec 2.7:
image: ruby:2.7
script: bundle exec rspec
在上述例子中,ruby:3.0是全局的默认镜像,在rspec 2.7这个job中设置了image:ruby:2.7,此时就不会使用默认值而是在该Job中使用2.7这个版本
stages
这是一个全局关键字,使用stages来定义一个流水线中所包含的各个stage(阶段)。如果stages在脚本中未定义,那么默认的阶段为下面5个阶段
- .pre
- build
- test
- deploy
- .post
如果管道中仅包含.pre 或.post阶段中的作业,那就不会运行,在不同的阶段至少有一份其他的job。.pre、.post 可以按需在作业中配置使用,分别是在作业运行之初以及运行结束之后会运行的阶段
示例
stages:
- .pre
- build
- test
- deploy
- .post
pre_job:
stage: .pre
script: echo 'this is pre stage'
build_job:
stage: build
script: echo 'this is build stage'
test_job:
stage: test
script: echo 'this is test stage'
deploy_job:
stage: deploy
script: echo 'this is deploy stage'
post_job:
stage: .post
script: echo 'this is post stage'
效果如下:
剩余 test、deploy、.post 阶段也各自打印出对应的字符串
在这个例子中:
- build并行执行的所有作业。
- 如果所有作业都.pre成功,则build作业并行执行。
- 如果所有作业都build成功,则test作业并行执行。
- 如果所有作业都test成功,则deploy作业并行执行。
- 如果所有作业都deploy成功,则.post作业并行执行。
- 如果所有作业都.post成功,管道将标记为passed。
- 如果任何作业失败,管道将被标记为failed并且后续阶段的作业不会启动。当前阶段的作业不会停止并继续运行
- 如果一个阶段定义在了stages中,但为在job中使用,则该阶段不会展示在流水线中
有两点需要说明:
- 一个是执行顺序,流水线执行的顺序按照stages中定义的顺序执行,即便在下面定义的各个job中的顺序是打乱的也不会影响正常的顺序,比如在下面这个例子中job的定义顺序是打乱的,但最终的执行顺序还是按照stages中定义的顺序来执行的
- 第二个是并行执行,在没有额外设置的情况下,同一个阶段中的不同job是并行执行的,比如在下面这个例子中设置了两个deploy的job(deploy_job、deploy_job2)那这两个任务会并行执行。同一阶段内的任务的成功与否不会相互影响,但会影响下一个阶段的任务。
stages:
- .pre
- build
- test
- deploy
- .post
pre_job:
stage: .pre
script: echo 'this is pre stage'
deploy_job:
stage: deploy
script: echo 'this is deploy stage'
test_job:
stage: test
script: echo 'this is test stage'
deploy_job2:
stage: deploy
script: echo 'this is deploy2 stage'
build_job:
stage: build
script: echo 'this is build stage'
post_job:
stage: .post
script: echo 'this is post stage'
只不过为了可读性更强,更好维护流水线,也会按照stages中编写的顺序来编排job。
自定义stages
build、test、deploy 是默认的三个阶段。我们也完全可以按照业务需求定义自己的stages
如下:
stages:
- .pre
- mybuild
- mytest
- mydeploy
- .post
pre_job:
stage: .pre
script: echo 'this is pre stage'
deploy_job:
stage: mydeploy
script: echo 'this is deploy stage'
test_job:
stage: mytest
script: echo 'this is test stage'
deploy_job2:
stage: mydeploy
script: echo 'this is deploy2 stage'
build_job:
stage: mybuild
script: echo 'this is build stage'
post_job:
stage: .post
script: echo 'this is post stage'
最终的效果都是一样的
job列表未使用stages定义的阶段
stages:
- .pre
- mybuild
- mytest
- mydeploy
- .post
pre_job:
stage: .pre
script: echo 'this is pre stage'
deploy_job:
stage: mydeploy
script: echo 'this is deploy stage'
deploy_job2:
stage: mydeploy
script: echo 'this is deploy2 stage'
build_job:
stage: mybuild
script: echo 'this is build stage'
post_job:
stage: .post
script: echo 'this is post stage'
自定义stages中定义了mytest这个阶段,但在下面job列表中并没有使用该阶段,那么该阶段也不会战士在流水线中
其他
查看所有gitlab CI/CD关键字列表