欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python fabric编写的本地打包部署工具

程序员文章站 2022-07-12 14:30:26
...

1,打包工具使用maven,打包成的war文件会位于项目的target目录

2,管理工具使用git,每次打包之前必须先检查项目是否处于master分支,用于提醒用户先合并master和拉取最新的master代码

3,可以打包和部署多个项目,使用参数化配置,

deploy_remote.py文件内容:

#!/usr/bin/env python
# encoding:utf-8

from fabric.api import *
import time
import os
import sys

TOMCAT_HOME = "/xxx/xxx/apache-tomcat-x.x.x"

servers = [
	'myserver1',
	'myserver2'
]

env.user= "server_username"

env.password = "server_password"

#部署服务器
def deploy(projectname,projectpath):

	#编译打包项目
	print "开始编译项目",projectname
	compile_project(projectname,projectpath)

	#记录当前是第几个服务器
	count = 0

	#部署各个服务器
	for server in servers:
		#累加次数
		count = count + 1
		#开始部署
		print("正在部署服务器:" +  server + " 项目名:" + projectname)
		with settings(host_string = server):
			deploy_one_server(projectname,projectpath)
			print("部署服务器 "+ server +" 项目" + projectname + " 完成!")
			if len(servers) != count :
				print "休息60秒"
				time.sleep(60)

#编译打包项目
def compile_project(projectname,projectpath):
	with lcd(projectpath):
		#检查分支
		check_branch(projectname)
		#打包
		local("mvn clean && mvn install -Premote -Dmaven.test.skip=true")

#检查项目是否在master分支
def check_branch(projectname):
	#查找master分支
	p = os.popen("git branch | grep -e '\* master'");
	found = False;
	while 1:
		line = p.readline()
		if(line.strip() == "* master") :
			found = True
			break
		if not line :
			break

	#检查是否是master分支
	if found :
		print projectname,"项目当前是master分支,可以打包部署"
	else :
		print "***分支错误***",projectname,"项目当前不是master分支,不可以打包部署"
		sys.exit(0)

#部署一个服务器
def deploy_one_server(projectname,projectpath):
	WAR_DIR = projectpath + "/target/"
	warfilename = projectname + ".war"
	#1,上传文件到tomcat根目录
	print("1,上传文件到tomcat根目录")
	with lcd(WAR_DIR):
		with cd(TOMCAT_HOME):
			put(warfilename,warfilename)
			run("ls")

	#2,关闭服务器
	print "2,关闭服务器"
	close_tomcat()

	#3,删除原有的部署文件
	print "3,删除原有的部署文件"
	with cd(TOMCAT_HOME + "/webapps/"):
		run("rm -rf " + projectname + "/")
		run("mv " + warfilename + " ../" + warfilename + ".backup")

	#4,将已上传的文件放到tomcat项目目录
	print "4,将已上传的文件放到tomcat项目目录"
	with cd(TOMCAT_HOME):
		run("mv " + warfilename + " ./webapps/")

	#5,启动服务器
	print "5,启动服务器"
	run(TOMCAT_HOME +"/bin/startup.sh",pty=False)

#关闭tomcat服务器
def close_tomcat():
	#kill可能会因为没有tomcat线程,导致关闭命令失败,所以需要在产生异常时继续执行
	with settings(
		hide('warnings', 'running', 'stdout', 'stderr'),
		warn_only=True
	):
		run("ps -ef |grep tomcat |grep -v grep   |awk -F \" \" '{print $2}' | xargs kill -9")

 

4,使用shell脚本预判断参数正确性,增加脚本的安全性

脚本内容:

#!/usr/local/bin/bash

PYTHON_SCRIPT_PATH="deploy_remote.py"

if [[ $# < 1 ]]; then
  echo "***缺少参数***第一个参数是需要部署的项目,且只接受一个参数,本脚本只能部署a和b项目,其他项目请检查和调整deploy_remote.py脚本"
  exit 0
fi

if [ "$1" = "a" ]; then
  echo "将要编译部署a项目"
  projectpath="/Users/forest/gitwork/$1"
elif [ "$1" = "b" ]; then
  echo "将要编译部署b项目"
  projectpath="/Users/forest/gitwork/$1"
else
  echo "***参数错误***本脚本只能部署a和b项目,其他项目请检查和调整deploy_remote.py脚本"
  exit 0
fi

echo "5秒钟内可以取消部署......"
sleep 5
fab -f $PYTHON_SCRIPT_PATH deploy:projectname=$1,projectpath=$projectpath

 

调用方式:

./deploy_remote.sh a

 传入参数a,开始打包部署a项目