Skip to content

Instantly share code, notes, and snippets.

@DeronW
Created June 2, 2013 11:16
Show Gist options
  • Save DeronW/5693337 to your computer and use it in GitHub Desktop.
Save DeronW/5693337 to your computer and use it in GitHub Desktop.
部署脚本 git + ssh + fabric + fexpect
from __future__ import with_statement
from ilogue.fexpect import expect, expecting, run as erun
from fabric.api import settings, local, put, cd, run
import time
import datetime
import random
import logging
GIT_HOST = 'git@localhost'
SERVER_HOST = '127.0.0.1'
SERVER_LVYE = 'user@%s' % SERVER_HOST
SERVER_PORT = '22'
def django_collectstatic(project_name):
prompts = []
prompts += expect("Type 'yes' to continue, or 'no' to cancel: ",'yes')
with settings(host_string=SERVER_LVYE, port=SERVER_PORT):
with expecting(prompts):
erun('source /srv/python27venv/bin/activate;python /srv/projects/%s/manage.py collectstatic' % project_name)
def deploy_development(project):
pass
def deploy_production(project):
if project == 'topic':
return deploy_topic()
if project == 'cms':
return deploy_cms()
if project == 'huodong':
return deploy_huodong()
def rollback(project):
if project == 'topic':
return rollback_topic()
if project == 'cms':
return rollback_cms()
if project == 'huodong':
return rollback_huodong()
def now_string():
return str(int(time.time()))
def random_6():
return int(10 ** 6 * random.random())
def today_string():
return datetime.datetime.today().date().isoformat().replace('-', '')
def git_clone(proj, path=''):
with settings(host_string=GIT_HOST):
run('rm -rf /tmp/{0}.git; git clone --depth 1 /home/git/repositories/{path}{0}.git /tmp/{0}.git'.format(proj, path=path))
exclude_files = ''
for i in ('README', '.git', '.gitignore'):
exclude_files += '--exclude="%s" ' % i
with cd('/tmp'):
run('tar -zcf /tmp/{0}.gz {1} {0}.git'.format(proj, exclude_files))
def restart_apache():
with settings(host_string=SERVER_LVYE, port=SERVER_PORT):
run('/usr/local/apache/bin/apachectl graceful')
return True
def upload_code(proj):
with settings(host_string=SERVER_LVYE, port=SERVER_PORT):
put('/tmp/%s.gz' % proj, '/tmp/')
run('tar zxf /tmp/%s.gz -C /tmp/' % proj)
def clean_up(proj):
with settings(host_string=SERVER_LVYE, port=SERVER_PORT):
run('rm /tmp/{0}.gz; rm -r /tmp/{0}.git'.format(proj))
def supervisor(name, command='restart'):
with settings(host_string='root@%s' % SERVER_HOST, port=SERVER_PORT):
run('source /srv/python27venv/bin/activate; supervisorctl %s %s' % (command, name))
def deploy_topic():
proj = 'lvye_topic'
dirname = 'lvyetopic'
git_clone(proj)
upload_code(proj)
with settings(host_string=SERVER_LVYE, port=SERVER_PORT):
command = [
'rm -rf /srv/projects/lvyetopiccode/{dirname}.pre/*',
'cp -r /srv/projects/{dirname}/* /srv/projects/lvyetopiccode/{dirname}.pre',
'rm -rf {code_path} 2>1 /dev/null',
'mkdir {code_path}',
'cp -r /tmp/{proj}.git/* {code_path}/',
'cp /srv/projects/lvyetopiccode/settings.py {code_path}/lvyetopic/',
'rm -f /srv/projects/lvyetopic',
'ln -sf {code_path} /srv/projects/lvyetopic',
'source /srv/python27venv/bin/activate',
'python /srv/projects/lvyetopic/manage.py migrate',
]
code_path = '/srv/projects/lvyetopiccode/{0}.{1}.{2}'.format(dirname, today_string(), now_string())
run(';'.join(command).format(dirname=dirname, proj=proj, code_path=code_path))
django_collectstatic('lvyetopic')
clean_up(proj)
supervisor('topic')
return True
def rollback_topic():
with settings(host_string=SERVER_LVYE, port=SERVER_PORT):
run('rm -f /srv/projects/lvyetopic')
run('ln -sf /srv/projects/lvyetopiccode/lvyetopic.pre /srv/projects/lvyetopic')
django_collectstatic('lvyetopic')
supervisor('topic')
return True
def deploy_cms():
proj = 'lvye_cms'
dirname = 'lvyecms'
git_clone(proj)
upload_code(proj)
with settings(host_string=SERVER_LVYE, port=SERVER_PORT):
command = [
'rm -rf /srv/projects/lvyecmscode/{dirname}.pre/*',
'cp -r /srv/projects/{dirname}/* /srv/projects/lvyecmscode/{dirname}.pre',
'rm -rf {code_path} 2>1 /dev/null',
'mkdir {code_path}',
'cp -r /tmp/{proj}.git/* {code_path}/',
'cp /srv/projects/lvyecmscode/settings.py {code_path}/lvyecms/',
'rm -f /srv/projects/lvyecms',
'ln -sf {code_path} /srv/projects/lvyecms',
'source /srv/python27venv/bin/activate',
'python /srv/projects/lvyecms/manage.py migrate',
]
code_path = '/srv/projects/lvyecmscode/{0}.{1}.{2}'.format(dirname, today_string(), now_string())
run(';'.join(command).format(dirname=dirname, proj=proj, code_path=code_path))
django_collectstatic('lvyecms')
supervisor('cms')
return True
def rollback_cms():
with settings(host_string=SERVER_LVYE, port=SERVER_PORT):
run('rm -f /srv/projects/lvyecms')
run('ln -sf /srv/projects/lvyecmscode/lvyecms.pre /srv/projects/lvyecms')
django_collectstatic('lvyecms')
supervisor('cms')
return True
def deploy_huodong():
proj = 'library'
dirname = 'library'
git_clone(proj, path='w.del')
upload_code(proj)
with settings(host_string=SERVER_LVYE, port=SERVER_PORT):
command = [
'rm -rf /srv/projects/lvyecmscode/{0}.pre/*', # 2>1 /dev/null',
'cp -r /srv/projects/{0}/* /srv/projects/lvyecmscode/{0}.pre',
'cp -r /tmp/%s.git/* /srv/projects/lvyecmscode/{0}.{today}/',
]
run(';'.join(command).format(dirname, today=today_string()))
clean_up(proj)
supervisor('library')
return True
def rollback_huodong():
with settings(host_string=SERVER_LVYE, port=SERVER_PORT):
run('rm -f /srv/projects/lvyecms')
run('ln -sf /srv/projects/lvyecmscode/lvyecms.pre /srv/projects/lvyecms')
supervisor('library')
return True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment