Pipeline DAG类型
除了最常见的Pipeline类型,按顺序执行,还存在其他类型的pipeline。
- DAG类型,这种类型突破了传统的按顺序执行,可以直接根据依赖关系执行,使用关键字
needs
DAG类型解决的问题
假设把pipeline划分为三个阶段,build,test,deploy。在build阶段,存在两个job,然后test一个job,deploy也是一个job,目前build阶段的其中一个job(job_b)只是暂时编写进去,是否执行不会影响后面的test和deploy阶段。而test和deploy真正关心的是job_a,那么其实只需要job_b执行完后,就可以执行test和deploy阶段,而无需等待job_a执行完毕。
还有一种情形,比如用多端框架编写的代码,在build阶段会进行多平台编译,有IOS,有Android,有PC端,然后test阶段也存在根据不同的平台进行测试的job,此时test阶段关于IOS的测试其实只需要在build阶段IOS的job跑完即可,而无需等待另外两个端的build完成。
DAG类型需求场景
- 假设存在IOS, Android,PC三个端。
- 需要各自build,并且进行测试。
- 最后再分发到不同的平台。
DAG类型pipeline编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| stages: - build - test - deploy
ios_build: tags: - shared stage: build script: - echo "Build on ios" - sleep 10
android_build: tags: - shared stage: build script: - echo "Build on android" - sleep 30
pc_build: tags: - shared stage: build script: - echo "Build on pc" - sleep 50
ios_test: tags: - shared stage: test script: - echo "Test for ios" - sleep 10 needs: - ios_build
android_test: tags: - shared stage: test script: - echo "Test for android" - sleep 20 needs: - android_build
pc_test: tags: - shared stage: test script: - echo "Test for pc" - sleep 5 needs: - pc_build
ios_deploy: tags: - shared stage: deploy script: - echo "Deploy for ios" needs: - ios_build - ios_test
android_deploy: tags: - shared stage: deploy script: - echo "Deploy for android" needs: - android_build - android_test
pc_deploy: tags: - shared stage: deploy script: - echo "Deploy for pc" needs: - pc_build - pc_test
|
上述任务需要开启gitlab-runner的多任务,concurrent
大于1。
pipeline运行后不再是之前的根据stages顺序执行,而是通过needs关键字指定的关系,进行执行。
refer:
https://docs.gitlab.com/ee/ci/directed_acyclic_graph/
https://about.gitlab.com/blog/2020/05/12/directed-acyclic-graph/