Pipeline Architecture

原文:https://docs.gitlab.com/ee/ci/pipelines/pipeline_architectures.html

Pipeline Architecture

管道是 GitLab 中 CI / CD 的基本构建块. 本页记录了一些与它们有关的重要概念.

构造管道的主要方法有三种,每种都有自己的优势. 如果需要,可以混合使用以下方法:

  • 基本 :适用于简单的项目,其中所有配置都在一个易于查找的位置.
  • 有向无环图 :适用于需要有效执行的大型,复杂项目.
  • 子级/父级管道 :适用于具有大量独立定义组件的 monorepos 和项目.

有关下面使用的任何关键字的更多详细信息,请查看我们的CI YAML 参考以获取详细信息.

Basic Pipelines

这是 GitLab 中最简单的管道. 它会在构建阶段同时运行所有内容,一旦所有这些操作完成,它将以相同的方式在测试阶段运行所有内容,依此类推. 它不是最有效的,并且如果您有很多步骤,它可能会变得非常复杂,但更易于维护:

图 LR 子图部署阶段部署-> deploy_a 部署-> deploy_b 结束子图测试阶段测试-> test_a 测试-> test_b 结束子图构建阶段构建-> build_a 构建-> build_b 结束 build_a -.->测试 build_b -.->测试 test_a -.->部署 test_b -.->部署

匹配该图的示例基本/.gitlab-ci.yml管道配置:

  1. stages:
  2. - build
  3. - test
  4. - deploy
  5. image: alpine
  6. build_a:
  7. stage: build
  8. script:
  9. - echo "This job builds something."
  10. build_b:
  11. stage: build
  12. script:
  13. - echo "This job builds something else."
  14. test_a:
  15. stage: test
  16. script:
  17. - echo "This job tests something. It will only run when all jobs in the"
  18. - echo "build stage are complete."
  19. test_b:
  20. stage: test
  21. script:
  22. - echo "This job tests something else. It will only run when all jobs in the"
  23. - echo "build stage are complete too. It will start at about the same time as test_a."
  24. deploy_a:
  25. stage: deploy
  26. script:
  27. - echo "This job deploys something. It will only run when all jobs in the"
  28. - echo "test stage complete."
  29. deploy_b:
  30. stage: deploy
  31. script:
  32. - echo "This job deploys something else. It will only run when all jobs in the"
  33. - echo "test stage complete. It will start at about the same time as deploy_a."

Directed Acyclic Graph Pipelines

如果效率对您很重要,并且您希望所有内容尽快运行,则可以使用有向无环图(DAG) . 使用needs关键字定义作业之间的依赖关系. 当 GitLab 知道您的工作之间的关系时,它可以尽快运行所有内容,甚至在可能的情况下跳入后续阶段.

在下面的示例中,如果build_atest_a的速度比build_btest_b ,则即使build_b仍在运行,GitLab 也会启动deploy_a .

使用 DAG build_a-> test_a-> deploy_a build_b-> test_b-> deploy_b 结束的图 LR 子图管道

匹配该图的示例 DAG /.gitlab-ci.yml配置:

  1. stages:
  2. - build
  3. - test
  4. - deploy
  5. image: alpine
  6. build_a:
  7. stage: build
  8. script:
  9. - echo "This job builds something quickly."
  10. build_b:
  11. stage: build
  12. script:
  13. - echo "This job builds something else slowly."
  14. test_a:
  15. stage: test
  16. needs: [build_a]
  17. script:
  18. - echo "This test job will start as soon as build_a finishes."
  19. - echo "It will not wait for build_b, or other jobs in the build stage, to finish."
  20. test_b:
  21. stage: test
  22. needs: [build_b]
  23. script:
  24. - echo "This test job will start as soon as build_b finishes."
  25. - echo "It will not wait for other jobs in the build stage to finish."
  26. deploy_a:
  27. stage: deploy
  28. needs: [test_a]
  29. script:
  30. - echo "Since build_a and test_a run quickly, this deploy job can run much earlier."
  31. - echo "It does not need to wait for build_b or test_b."
  32. deploy_b:
  33. stage: deploy
  34. needs: [test_b]
  35. script:
  36. - echo "Since build_b and test_b run slowly, this deploy job will run much later."

Child / Parent Pipelines

在上面的示例中,很明显,我们可以独立构建两种类型的东西. 这是通过trigger关键字使用” 子/父管道”的理想情况. 它将配置分成多个文件,使事情变得非常简单. 您还可以将其与:

graph LR subgraph Parent pipeline trigger_a -.-> build_a trigger_b -.-> build_b subgraph child pipeline B build_b —> test_b —> deploy_b end subgraph child pipeline A build_a —> test_a —> deploy_a end end

匹配该图的父管道的示例/.gitlab-ci.yml配置:

  1. stages:
  2. - triggers
  3. trigger_a:
  4. stage: triggers
  5. trigger:
  6. include: a/.gitlab-ci.yml
  7. rules:
  8. - changes:
  9. - a/*
  10. trigger_b:
  11. stage: triggers
  12. trigger:
  13. include: b/.gitlab-ci.yml
  14. rules:
  15. - changes:
  16. - b/*

例如孩子a管道配置,位于/a/.gitlab-ci.yml ,利用的 DAG needs:关键字:

  1. stages:
  2. - build
  3. - test
  4. - deploy
  5. image: alpine
  6. build_a:
  7. stage: build
  8. script:
  9. - echo "This job builds something."
  10. test_a:
  11. stage: test
  12. needs: [build_a]
  13. script:
  14. - echo "This job tests something."
  15. deploy_a:
  16. stage: deploy
  17. needs: [test_a]
  18. script:
  19. - echo "This job deploys something."

b管道配置示例位于/b/.gitlab-ci.yml ,利用 DAG needs:关键字:

  1. stages:
  2. - build
  3. - test
  4. - deploy
  5. image: alpine
  6. build_b:
  7. stage: build
  8. script:
  9. - echo "This job builds something else."
  10. test_b:
  11. stage: test
  12. needs: [build_b]
  13. script:
  14. - echo "This job tests something else."
  15. deploy_b:
  16. stage: deploy
  17. needs: [test_b]
  18. script:
  19. - echo "This job deploys something else."

也可以将作业设置为在触发子管道之前或之后运行,例如,如果您具有通用的设置步骤或最后进行统一部署.