devops Planting 为测试工程师开发的部署框架

yitu tester · 2018年04月02日 · 最后由 yitu tester 回复于 2018年11月14日 · 2658 次阅读
本帖已被设为精华帖!

简介

Planting 是一个为测试工程师开发的部署框架,使用 python 语言编写,为了解决测试团队在测试过程中的部署问题。作为一个测试工程师你是不是也遇到过以下问题:

  • 手动部署花费时间长,配置容易出错、遗漏问题
  • 多集群多节点配置参数不一致,相互依赖问题
  • 持续集成 CI 中的部署自动化问题
  • 多产品线部署需求问题
  • 多平台的部署自动化方案
  • 复杂部署过程中的失败重试问题
  • 降低一个新产品的部署工具开发的代价
  • 部署工具的开发协作与分享问题

Planting 对部署的理解与设计

这里对部署的理解与设计,主要针对目前的公司产品形态以及部署需求。如果有更多需求,Planting 完全可以进一步开发进行扩展和定制。
部署必然包含两部分,部署工具与被控设备(系统)。这里的被控设备(系统)常见的有各种操作系统 Linux、 Windows、 MacOS, 移动端有 iOS 和 Android 等,不常见的比如嵌入式系统等。被控设备(系统)还包括部署过程中涉及到的一些系统,比如各种软件仓库(Nexus, Artifactory 等)。

部署工具如果需要多产品线开发协作与分享,使用核心框架与插件配合的方式,是我们认为最合适的方式。

核心框架包括了远程控制接口层以及在其上的底层核心功能库(常见部署功能模块,配置管理模块,软件仓库管理模块等)。远程控制接口层可以包含或复用各种远程控制模块比如 ansible 远程控制模块,python 语言的 paramiko、fabric 库,移动端 Android 可以是 adb, iOS 可以是 iOSShell。远程控制接口层可以根据需要进行定制和扩充。底层核心功能库的常见功能模块需要包含各种最基本的部署操作或者部署操作的组合,比如创建目录,下载文件,解压文件。具体实现可以复用像 Ansible 这类工具的功能模块,减少重复造轮子。当然也可以自己编写各种功能模块。配置模块包含命令行参数配置与框架配置,来保证整个部署可以灵活控制调整。

插件是一个软件(系统)部署功能的具体实现。从逻辑概念上抽象出了部署模式(Mode),部署步骤(Stage),部署操作(Action)等概念。这些概念是对一个部署功能的分层抽象。

进一步举例介绍模式(Mode)、步骤(Stage)和 操作(Action)的关系:

一个软件的部署模式有直接部署和升级部署以及扩展部署等多种模式。每种部署模式又会包含多个步骤,所有步骤执行成功代表部署成功。每个部署步骤又由一个或多个部署操作组合在一起。部署操作一般是粒度比较小的一个执行操作,但一般并不是最小粒度的操作。正常来说部署执行的过程因为网络,软件配置等问题总会有执行失败的情况,需要提供一种重试机制,减少复杂部署不必要的重复执行开销。选择在部署 Stage 这一粒度上进行重试,被认为是一种合适的策略。

再来看操作(Action)和功能模块(Module)的关系:

Action 操作可以由一个或多个不同的功能模块组成。每个功能模块(Module)一般被认为是一个不能继续拆分的执行。所有基本的功能模块应该存在于部署框架当中,而最常用到的 Action 也应该由核心的框架层提供,以方便所有插件共同使用。同时插件也可以有自己实现的 Action , 这些 Action 可以方便地在引用它的插件中使用,达到共享的目的。

Planting 部署实现架构

Planting 核心框架可以简单划分为两部分,插件管理模块和插件执行模块。插件管理模块负责管理各种插件,安装、卸载、升级插件,维护整个插件池。插件执行模块对整个软件部署执行过程进行管理。它根据插件配置和框架配置从插件池动态加载插件进行执行。执行的过程就是根据插件配置(模式,各种参数)以及框架配置(被控节点信息,软件仓库地址等)进行部署的过程。执行模块还包含一个观察者角色,其负责对执行状态进行记录。部署重试功能就是通过观察者角色记录的 CheckPoint 来实现。

Planting 软件发布管理

核心框架与所有插件均以 python pip 包的形式保存在公司内网的 pip server 上。每个插件拥有自己的代码库,不同插件开发、调试、发布新版本可以完全隔离。

核心特性

planting 的核心特性概述如下:

  1. 提供部署核心框架与一套灵活可扩展的插件体系
  2. 部署执行方式简单,支持命令行与自动化测试 CI 可紧密合作
  3. 支持脚手架功能,插件上手简单,编写效率高
  4. 使用 Ansible 源码,复用 Ansible 优秀特性
  5. 部署过程支持失败重试功能
  6. 远程控制具有可扩展性,能根据需求增加对新设备的控制
  7. 不仅仅是一个部署框架也是一个自动化运维框架

特性拆解

提供部署核心框架与一套灵活可扩展的插件体系

作为一家 AI 创业公司,产品线众多,不可能搞一个大而全的部署工具,维护成本太高。通过核心框架与插件化相结合的思路能够让多产品线部署工具独立开发,完全解耦。对于具有共性的部署问题可以通过框架层解决,不让各个插件重复造轮子。

部署执行方式简单,支持命令行与自动化测试 CI 可紧密合作

作为一个为测试工程师开发的部署框架,通过命令行进行自动化部署是第一选择。命令行能同时满足手动部署以及 CI 自动化测试前的部署。

支持脚手架功能,插件上手简单,编写效率高

每个部署插件以 python pip 软件包形式发布。为了降低每个产品线开发部署工具的学习成本,比如学习使用 setup 的规范。我们提供了整个框架包括 setup 文件,可以一键打包。同时通过脚手架,我们把目录进行了定制,并实现了一个最简单的部署功能。让插件开发者可以快速模仿并实现自己的部署功能。

使用 Ansible 源码,复用 Ansible 优秀特性

使用 Ansible 源码的方式让我们摆脱了用 yaml 语法来定义部署过程的束缚。Ansible 变成了整个部署框架的一个组件,它可以提供远程控制能力,并发能力。它提供的各种方便的功能模块,减少了我们很多重复造轮子的时间。

部署过程支持失败重试功能

部署过程的失败重试功能往往在部署复杂软件时效果明显,可以节约很多从头重新部署的时间。

远程控制具有可扩展性,能根据需求增加对新设备的控制

在整个部署框架设计之初,我们就考虑了未来可能增加更多需要控制和部署的设备或者系统。因此框架远程控制接口变成可扩展对我们意义重大,在需要的时候随时可以增加或者替换新的远程控制库。

不仅仅是一个部署框架也是一个自动化运维框架

虽然这个工具本身为部署而生,但是其本质是远程控制,远程操作。因此其完全有能力根据需求扩展成一个自动化运维框架。

Planting Demo

Planting 创建插件的过程

Youku

···
视频演示了 Planting 如何初始化一个插件以及如何打包并上传插件到 pip 仓库的过程。

Planting 使用部署插件

Youku

···
视频演示了 Planting 如何安装和使用部署插件,插件功能:远程控制多台 linux 机器在上面创建目录并下载图片。

写在后面

对我们感兴趣的你,对 Planting 感兴趣的你,可以点击以下链接:
[上海][依图科技] 招聘 - 系统测试开发工程师 - 也许是你经历过的最有趣的测试岗位

共收到 9 条回复 时间 点赞
simple [精彩盘点] TesterHome 社区 2018 年 度精华帖 中提及了此贴 01月07日 12:08
simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44
haitongz 回复

很久没来看这个帖子,估计社区很多同学是互联网方向的,不太能理解我们这些做 To B 软件的同学的痛苦. 多版本 * 不同拓扑架构的集群下的部署是一个很大的挑战,所以这就是为什么我们会做一个 Planting 的部署工具来解决这个大矩阵下的部署痛点

我们正在做 Planting 2.0 ,这个是一个重新在功能和性能层面做过优化和改进的版本,这个版本后续也会有计划开源出来,和大家分享

ddfgd 回复
  1. 可能是生产环境的部署方式比较复杂,不方便测试环境做自动化;理解这里的部署框架很重要的目的是实现自动化部署

Planting 是一个为测试工程师开发的部署框架,使用 python 语言编写,为了解决测试团队在测试过程中的部署问题.
1、测绘环境的部署不应该是和生产环境一起的吗,为什么要自己开发一套呢?
2、不是一套换的化,怎么保证在 debug 问题的是保证环境没问题呢?

仅楼主可见

啥时候开源出来玩玩呀。

这个不错啊,和自动化测试用例或性能测试结合起来更好,对性能测试中各种统计信息的监控与记录,数据的初步分析与图形化,自己曾用 shell 调用 ansible 和 python 做了性能测试中稳定性测试的脚本自动化,但是不够通用,楼主这个能开源就好了,能学习下

有计划把代码和文档再整理一下后, 会开放出来给更多有兴趣的同学试用

国文 将本帖设为了精华贴 04月09日 10:05

看上去不错的样子,有开源的打算吗?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册