因为是小公司,平时测试或者正式发布版本都是由测试负责,而且公司项目也多,就由此写了一个简单的发布系统。 发布系统是基于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)
复制代码 以上就是完整的发布系统了,发布的脚本各公司各异就不贴了,以上程序能执行基本功能,但是有很多小问题,大家可以评论
|