xiaomo_cxl 发表于 2016-2-16 13:39:59

自动发布系统

因为是小公司,平时测试或者正式发布版本都是由测试负责,而且公司项目也多,就由此写了一个简单的发布系统。发布系统是基于bs结构,这样团队的每个人都可以用这个发布,但是只是局限同时只能发布一个项目,因为自己代码能力也不够,大家可以评论下怎么实现同时发布多个,这样肯定要涉及到多线程了。前端实现很简单,用html,css,jquery实现的,如图服务端实现也简单,用的是python的flask框架,服务端接收到请求之后,对参数解析后,找到正确执行的发布脚本并执行,然后把打印在终端的执行结果信息反馈到前端,服务端启动没有用守护进程,而是用supervisor进行监控启动着,原理就是这样,因为自己不是做开发的,所以实现的方法也比较笨,很多难题无法优化解决,比如打印在终端的执行结果信息只能重定向到文件,从文件中读取返回到前端;前端请求发布的时候,因为执行发布脚本时间较长,所以浏览器页面一直在请求中,导致异步请求执行日志的结果无法在前端显示,我只能通过打开新的页面展示出来,发布系统是完成了,而且也能正常使用,只是实现的方法比较挫,有经验的可以评论下好的方法,下面贴一下服务端实现的代码:#!/usr/bin/python
#-*- coding:utf8 -*-

from flask import Flask, request, render_template
from flask_debugtoolbar import DebugToolbarExtension
import os

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/issue',methods=['GET','POST'])
def issue():
    os.system('echo '' > /home/svn/flask/nohup.out')

    if request.method == 'GET':
        server = request.args.get('server')
        project = request.args.get('project')
        version = request.args.get('version')
        passwd = request.args.get('passwd')
        way = request.args.get('way')

        if passwd != '***':
          return '发布密码错误'
        if '***' in server:
          '''if 'shuimifang' in project:
                os.system("/usr/bin/fab -f /home/svn/flask/script/sh-server/shuimifang_issue.py main:"+version+">/home/svn/flask/nohup.out 2>&1")
                return '发布成功'''
          if 'qxs2o' in project:
                if way == 'issue':
                  os.system("/usr/bin/fab -f /home/svn/flask/script/sh-server/qxs2o_issue.py main:"+version+">/home/svn/flask/nohup.out 2>&1")
                  return '发布成功'
                else:
                  os.system("/usr/bin/fab -f /home/svn/flask/script/sh-server/qxs2o_restart.py main")
                  return '重启成功'
          if 'yibao' in project:
                #os.system("fab -f /home/svn/flask/script/sh-server/yibao_issue.py main:"+version)
                return '暂不支持自动发布'
          if 'qxqihuo' in project:
                #os.system("fab -f /home/svn/flask/script/sh-server/qxqihuo_issue.py main:"+version)
                return '暂不支持自动发布'
        if u'***' in server:
          if 'qxdai' in project:
                os.system("/usr/bin/fab -f /home/svn/flask/script/aly-server/qxdai_issue.py main:"+version+">/home/svn/flask/nohup.out 2>&1")
                return '发布成功'
          if 'qianshang' in project:
                os.system("/usr/bin/fab -f /home/svn/flask/script/aly-server/qianshang_issue.py main:"+version+">/home/svn/flask/nohup.out 2>&1")
                return '发布成功'
          if 'shuimifang' in project:
                if way == 'issue':
                  os.system("/usr/bin/fab -f /home/svn/flask/script/aly-server/shuimifang_issue.py main:"+version+">/home/svn/flask/nohup.out 2>&1")
                  return '发布成功'
                else:
                  os.system("/usr/bin/fab -f /home/svn/flask/script/aly-server/shuimifang_restart.py main")
                  return '重启成功'
        if u'测试服务器' in server:
          return '暂不支持自动发布'

if __name__ == '__main__':
    app.run(debug=True, host='192.168.16.17', port=5000)以上是发布程序,在贴一下发布脚本执行信息反馈到前端的代码:#!/usr/bin/python
#-*- coding:utf8 -*-

from flask import Flask, request, render_template
from flask_debugtoolbar import DebugToolbarExtension
import os
import requests

app = Flask(__name__)

fp = open('/home/svn/flask/nohup.out','r')

@app.route('/')
def index():
    return render_template('index-log.html')

@app.route('/log',methods=['GET','POST'])
def log():
    global fp

    if request.method == 'GET':
        ret = fp.readline()
       
        if 'Disconnecting from' in ret:
          fp.close()
          fp = open('/home/svn/flask/nohup.out','r')
        return ret

if __name__ == '__main__':
    app.run(debug=True, host='192.168.16.17', port=5001)以上就是完整的发布系统了,发布的脚本各公司各异就不贴了,以上程序能执行基本功能,但是有很多小问题,大家可以评论


页: [1]
查看完整版本: 自动发布系统