# orderlines **Repository Path**: Y-aong/orderlines ## Basic Information - **Project Name**: orderlines - **Description**: 工作流框架 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 3 - **Created**: 2023-10-02 - **Last Updated**: 2025-05-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

orderlines

使用python开发的一套devops系统。


### 一、设计思路 前期想针对**自动化测试**。后面觉得自动化测试平台可能不够有意思,加上自己工作慢慢转向`devops`,所以想针对`devops`来开发一套系统。当然这套系统也是可以进行自动测试的,但是我现在主要对它的期望是**devops自动化**。 流程的使用有向图进行表示 插件库就是我们具体要运行的任务。 插件库中有基本的**标准库、流程网关、自定义插件** - **标准库:**开始节点、结束节点、子流程 - **流程网关:**流程控制、并行节点 - **自定义插件:**这个就是我们实际要运行的任务,比如http请求。 当然我在设计的过程中有借鉴很多其他的优秀模块,比如python中很出名的airflow框架,以及著名的测试框架`robotframework`。我的表结构设计是借鉴airflow的,组件库的思路是借鉴`robotframework` 的。但是我在本质上还是和他们有很大的区别的。比如airflow是有向无环图,`orderlines`是有向有环图,因为我需要做循环。当然这个项目肯定是站在别人的肩膀上的。 **为什么要做这个项目呢?** - 第一:我发现python中没有一个模块可以全部支持,流程判断、并行这些功能的工作流。 - 第二:我在之前的工作中都是有关于自动化的、我想把之前的技能融合起来,既打发了自己的无聊时间,又可以为其他人撑一把伞,何乐而不为呢? - 第三:很多工作流都是代码生成图形,我想开发个低代码的平台,让学习和使用成本都更简单。 ### 二、架构设计 #### 2.1、架构图 img.png - **Web UI:**指的是相配套的前端页面,通过接口查看、创建、控制流程。用http接口控制流程。 - **Web Server服务器:**可以接受http请求,用于提供用户界面的操作窗口,主要负责操作,查看流程等。 - **Schedule定时器:**负责定时任务,周期任务,间隔任务,将流程交给Executor执行。 - **Executor执行器:**主要负责流程的运行,以及异常的处理。把每个流程中的任务解析运行。 - **worker:**负责具体的流程运行,目前默认使用celery作为执行者。 - **database数据库:**存储流程信息,流程实例,任务信息,任务实例等相关数据。 ### 三、功能介绍 #### **3.1、工作流的主要功能** - **工作流的基本功能** - 流程串行,基本功能 - 定时任务,定时执行,间隔执行,周期执行 - 流程版本,一个流程可以对应多个版本 - **变量解析** - 任务返回值,返回值进行四则运算和变量拼接。(返回值使用`mongodb`或者`redis`进行存储——开发中) - 运行时增加运行参数变量, 参数变量可以在流程中使用 - **任务网关** - 流程控制, 根据任务运行状态和上个节点的返回值运行 - 任务组,多个任务合成一个任务 - 流程并行(可选择使用协程io密集型和进程cpu密集型) - **自定义插件** - 支持自定义插件安装,方便业务功能扩展 - **任务处理** - 任务超时,给定超时时间(开发中) - 异常处理策略,重试,忽略,抛错 - 任务回调,特定任务状态(成功,失败,超时,忽略,重试)可以指定回调函数 - 任务停止,支持有无状态任务和有状态任务的停止 - **使用方式** - 支持http接口操作 - 命令行模式,详情查看`orderlines --help` - 增加`grpc`方式操作 - **权限控制** - `rbac`权限,支持角色和群组两种模式 - **流程配置** - 前端配置界面 - 支持`yaml`文件,`json`文件创建 - **部署方式** - docker-compose一键式部署 #### **3.2、整体系统的主要功能** 因为系统主要针对于`devops`流程,所以很多功能也是全面拥抱`devops`全流程的开发。当然由于整个`devops`全流程涉及的知识点特别广泛,所以我也是有所重点的开发。很多功能还是todo状态。 - 运维中心——可以**把它看为流水线**,每个流程就是一个流水线,也是整个系统中最为重要的一部分。这里分为两个部分第一是使用自己的工作流;第二是通过拖拉拽的方式生成`jenkins`流水线。中间可以集成很多的相关业务功能、比如**http请求、ansible、编译、部署**等相关功能。 - 代码中心——这里是和`gitlab`进行联动的。 - 监控中心——主要是调用**Prometheus**的相关接口对于系统进行监控。 - 制品中心——现在是todo状态,目前已经有思路了,后期会和制品仓`JFrog`进行联动。 - 日志中心——目前只有`api`接口日志,后期想和ELK进行结合。 - 插件管理——主要针对的就是**业务功能**的相关任务。 - 权限管理——是系统的相关**权限管理**功能。 - 系统管理——主要针对**系统相关配置**参数。 ### 四、页面介绍 #### 1、首页 首页主要展示的是系统最主要功能**流程运行情况**,**告警信息**的大概展示。 img.png #### 2、数据大屏 数据大屏是一些重要信息的摘要。 img.png #### 3、配置流程 流程配置是整个系统最重要的部分。整个页面主要分为左侧任务菜单、顶部工具按钮、右侧任务、变量、流程配置区、中间流程图配置区、底部日志展示区。 - **左侧任务菜单:**这里主要是业务任务菜单,展示的内容都是**标准库和自定义插件中定义的任务**。 - **顶部工具按钮:**这个是信息展示区**流程名称、版本、命名空间**和主要功能操作包括:**保存、编辑、启动、重启、停止、暂停、继续、调试**。 - **右侧任务、变量、流程配置区:**这里主要展示**任务的参数返回值和运行配置**、**变量的配置**、**流程的配置**以及**setup、teardown**。 - **中间流程图配置区:**主要是流程的配置。 - **底部日志展示区:**配置时不显示、在**运行和debug时展示**,是相关日志的展示。 **流程配置** img.png **debug模式** debug.png **运行完成** 运行模式.png **运行日志** 运行日志.png #### 4、运维中心 这里是整个系统中最重要的一部分。其中主要包括**流程、任务、变量、定时任务、jenkins**。其中流程分为两个部分 - **普通流程:**也就是我们自定义的任务组成的流程 - **jenkins流水线:**通过我们在jenkins中配置的jenkins流水线在这里配置完成后,会生成一个新的流水线,同样可以使用参数和返回值。 **流程、任务、变量**这三个页面都是**相互联系**的。流程需要任务和变量,变量和任务组成了流程。 **定时任务**是针对于**流程**所设置的**定时启动、分为指定时间、间隔时间、Crontab表达式**。 `jenkins`页面是通过数据采集获取`jenkins流水线`,可以在这个页面进行**统一管理**,和启动、停止操作。 dev_center.png **定时任务** 定时任务.png #### 5、代码中心 代码中心主要和`gitlab`集成,通过数据采集对于**`github`数据进行分析**。主要的分析点分为**仓库管理**、**分支管理**、**提交管理**后期还可以集成issue展示、和部门和成员信息进行联动,通过这些页面可以**直观查看成员、部门、项目的代码提交频率、提交质量(issue数量)、评审情况**。这个页面是非常有创造性的,可以展示很多项目问题 img.png #### 6、监控中心 img.png 监控中心是和Prometheus进行集成,这个页面是**非常非常重要**的。通过Prometheus可以监控我们服务的运行质量,对于每个节点进行监控分析,及时预警,及时反馈。这个页面我的设计主要分为**监控实例、告警通知、告警规则、以及告警审计**四大部分。 - **监控实例:**主要对于线上节点进行监控,通过Prometheus加定时任务的数据采集展示当前节点的基本状态。 - **告警通知:**这里可以通过配置选择不同的通知方式,一旦发生问题,及时有效的通知相关人员。 - **告警规则:**告警规则是告警的灵魂,规则的设置不好可能会发生告警轰炸,或者无法捕获到正确的告警。 - **告警审计:**告警发生之后我们要怎么办,肯定要及时复盘,这个主要是一个统计,复盘的功能。 **监控页面** img.png #### 7、制品中心 制品中心现在是未完成的状态,未来会和jfrog集成。制品是CI的终点是CD的起点。一个制品中间会包含多少提交、它的生命周期、生命地图(包含多少功能、多少提交、什么人的提交)在这里应该有体现。还有制品的生命周期,何时过期,以及后面部署的情况。 制品中心做为软件开发三大可信源之一,它的重要性可谓是不言而喻。但是由于个人时间有限,所以未开发完成。 img.png #### 8、日志中心 日志中心目前只包含当前系统的api日志,**未来计划和ELK进行集成**,展示流程日志和其他相关日志,方便查询相关流程信息。 img.png #### 9、插件管理 插件管理这里主要展示的是相关**流程业务功能**,包括**自定义插件的注册功能**。 img.png #### 10、权限管理 老生常谈的权限管理,目前前端权限管理未完成。因为是个不难但是费时费力的功能,后端已完成。 img.png #### 11、系统管理 系统管理主要是**系统参数和主机清单**的配置。系统参数包括流程中的一些默认参数配置,主机清单是因为流程中集成了**ansible**功能所以需要主机清单。 img.png ### 五、系统测试 #### 1、测试覆盖率71% image-20250318231226300 #### 2、单元测试数量323 img.png ### 六、流程状态介绍 #### 1、任务状态图 img.png #### 2、流程状态图 img.png #### 3、状态定义 ```python import enum class ProcessStatus(enum.Enum): green = 'SUCCESS' # 流程成功 red = 'FAILURE' # 流程失败 yellow = 'STOP' # 流程停止 grey = 'PENDING' # 流程排队中 blue = "RUNNING" # 流程运行中 class StatusEnum(enum.Enum): grey = 'PENDING' # 任务排队中 blue = 'RUNNING' # 任务运行中 red = 'FAILURE' # 任务失败 green = 'SUCCESS' # 任务成功 pink = 'SKIP' # 跳过任务 yellow = 'STOP' # 任务停止 orange = 'RETRY' # 任务重试中 ``` ### 七、启动方式 #### 1、docker启动, 直接部署 ```shell bash deploy.sh ``` #### 2、命令行启动 ```shell # 先进行打包 pip install --editable . # 查看命令行帮助 orderlines --help Commands: build-process-by-json build process by json file. build-process-by-yaml build process by yaml file. create-super-user create a super administrator. create-user create a super administrator. paused-process pause process by process instance id. recover-process recover process by process instance id. run-grpc run grpc server. runserver run orderlines server, default port 15900. schedule start schedule plan. start-process start process by process instance id. stop-process stop process by process instance id. # 启动命令 orderlines run-server # 启动flask服务 orderlines schedule # 启动定时器 orderlines run-grpc # 启动grpc celery -A celery_worker.celery worker --loglevel=info --pool=solo # 启动celery ``` #### 3、本地启动 ```shell pip install --editable . # 启动celery work cd src celery -A celery_worker.celery worker --loglevel=info --pool=solo # 启动celery beat celery -A celery_worker.celery beat -l info -s celery_logs # 启动flask python app.py # 启动flask ```