51Testing软件测试论坛

标题: 自动发布系统 [打印本页]

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

  3. from flask import Flask, request, render_template
  4. from flask_debugtoolbar import DebugToolbarExtension
  5. import os

  6. app = Flask(__name__)

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

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

  13.     if request.method == 'GET':
  14.         server = request.args.get('server')
  15.         project = request.args.get('project')
  16.         version = request.args.get('version')
  17.         passwd = request.args.get('passwd')
  18.         way = request.args.get('way')

  19.         if passwd != '***':
  20.             return '发布密码错误'
  21.         if '***' in server:
  22.             '''if 'shuimifang' in project:
  23.                 os.system("/usr/bin/fab -f /home/svn/flask/script/sh-server/shuimifang_issue.py main:"+version+">/home/svn/flask/nohup.out 2>&1")
  24.                 return '发布成功'''
  25.             if 'qxs2o' in project:
  26.                 if way == 'issue':
  27.                     os.system("/usr/bin/fab -f /home/svn/flask/script/sh-server/qxs2o_issue.py main:"+version+">/home/svn/flask/nohup.out 2>&1")
  28.                     return '发布成功'
  29.                 else:
  30.                     os.system("/usr/bin/fab -f /home/svn/flask/script/sh-server/qxs2o_restart.py main")
  31.                     return '重启成功'
  32.             if 'yibao' in project:
  33.                 #os.system("fab -f /home/svn/flask/script/sh-server/yibao_issue.py main:"+version)
  34.                 return '暂不支持自动发布'
  35.             if 'qxqihuo' in project:
  36.                 #os.system("fab -f /home/svn/flask/script/sh-server/qxqihuo_issue.py main:"+version)
  37.                 return '暂不支持自动发布'
  38.         if u'***' in server:
  39.             if 'qxdai' in project:
  40.                 os.system("/usr/bin/fab -f /home/svn/flask/script/aly-server/qxdai_issue.py main:"+version+">/home/svn/flask/nohup.out 2>&1")
  41.                 return '发布成功'
  42.             if 'qianshang' in project:
  43.                 os.system("/usr/bin/fab -f /home/svn/flask/script/aly-server/qianshang_issue.py main:"+version+">/home/svn/flask/nohup.out 2>&1")
  44.                 return '发布成功'
  45.             if 'shuimifang' in project:
  46.                 if way == 'issue':
  47.                     os.system("/usr/bin/fab -f /home/svn/flask/script/aly-server/shuimifang_issue.py main:"+version+">/home/svn/flask/nohup.out 2>&1")
  48.                     return '发布成功'
  49.                 else:
  50.                     os.system("/usr/bin/fab -f /home/svn/flask/script/aly-server/shuimifang_restart.py main")
  51.                     return '重启成功'
  52.         if u'测试服务器' in server:
  53.             return '暂不支持自动发布'

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

  3. from flask import Flask, request, render_template
  4. from flask_debugtoolbar import DebugToolbarExtension
  5. import os
  6. import requests

  7. app = Flask(__name__)

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

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

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

  15.     if request.method == 'GET':
  16.         ret = fp.readline()
  17.        
  18.         if 'Disconnecting from' in ret:
  19.             fp.close()
  20.             fp = open('/home/svn/flask/nohup.out','r')
  21.         return ret

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







欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2