Created
April 24, 2018 02:54
-
-
Save angelfan/69c304218e4f06d17d84370d2640ced0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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 = "[email protected]: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)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
django deploy