上一篇文章《记一次诡异的故障排查经历》中有介绍到我们的部署程序varian,文章发布后有小伙伴对varian很感兴趣,今天就简单的介绍一下我们的varian,揭开她神秘的面纱~

什么是varian

varian是我们基于Python3编写的一套部署程序,处在整个部署系统的中心,与CMDB、Jenkins、SVN/Git、镜像仓库Harbor、Kubernetes API、通知系统等都有交互,负责将源代码经过一系列的处理后打包成Docker镜像,并发布到各个环境,然后通知相关人员。简化后的varian架构如下:

项目环境介绍

  • 项目数量:50+
  • 开发语言:php、java、nodejs
  • 代码版本管理工具:svn、git
  • 编译方式:maven、grunt、yarn
  • 通知方式:email、sms、im

varian能解决我们哪些问题

说到解决的问题,要先聊一下部署系统经历的几个迭代版本:

  1. 最早项目比较少,所用架构及技术也比较单一,每个项目都单独维护了一个shell脚本做部署,脚本里配置了项目的所有信息,包含服务器列表、代码路径等项目特有信息和通知类型等公共信息,各项目脚本之间互不干涉。这样做的好处是每个项目部署发布逻辑都比较简单,修改任何一个项目都对其他项目无影响;但缺点也很明显,各个项目脚本分散,任何项目信息变更都需要取改这个脚本,且一些公共功能的修改就需要所有项目脚本都改一遍,难免不出问题。

  2. 后来随着项目、服务器数量的增多,引入了CMDB来管理项目和主机的基本信息,纯shell的脚本也升级为了python+shell的脚本来维护编译部署,把一部分公共模块例如去CMDB拉取项目下的主机列表、邮件通知等从shell脚本中单独抽出来用python重构,并用python实现了一个主入口,所有项目部署都通过这个主入口进入,然后调用python或shell脚本来实现部署发布整过程,这样解决了脚本分散和公共模块更新所有项目脚本都要跟着修改的问题,但是添加一个新项目还是要手动更新一堆的脚本文件,效率低且易出错,各个项目处理逻辑各不相同,对需要熟悉她的新人很不友好。

  3. 现在线上项目数量已经超过50+,且还在不断增多,微服务、容器化等新技术也不断加入,每天进行数十上百次的部署更新,对部署系统的健壮性,扩展性有了更高的要求。基于之前一步步的探索,采用微服务的设计理念,我们实现了现在这一套部署程序varian,效率高、易扩展、出错率大大降低且对新人友好,解决了以上遇到的所有问题。

varian究竟长何种模样

说了这么多,那varian究竟是个什么样子呢?

设计思路

Lego积木,就是那种各个不同的小模块能拼装成各种各样的建筑的玩具。设计的思路也主要采用了lego的方式,把所有的功能都拆分成一个一个的python类,部署项目时就组装不同的类,例如一个最简单的纯静态web项目,组装了“拉代码模块”+“JS/CSS合并压缩模块”+“分发API模块”+“邮件通知模块”,如果是一个纯java api项目呢?组装“拉代码模块”+“maven编译模块”+“分发API模块”+“邮件通知模块”即可,从上边的例子可以就可以看出这种组装模块的优势。

所有模块可复用,来了一个新项目根据项目架构、开发语言等因素去判断目前的模块是否能够满足,如果可以满足就直接组装使用吧,如果确认过眼神,实在满足不了呢?那就新加一个模块,模块编写遵循简单可复用原则,需考虑到后续有类似功能可以直接使用此模块。

可能会有疑问?那些各个项目不同的配置怎么办?例如代码路径。这里采用了逻辑(模块)跟配置拆分的设计方式,所有处理逻辑不涉及任何一个项目特有的属性,项目特有的属性都单独配置,我们采用CMDB来配置,CMDB里有一张deploy的表,表关联project,记录了项目的特殊属性,例如通知邮件列表等等,逻辑模块会调用CMDB API自动取出所需配置信息。

实现方法

  • 目录结构如下:
varian/
|-- main.py #入口主函数
|-- module
| |-- __init__.py
| |-- notify.py
| |-- check.py
| |-- ...更多模块
|-- project
|-- website #项目名
| |-- cache #存放log等内容
| |-- docker #打包docker镜像目录
| |-- svn #svn源代码目录
  • 简化过的主函数main.py如下(代码随机删除。。意思对就行吧)
#!/usr/bin/env python
# -*- coding: utf-8 -*- import argparse,sys
from module import build,public parser=argparse.ArgumentParser(description='deploys duang!!!') parser.add_argument(dest='pro_name',type=str)
parser.add_argument(dest='env_name',type=str)
parser.add_argument(dest='parameters',nargs='*') args=parser.parse_args() class M(object):
def __init__(self):
self.pro_name = args.pro_name
self.env_name = args.env_name
self.parameters = args.parameters self.build_ob = build.BUILD(self.pro_name,self.env_name)
self.public_ob = public.PUBLIC(self.pro_name,self.env_name) self.maps = {
"7":"self.build_ob.Maven_Build", "14":"self.public_ob.Remove_Cache",
} def main(self):
self.arg_list = self.parameters if self.env_name not in ("dev","qa","hidden","product"):
print("\n环境参数错误.\n")
sys.exit() for self.every_arg in self.arg_list:
self.func = self.maps[self.every_arg]
self.func_ob = str("%s()" % self.func)
exec(self.func_ob) if __name__ == '__main__':
m = M()
m.main()
  • modele下的模块函数,以maven编译模块为例
class BUILD(object):
def __init__(self,pro_name,env_name):
self.pro_name = pro_name
self.env_name = env_name self.svn_path = ("%s/project/%s/svn" % (sys.path[0],self.pro_name)) def Maven_Build(self):
self.command = str("cd %s; mvn clean package -P%s -Dmaven.test.skip=true" % (
self.svn_path, self.env_name)
) try:
print("\nStart maven build in webapp.\n")
self.result = os.system(self.command)
assert self.result == 0
except AssertionError:
print("\nMvn build error!\n")
sys.exit() # 异常退出,这个再模块中非常重要

使用方法

  • 控制台使用:
python main.py static qa 1 3 6 8

# 第一个参数为项目名
# 第二个参数为部署环境
# 后边的参数就是要构建的模块组合
  • Jenkins使用:

只需要将控制台命令贴到jenkins的构建步骤中当做shell执行即可

总结

  1. 简单即是美
  2. 适合自己的就是最好的

探秘varian:优雅的发布部署程序的更多相关文章

  1. ASP.Net网站程序在编译发布部署后的后期修改

    ASP.Net网站程序在发布部署后的后期修改 作者:东篱南山 这里说的后期修改是指网站编译发布并部署好之后,对程序进行的修改,即在不能更改现有代码的情况下,更改页面的显示或是更改业务逻辑.一般是在程序 ...

  2. NET5实践:项目创建-结构概述-程序运行-发布部署

    ASP.NET5实践01:项目创建-结构概述-程序运行-发布部署   1.项目创建 ASP.NET5项目模板有三种: 新建项目: 选择模板: 2.结构概述 References对应配置是project ...

  3. ASP.NET网站怎么发布 Web项目程序怎么发布部署(暂时收藏)

    Web程序如何发布部署呢.网站项目做好了,需要发布出来,提交给客户,装上服务器.那怎么在ASP.NET开发环境中将网站程序发布出来呢 ^_^   工具/原料 Visual Studio 2010  ( ...

  4. 关于在windows下部署发布QT程序的总结

    原文请看:http://www.cnblogs.com/javaexam2/archive/2011/05/18/2632916.html 关于在windows下部署发布QT程序的总结 2008-06 ...

  5. 快速搞懂.NET 5/.NET Core应用程序的发布部署

    .NET Framework时代,.NET 应用程序大多直接部署运行在Windows服务器上,当然也可以通过Mono部署运行在Linux上.无论部署exe,还是IIS站点.或是Windows Serv ...

  6. [亲测]ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

    前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...

  7. nodejs使用vue从搭建项目到发布部署

    都说是使用vue 脚手架自然用的是vue-cli npm install vue-cli -g 建立项目 vue init webpack demo //vue初始化 使用webpack 项目名称 这 ...

  8. [亲测]七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

    前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...

  9. 用Nuget部署程序包

    用Nuget部署程序包 Nuget是.NET程序包管理工具(类似linux下的npm等),程序员可直接用简单的命令行(或VS)下载包.好处: (1)避免类库版本不一致带来的问题.GitHub是管理源代 ...

随机推荐

  1. mysql中设置默认字符编码为utf-8

    使用过Linux的同志就知道,在Linux下安装mysql,尤其是使用yum安装的时候,我们是没法选择其默认的字符编码方式.这个就是一个比较头痛的问题,如果Linux数据库中使用到中文的时候,乱码问题 ...

  2. mdadm详细使用手册

    1. 文档信息 当前版本 1.2 创建人 朱荣泽 创建时间 2011.01.07 修改历史 版本号 时间 内容 1.0 2011.01.07 创建<mdadm详细使用手册>1.0文档 1. ...

  3. Java Spring 后端项目搭建

    参考了几位同行的Blogs和StackOverflow上的许多问答,搭建了此后端项目,替换原来的node.js后端,和前一篇中搭建的Vue Web App项目配合使用,后端准备只提供服务,不包含后端装 ...

  4. Spring Boot 应用系列 1 -- Spring Boot 2 整合Spring Data JPA和Druid,双数据源

    最近Team开始尝试使用Spring Boot + Spring Data JPA作为数据层的解决方案,在网上逛了几圈之后发现大家并不待见JPA,理由是(1)MyBatis简单直观够用,(2)以Hib ...

  5. App主导现在 HTML5领衔未来

    HTML5能够让开发人员构建丰富的基于Web应用程序,使其能在任何设备中使用标准的Web浏览器.很多人认为HTML5将会让App过时.到底App还是HTML5会是谁赢得最后的胜利,在业界也有不少讨论, ...

  6. 利用backtrace和backtrace_symbols函数打印调用栈信息

    在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈. #include <execinfo.h>  int backtrace(void * ...

  7. ES6 学习笔记之四 对象的扩展

    ES6 为对象字面量添加了几个实用的功能,虽然这几个新功能基本上都是语法糖,但确实方便. 一.属性的简洁表示法 当定义一个对象时,允许直接写入一个变量,作为对象的属性,变量名就是属性名. 例1: , ...

  8. 设计模式之代理模式(Proxy Pattern)_补充篇

    写在前面: 代理模式的内部原理,作用及远程代理的实现在上一篇博文中都做了详细解释,本文只是对其内容的补充,介绍其它代理 一.虚拟代理 首先,明确虚拟代理的作用:在巨大对象被真正创建出来之前,用虚拟代理 ...

  9. C#全局键盘监听(Hook)

    一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...

  10. C# 标准事件模式

    .NET框架为事件定义了一个标准模式,它的目的是保持框架和用户代码之间的一致性. 标准事件的模式核心是SystemEventArgs——预定义的没有成员的框架类(不同于静态Empty属性) Event ...