流水线与模块

Summary
  • 介绍流水线、运行、阶段、环节、步骤的概念
  • 介绍代码仓库各个代码目录与发布的微服务的关系
  • 介绍构建、打包、发布三种核心模块的关系
  • 介绍如何通过构建模块开关,设置指定哪些微服务模块进行发布

流水线与模块

流水线、运行、阶段、环节、步骤的基本概念

  • 流水线(pipeline): 类似Jenkins中pipeline的概念,是一系列自动化步骤的配置,用于设置应用如何发布到云原生环境。分为两类流水线:
    • 持续交付(CI/CD)流水线: 核心能力用于把应用从源代码 构建打包发布 到云环境,主要用于应用源代码发生变更后,需要持续交付到云环境的场景。
    • 运维(OPS)流水线: 用于日常在云环境调整应用的部署方式,或者其他一些非持续交付的场景,例如: 应用的版本回滚、微服务的状态检查、自动化测试、自动化代码扫描、自动化安全扫描等场景。
  • 运行(run): 流水线(pipeline)每执行一次,就会形成一个运行(run)运行(run)的名字格式为<piplineName>-<buildNumber>,buildNumber为自增长的编号,例如: test-project1-develop-2。
    • 每个运行会包含流水线的运行日志代码提交记录模块执行信息步骤执行记录等信息。
    • 每个运行的流水线执行过程将会细分为: 阶段(phase)环节(stage)步骤(step),可以在运行记录中查看各个阶段(phase)环节(stage)步骤(step)的日志记录。
    • 运行(run)阶段(phase)环节(stage)步骤(step)关系如下图:

    /docs_old/concepts/pipeline-module/images/pipeline-run-phase-stage-step.png

    • 阶段(phase): 一个运行(run)可以包含多个阶段(phase),每个阶段(phase)串行执行,阶段(phase)一般都有是否启用(enable)超时设置(timeout)重试设置(retry)异常是否继续执行(ignoreError)等几项配置。
    • 环节(stage): 一个阶段(phase)可以包含多个环节(stage),每个环节(stage)并行执行,假如异常是否继续执行(ignoreError)设置为否,那么任意一个环节(stage)出现异常将会立刻终止其他正在执行的环节(stage)并结束运行(run)抛出错误。
    • 步骤(step): 一个环节(stage)可以包含多个步骤(step),每个步骤(step)串行执行。现在一般一个环节(stage)只包含一个步骤(step)

项目与代码仓库、代码目录和发布的微服务的关系

  • 项目(project)代码仓库(gitRepo)的关系: 一个项目(project)对应的就是一个代码仓库(gitRepo),通常表示一个应用相关的所有微服务的代码。
  • 一个代码仓库(gitRepo)可以包含多个代码目录,每个代码目录中可以包含不同开发语言编写的微服务源代码或者公共基础类的源代码,进入这些代码目录可以执行编译构建操作。
  • 微服务源代码或者公共基础类的源代码经过 构建打包 之后,就会变成容器镜像并存放在容器镜像仓库中,进行应用发布的时候,就可以使用这些容器镜像发布微服务到云原生环境。

基础模块类型

  • 所有微服务的源代码都必须经过 构建打包发布 这三个步骤才可以发布到云环境,因此DORY中有三种模块类型:

/docs_old/concepts/pipeline-module/images/source-build-package-deploy.png

  • 构建模块: 设置构建阶段各个微服务的源代码目录,如何进行编译构建,形成编译构建包。例如: java的源代码目录,如何进行编译构建,形成jar包。
  • 打包模块: 设置打包阶段如何把构建阶段编译构建出来的编译构建包,打包成容器镜像。例如: jar包如何打包成容器镜像,并推送到容器镜像仓库中。
  • 发布模块: 设置发布阶段如何把打包阶段打包出来的容器镜像,在云原生环境以微服务形式运行。例如: 微服务的对外服务的端口、微服务的启动命令、微服务启动需要多少CPU或者内存资源、微服务的健康检查方式等等。

基础模块的对应关系

  • 项目、代码仓库、各种模块有如下关系:

    • 一个项目(project)对应一个代码仓库(gitRepo)
    • 一个代码仓库(gitRepo)可以包含多个代码目录
    • 一个代码目录对应一个构建模块,不同构建模块可以分阶段进行构建
    • 多个构建模块可以打包成一个打包模块
    • 一个打包模块可以发布成多个发布模块
  • 现在我们以一个demo-shop电子商城项目的例子来讲解为什么这种对应关系可以适应各种非常复杂的应用发布场景

/docs/images/modules-flow-example.png

  • demo-shop代码仓库中包含五个代码目录:
    • Codes/Backend/ds-base: 基础类源代码目录,使用java开发,使用maven编译构建
    • Codes/Frontend/ds-webapp: 电子商城前端界面源代码目录,使用javascript开发,使用npm编译构建
    • Codes/Backend/ds-statistic: 统计分析功能源代码目录,使用python开发
    • Codes/Backend/ds-order: 订单管理功能源代码目录,使用java开发,使用maven编译构建。需要依赖Codes/Backend/ds-base编译构建的结果才能进行编译构建
    • Codes/Backend/ds-inventory: 库存管理功能源代码目录,使用java开发,使用maven编译构建。需要依赖Codes/Backend/ds-base编译构建的结果才能进行编译构建
  • 构建阶段分为五个构建模块: ds-baseds-webappds-statisticds-orderds-inventory,分别对应五个代码目录。由于ds-orderds-inventory依赖于ds-base模块的编译构建结果,因此构建分为两个阶段,第一阶段并行构建ds-baseds-webappds-statistic,第二阶段并行构建ds-orderds-inventory。(通过设置构建模块中的构建步骤ID可以设置构建模块在哪个阶段进行编译构建)
  • 打包阶段分为两个打包模块: ds-shopds-statistic。其中构建模块ds-webappds-orderds-inventory会被统一打包成一个ds-shop容器镜像;构建模块ds-statistic会被打包成一个ds-statistic容器镜像。
  • 发布阶段分为三个发布模块: ds-web-orderds-web-inventoryds-statistic。其中打包模块ds-shop在发布阶段会变成两个微服务ds-web-orderds-web-inventory,分别用于给用户以及库存管理员使用;而打包模块ds-statistic会被发布成一个ds-statistic的微服务,用于统计分析用途。

模块开关与智能路由

  • 有了上边基础模块的对应关系,我们就可以通过构建模块开关设置,使用DORY的智能路由决定哪些微服务需要发布到云环境。

/docs/images/modules-flow-example-switch.png

  • 如上图
  • 假如ds-baseds-webappds-orderds-inventory代码目录发生了变更
  • 那么就会执行ds-baseds-webappds-orderds-inventory四个构建模块的编译构建
  • 并执行ds-shop打包模块的镜像打包
  • 最后执行ds-web-orderds-web-inventory两个微服务的发布