公司测试服务更新比较频繁,为了简化过程,实现以下简单的自动部署
部署流程大概如下图
经过多番周折终于在同事的提示下找到了 fabric,但苦于对python不熟,经过一番折腾终于初步实现了以上功能,大概步骤记录如下:
- 安装python,我使用ubuntu环境,此步骤省略,如有需要请自行百度。。。(目前fabric貌似仅支持python2.x)
- 安装fabric
官方指导文档安装方式如下
pip install fabric
但安装过程中可能会出现编译错误的情况,请根据实际情况自行查找原因
我在此过程中遇到以下两个问题
1 python.h缺失,使用 apt-get install python-dev即可解决
2 忘了。。。也是个.h文件缺失,解决方式如上 - 编写代码
# -*- coding: utf-8 -*-
'''
Created on 2017年5月24日
@author: mqy
参数说明:python auto.py 提供5个运行参数
参数 1 #秘钥位置
参数 2 #服务器地址
参数 3 #tomcat 在服务器的路径
参数 4 #项目名称
参数 5 #打包好的项目位置
'''
import datetime
import time
import os
import sys
from fabric.context_managers import cd
from fabric.operations import local, put, sudo
from fabric.state import env
#tomcat 在服务器的路径
default_tomcat_path = '/usr/local/tomcat'
#服务器地址
default_server_host = '127.0.0.1'
#秘钥位置
default_key_path = '~/key.pem'
#项目名称
default_project_name = 'project'
#打包好的项目位置
default_project_path = '~/project.war'
def copy_to_server():
local(
"scp -i {key_path} {product_path} ubuntu@{host}:/tmp/{target_name}".format(
key_path=default_key_path, product_path=default_project_path, host=default_server_host,target_name=default_project_name+".war"))
def kill_service():
set_env(default_server_host)
sudo("kill -9 $(ps -ef|grep -i %s|grep -v 'grep'|awk '{print $2}')" % default_tomcat_path)
def bak_service():
set_env(default_server_host)
with cd("{baseServiceHome}/webapps".format(baseServiceHome=default_tomcat_path)):
sudo('cp ./{baseService} ../bak/{time}.war.bak'.format(baseService=default_project_name, time=time.mktime(datetime.datetime.now().timetuple())))
def remove_old_service():
set_env(default_server_host)
with cd("{baseServiceHome}/webapps".format(baseServiceHome=default_tomcat_path)):
sudo('rm -rf ./{service_name}'.format(service_name=default_project_name))
sudo('rm ./{service_name}'.format(service_name=default_project_name+".war"))
def deploy_new_service():
set_env(default_server_host)
with cd("{base_service_home}/webapps".format(base_service_home=default_tomcat_path)):
sudo("mv /tmp/{service_file} ./".format(service_file=default_project_name+".war"))
def start_service():
set_env(default_server_host)
with cd("{base_service_home}/bin".format(base_service_home=default_tomcat_path)):
sudo("set -m;./startup.sh")
def set_env(host):
env.host_string = host
env.user = "ubuntu"
env.key_filename = default_key_path
env.warn_only = True
def deploy():
copy_to_server()
kill_service()
bak_service()
remove_old_service()
deploy_new_service()
start_service()
if __name__ == '__main__':
for i in range(len(sys.argv)):
if i==0:
pass
if i==1:
default_key_path=sys.argv[1]
if i==2:
default_server_host=sys.argv[2]
if i==3:
default_tomcat_path=sys.argv[3]
if i==4:
default_project_name=sys.argv[4]
if i==5:
default_project_path=sys.argv[5]
print default_key_path+"==="+default_server_host+"===="+default_tomcat_path+"====="+default_project_name+"======"+default_project_path
deploy()
由于本人第一次编写python代码,以上过程还真是有些离奇,但好在功能已经初步实现。也不枉费我折腾一天。