一键自动代码发布升级版

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-11-05 16:28:21

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

自动化代码发布系统实现

日常运维问题 在我日常运维工作中,代码发布可能是最普遍的一项工作之一,尤其是网页代码的更新,碎片化发布需求非常频繁.在前期开发人员比较少时,还可以由自己来上服务器通过脚本来发布代码.但随着公司项目的增多,更多的开发人员加入到公司,发布代码需求开始增多,这就占用了我大部分时间,经常的被打断其它工作来发布代码,非常地不爽,然后开始想解决方法. 尝试解决问题 当然,发布代码肯定是运维的职责之一了,但频繁的发布导致运维大部分时间浪费在重复的操作上,非常的不值得.基于此,开始限制代码发布频率,要求把不是很

代码发布系统实现

文章目录 [隐藏] 关于项目开源 日常运维问题 尝试解决问题 最终解决方案 开源技术使用 代码发布流程 最后想说的话 关于项目开源 由于挺多同学请求开源此项目,在这里说明一下:其实本人是想开源的,由于是本人写的第一个运维方面的系统,且写这个项目的时间时间紧,只达到了可以使用的程度,完全没有达到开源的要求,希望理解! 日常运维问题 在我日常运维工作中,代码发布可能是最普遍的一项工作之一,尤其是网页代码的更新,碎片化发布需求非常频繁.在前期开发人员比较少时,还可以由自己 来上服务器通过脚本来发布代码

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

需求: 写一个自动化部署脚本,能根据git push动作自动更新发布代码(补丁文件(或更新文件,以下简称补丁)) 解决方案: 通过git webhooks.python脚本.Linux Shell脚本完成,所有动作均自动完成,人工部分仅限于发布补丁文件之前 git webhooks实现触发执行脚本 python脚本用于接收git webhooks的post数据并根据这些数据判断是否执行shell脚本 Linux Shell脚本用于实现部署.备份.回滚等操作 具体步骤(方案实现): 实现原理: 用

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

前文讲述了<通过Git WebHooks+脚本实现自动更新发布代码>,里面提供了一种自动更新发布代码的脚本编写思路.本文的脚本与前文中的思路不太不同.本脚本以capistrano中的一些思想和理念为依据,用简单好理解的shell脚本实现capistrano原本实现的自动化部署部分. 脚本的一些特点和功能: 解决脚本的符号链接问题,准确获取脚本工作目录(从tomcat脚本中学到): 颜色显示,不同级别的信息用不同的颜色显示(共两种方案,前一种从一位不知名的国外工程师处得到,后一种从lnmp1.2

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

依据前文<通过Git WebHooks+脚本实现自动更新发布代码>的解决方案编写的shell脚本,此脚本专门用于更新补丁文件,例如对项目中的文件实现增(add).删(remove).改(update),并且执行相关的命令,如清除缓存.重启服务等. 此Shell脚本目前设计成在本地执行,目前不适合分布式执行的情况.也就是说,此脚本最好与项目在同一个机器上,这个缺陷已经标注在脚本中了,参见脚本中的多个TODO. 脚本完成的工作: 检查配置文件合规性 备份与恢复 增删改文件 执行命令 失败回滚 除上

一键自动格式化你的代码

AStyle简介 AStyle,即Artistic Style,是一个可用于C, C++, C++/CLI, Objective?C, C# 和Java编程语言格式化和美化的工具.我们在使用编辑器的缩进(TAB)功能时,由于不同编辑器的差别,有的插入的是制表符,有的是2个空格,有的是4个空格.这样如果别人用另一个编辑器来阅读程序时,可能会由于缩进的不同,导致阅读效果一团糟.为了解决这个问题,使用C++开发了一个插件,它可以自动重新缩进,并手动指定空格的数量,自动格式化源文件.它是可以通过命令行使

Jenkins自动部署发布Java代码(完整教程)

一.需求 Jenkins大多数情况下都是用来部署Java项目,上一篇博客已经写了自动打包Java项目,但在现实应用中,Jenkins很强大的,可以做到自动打包发布Java项目.这篇文章,将引导大家完成完整的Java项目(自动发布代码功能)! 二.实验环境 三.实验步骤 1.搭建tomcat 服务(在192.168.22.129服务器上) (1)先安装jdk1.8 jdk和tomcat 下载地址: https://pan.baidu.com/s/1URk88Tp2Io0eUEMo1WpoCg 提取

vim ---- 一键自动indent的命令

当用vim拷贝某一段代码到另一个程序的时候,往往indent会有一些问题.. 下面这个强大的命令能够让你一键让代码有很好的格式. gg=G 例子:          vim ---- 一键自动indent的命令,布布扣,bubuko.com

代码发布(jenkins)

代码发布流程: 代码上线: 通过工具进行代码分发,分发方式:push(推).pull(拉) 一般拉得方式比较安全一些. 工具:jenkins 测试:使用wordpress installation: wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key y