一键自动代码发布升级版

1,重写PYTHON的代码(支持一切无重启在线更新,可惜我那个RUBY版哈)

2,用FLASK写了WEB UI。(JQUERY实时输出执行过程)

3,未完事项(加强的用户认证,BOOTSTRAP结成,支持JAVA打包。。。。)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os,sys,commands,subprocess
import re,time,logging
from optparse import OptionParser

logging.basicConfig(level=logging.INFO,
                format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                datefmt='%a, %d %b %Y %H:%M:%S',
                filename='updateSVN.log',
                filemode='a')

def get_svn_list(name, ip, version):
    svn_update = {}
    for line in open("source file"):
    line_item = line.strip("\n").split("|")
    if ip == line_item[0] and name == line_item[1]:
        line_item = line.strip("\n").split("|")
        svn_update["salt_minion_ip"] = line_item[0]
        svn_update["svn_name"] = line_item[1]
        svn_update["salt_master_dir"] = "/srv/salt/%s/" % line_item[0]
        svn_update["server_dir"] = line_item[2]
        svn_update["svn_dir"] = line_item[3]
        svn_update["svn_pre"] = line_item[4]
        svn_update["svn_version"] = version
    if len(svn_update) != 7:
    error_output("database have none item at your xargs.")
    return svn_update

def error_output(error_str):
    print '\033[0;31;40m'
    print error_str + "<br>"
    print '\033[0m'
    sys.exit(1)

def exec_cmd(cmd):
    str_now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    (status,output) = commands.getstatusoutput(cmd)
    try:
    if int(status) == 0:
        print "%s   %s  is ---OK!<br>" % (str_now, cmd)
        logging.info(cmd + " ---is OK!")
        return output
    else:
        logging.info(cmd + " cant't finish...")
        print "%s   %s  can't finish...<br>" % (str_now, cmd)
        sys.exit(1)
    except:
    logging.info(cmd + " is Wrong")
    print "%s   %s  --- is Wrong<br>" % (str_now, cmd)
    sys.exit(1)

def salt_minion_test(salt_minion_ip):
    if "True" not  in exec_cmd("salt '%s' test.ping" % salt_minion_ip):
        error_output("salt minion %s is not active,please restart this minion and execute is again. " % salt_minion_ip)

def get_svn_file(svn_dir, svn_pre, svn_version, salt_master_dir):
    update_svn_A = []
    update_svn_D = []
    update_svn_M = []
    svnLog_cmd ="svn log -v -r %s %s  " % (svn_version, svn_dir)
    output = exec_cmd(svnLog_cmd).split('\n')
    for line in output:
    if line.startswith("  ") and "projects" in line:
        line_item = line.split()
        update_item = line_item[1].replace(svn_pre,'')
        if line_item[0] == "A" :
        update_svn_A.append(update_item)
        if line_item[0] == "D" :
                update_svn_D.append(update_item)
        if line_item[0] == "M" :
                update_svn_M.append(update_item)
    if len(update_svn_A) == 0 and len(update_svn_D) == 0 and len(update_svn_M) == 0 :
        error_output("no update file in this version ")
    exec_cmd("mkdir -p %s" % salt_master_dir)
    exec_cmd("rm -rf %s*" % salt_master_dir)
    update_svn_all = update_svn_A + update_svn_M
    for file_item in update_svn_all:
    file_dir = salt_master_dir + '/'.join(file_item.split('/')[:-1])
    exec_cmd("mkdir -p %s" % file_dir)
    svn_export_cmd = "svn export %s%s %s%s  --force" % (svn_dir, file_item, salt_master_dir, file_item)
    exec_cmd(svn_export_cmd)
    return  update_svn_A, update_svn_D, update_svn_M

def update_back(svn_name, salt_minion_ip,server_dir, svn_update_back):
    str_now = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
    server_back_dir = '/'.join(server_dir.split('/')[:-2]) + "/back/back-" + svn_name +str_now + "/"
    mkdir_back_cmd = "salt '%s' cmd.run 'mkdir -p %s'" % (salt_minion_ip, server_back_dir)
    exec_cmd(mkdir_back_cmd)
    for file_item in svn_update_back:
    back_dir_cmd = "salt '%s' cmd.run 'mkdir -p %s'" % (salt_minion_ip, '/'.join((server_back_dir + file_item).split('/')[:-1]))
    exec_cmd(back_dir_cmd)
    back_cmd = "salt '%s' cmd.run 'cp -p %s %s'" % (salt_minion_ip, server_dir + file_item, server_back_dir + file_item)
    exec_cmd(back_cmd)

def update_server_file(salt_minion_ip, server_dir, salt_master_dir, svn_update_server):
    for file_item in svn_update_server:
    salt_master_file = "salt://%s/%s" % (salt_minion_ip, file_item)
    salt_minion_file = server_dir + file_item
    update_file_cmd = "salt '%s' cp.get_file %s %s makedirs=True" % (salt_minion_ip, salt_master_file, salt_minion_file)
    #exec_cmd(update_file_cmd)
    chown_cmd = "salt '%s' cmd.run 'chown x:x %s'" % (salt_minion_ip, salt_minion_file)
    #exec_cmd(chown_cmd)

def main(name, ip, version):
    svn_update = get_svn_list(name, ip, version)
    salt_minion_test(svn_update["salt_minion_ip"])
    (svn_update_A, svn_update_D, svn_update_M) = get_svn_file(svn_update["svn_dir"], svn_update["svn_pre"], svn_update["svn_version"], svn_update["salt_master_dir"])
    svn_update_back = svn_update_D + svn_update_M
    svn_update_server = svn_update_A + svn_update_M
    update_back(svn_update["svn_name"], svn_update["salt_minion_ip"], svn_update["server_dir"], svn_update_back)
    update_server_file(svn_update["salt_minion_ip"], svn_update["server_dir"], svn_update["salt_master_dir"], svn_update_server)

if __name__=="__main__":
    usage = "usage: %prog [options] arg :./update_svn.py -v  -n  -i "
    parser = OptionParser(usage)
    parser.add_option("-v", "--version", dest="version", help="input the version")
    parser.add_option("-n", "--name", dest="name", help="input the svn name")
    parser.add_option("-i", "--ip", dest="ip", help="input the ip address")
    (options, args) = parser.parse_args()
    version = options.version
    name = options.name
    ip = options.ip
    if version is None or name is None or ip is None :
        error_output("you must input all args: ./update_svn -i xx  -n xx -v xx")
    main(name, ip, version)

FLASK主框架如下:

import sqlite3
import commands,os
from flask import Flask, request, session, g, redirect, url_for, \
    abort, render_template, flash
from contextlib import closing
#from flask.ext.bootstrap import Bootstrap
from flask_bootstrap import Bootstrap
from app import app
import subprocess

bootstrap = Bootstrap(app)

@app.route("/update_output")
def import_html():
    return render_template('update_output.html')

@app.route('/update_svn', methods=['GET', 'POST'])
def update_svn():
    svn_name = request.form['svn_name']
    svn_version = request.form['svn_version']
    server_ip = request.form['server_ip']
    os.system("python update_svn.py -v %s -n %s -i %s > update_output.html" % (svn_version, svn_name, server_ip))
    flash('Command is %s %s %s ,please wait....' % (svn_name, svn_version, server_ip))
    return redirect(url_for('main_operation_php'))

@app.route('/')
@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
    if request.form['username'] != app.config['USERNAME']:
        error = 'Invalid password'
    elif request.form['password'] != app.config['PASSWORD']:
        error = 'Invalid password'
    else:
        session['logged_in'] = True
        flash('You were logged in')
        return redirect(url_for('main_operation_php'))
    return render_template('login.html', error=error)

@app.route('/main_operation_php')
def main_operation_php():
    if not session.get('logged_in'):
        abort(401)
    return render_template('main_operation_php.html')

@app.route('/main_operation_java')
def main_operation_java():
    if not session.get('logged_in'):
        abort(401)
    return render_template('main_operation_java.html')

@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    flash('You were logged out')
    return redirect(url_for('login'))

来张丑图(以后完了再上漂亮眯的):

时间: 2024-08-25 13:03:19

一键自动代码发布升级版的相关文章

通过Git WebHooks+脚本实现自动更新发布代码之Shell脚本(二)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1737010   依据前文<通过Git WebHooks+脚本实现自动更新发布代码>的解决方案编写的shell脚本,此脚本专门用于更新补丁文件,例如对项目中的文件实现增(add).删(remove).改(update),并且执行相关的命令,如清除缓存.重启服务等.   此Shell脚本目前设计成在本地执行,目前不适

通过Git WebHooks+脚本实现自动更新发布代码之shell脚本

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1735106 前文讲述了<通过Git WebHooks+脚本实现自动更新发布代码>,里面提供了一种自动更新发布代码的脚本编写思路.本文的脚本与前文中的思路(前文思路的实现请参考<通过Git WebHooks+脚本实现自动更新发布代码之Shell脚本(二)>)不太不同.本脚本以capistrano中的一些

通过Git WebHooks+脚本实现自动更新发布代码

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1734297 需求: 写一个自动化部署脚本,能根据git push动作自动更新发布代码(补丁文件(或更新文件,以下简称补丁)) 解决方案: 通过git webhooks.python脚本.Linux Shell脚本完成,所有动作均自动完成,人工部分仅限于发布补丁文件之前 git webhooks实现触发执行脚本 py

初创公司如何实现 Ansible 多机房自动部署发布

本文讲的是初创公司如何实现 Ansible 多机房自动部署发布, 一.面临的问题 一个完整的程序开发流程少不了部署发布这个环节,而部署发布是一个重复的过程,最基本的操作包含停止系统服务.更新软件包.重启系统服务,复杂的还需要做好监控.灰度发布.回滚等.在只有少量服务器的情况下,大多数运维人员会选择手动更新,减少自动化部署发布的开发成本.而当服务器数量增加,甚至服务器可能存在于跨地域的不同机房情况下,如何减少部署发布的人力和时间成本,实现自动化部署发布和无缝发布,而且在部署发布期间仍然能够正常提供

页面-移动appHTML5一键自动拨号 急急 自动拨号那种

问题描述 移动appHTML5一键自动拨号 急急 自动拨号那种 HTML5页面点击超链接实现自动拨号,求大神帮忙!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 解决方案 <a href=""tel:电话号码"">电话号码</a> 解决方案二: 这个只能跳到拨号界面呀,不能自动拨号呢!!!

Bat自动解压缩发布asp.net程序_实用技巧

1解压缩压缩包 2替换文件 3停止服务 4重建虚拟目录 5重启服务 @echo 1.Zipexe 好压压缩程序集路径 @echo 2.zipFileName 压缩文件的路径 @echo 3.ylxt 解压缩文件的路径 @echo 3.webconstant 发布目录中不会修改的文件.和文件夹,需要和虚拟目录的目录结构保持一致 @echo 4.PubparentFolder 虚拟目录的父目录 @echo 5.PubFolderName 虚拟目录名 set Zipexe="C:\Program Fi

寻找大侠,如果使用后台代码发布网站

问题描述 寻找大侠,如果使用后台代码发布网站 解决方案 解决方案二:你想用代码操作vs么解决方案三:LZ想代码编译代码解决方案四:这个描述,我也是醉了,敢说的详细点吗?按我的理解给你回答一个右键你的项目-生成生成完毕后,再右键-选择发布,然后指定发布类型,我一般用文件系统以文件系统为例,建一个项目名称命名的文件夹,发布到这个文件夹下然后配置iis,指定端口,绑定物理路径,也就是你发布的位置,然后指定默认文档,设置文件夹权限然后就OK了

3步教你一键自动备份mysql数据库的方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 备份mysql一直是很多朋友比较头痛的问题,尤其是按按时间段备份,今天笔者将以图文教程的方法教你每天如何一键备份mysql数据库文件. 1.先是建立批处理文件,将以下代码另存为.bat文件,文件名最好为英文.注意下面的路径,以笔者自己的数据库为例,数据库安装在D盘下mysql\mysql下,备份位置在F:\beifen,后面的代码是日期. @

苹果发布升级版Safari浏览器

苹果当地时间昨天下午发布了升级版Safari浏览器,解决了旧版中一个可能利用图像文件与Mac旧版软件的漏洞.据苹果公司介绍,该漏洞允许恶意人士制作带有嵌入式彩色图像的文件,而后执行任意代码或意外终止应用程序,该问题不影响Mac OS X 10.6系统,并已经在安全更新2009-005中修正,Safari的更新还改进了JavaScript性能,并对历史搜索性能进行了提升,同时第三方插件也带来了稳定改进.