Skip to content

Instantly share code, notes, and snippets.

@angelfan
Created April 24, 2018 02:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save angelfan/69c304218e4f06d17d84370d2640ced0 to your computer and use it in GitHub Desktop.
Save angelfan/69c304218e4f06d17d84370d2640ced0 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
from fabric.api import env, run
env.user = 'root'
env.hosts = ['10.1.69.24', '10.1.51.22']
env.port = '22'
env.git_clone = "git@gitlab.tuhu.cn:gengfan/treasure.git"
env.base_dir = "/root/apps"
env.app_name = "treasure"
env.domain_path = "{base_dir}/{app_name}".format(base_dir=env.base_dir, app_name=env.app_name)
env.current_path = "{domain_path}/current".format(domain_path=env.domain_path)
env.releases_path = "{domain_path}/releases".format(domain_path=env.domain_path)
env.shared_path = "{domain_path}/shared".format(domain_path=env.domain_path)
env.venv_path = "/root/treasure/venv".format(shared_path=env.shared_path)
env.uwsgi_pid = "{shared_path}/uwsgi.pid".format(shared_path=env.shared_path)
env.release_size = 5
def releases():
"""List a releases made"""
env.releases = sorted(run('ls -x %(releases_path)s' % {'releases_path': env.releases_path}).split())
if len(env.releases) >= 1:
env.current_revision = env.releases[-1]
env.current_release = "%(releases_path)s/%(current_revision)s" % {'releases_path': env.releases_path,
'current_revision': env.current_revision}
if len(env.releases) > 1:
env.previous_revision = env.releases[-2]
env.previous_release = "%(releases_path)s/%(previous_revision)s" % {'releases_path': env.releases_path,
'previous_revision': env.previous_revision}
def checkout():
"""Checkout code to the remote servers"""
from time import time
env.current_release = "%(releases_path)s/%(time).0f" % {'releases_path': env.releases_path, 'time': time()}
run("cd %(releases_path)s; git clone -q -o deploy --depth 1 %(git_clone)s %(current_release)s" % {
'releases_path': env.releases_path, 'git_clone': env.git_clone, 'current_release': env.current_release})
def symlink():
"""Updates the symlink to the most recently deployed version"""
if not env.has_key('current_release'):
releases()
run("rm -rf {current_release}/logs".format(current_release=env.current_release))
run("ln -nfs %(shared_path)s/logs %(current_release)s/logs" % {'shared_path': env.shared_path,
'current_release': env.current_release})
run("ln -nfs %(shared_path)s/.env %(current_release)s/.env" % {'shared_path': env.shared_path,
'current_release': env.current_release})
run("ln -nfs %(current_release)s %(current_path)s" % {'current_release': env.current_release,
'current_path': env.current_path})
run("ln -nfs %(current_release)s/static %(shared_path)s/static" % {'shared_path': env.shared_path,
'current_release': env.current_release})
def cleanup():
"""Clean up old releases"""
if not env.has_key('releases'):
releases()
if len(env.releases) > env.release_size:
directories = env.releases
directories.reverse()
del directories[:5]
env.directories = ' '.join(
["%(releases_path)s/%(release)s" % {'releases_path': env.releases_path, 'release': release} for release in
directories])
run("rm -rf %(directories)s" % {'directories': env.directories})
def update_venv():
"""更新包"""
run("""
cd {current_path} &&
source {venv}/bin/activate &&
pip install --index https://pypi.mirrors.ustc.edu.cn/simple/ -r requirements.txt
""".format(current_path=env.current_release, venv=env.venv_path))
def migrate():
"""migrate资料"""
run("""
cd {current_path} &&
source {venv}/bin/activate &&
{venv}/bin/python manage.py migrate
""".format(current_path=env.current_release, venv=env.venv_path))
def restart_django_rq():
"""重启rq"""
run('supervisorctl restart django_rq:')
def restart_app():
"""重启app"""
run("""
cd {current_path} &&
{venv}/bin/uwsgi --reload {uwsgi_pid}
""".format(current_path=env.current_release, venv=env.venv_path, uwsgi_pid=env.uwsgi_pid))
def rollback_code():
releases()
if len(env.releases) >= 2:
previous_revision = env.releases[-2]
env.current_release = "%(releases_path)s/%(current_revision)s" % {'releases_path': env.releases_path,
'current_revision': previous_revision}
def compress():
"""compress static file"""
run("""
cd {current_path} &&
source {venv}/bin/activate &&
{venv}/bin/python manage.py compress
""".format(current_path=env.current_release, venv=env.venv_path))
def deploy():
checkout()
symlink()
update_venv()
compress()
migrate()
restart_app()
restart_django_rq()
cleanup()
def rollback():
rollback_code()
symlink()
update_venv()
compress()
migrate()
restart_app()
restart_django_rq()
def start_current_app():
"""启动app"""
run("""
cd {current_path} &&
{venv}/bin/uwsgi --ini uwsgi.ini
""".format(current_path=env.current_path, venv=env.venv_path))
def restart_current_app():
"""重启app"""
run("""
cd {current_path} &&
{venv}/bin/uwsgi --reload {uwsgi_pid}
""".format(current_path=env.current_path, venv=env.venv_path, uwsgi_pid=env.uwsgi_pid))
@angelfan
Copy link
Author

django deploy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment