def deploy_files(version='master'): """ Ensure that the directory tree exists and has the requested version of the site. """ require('code_root', 'project_root', 'repo', 'webuser') files.directory(env.project_root, owner=env.webuser, use_sudo=True) files.directory( os.path.join(env.project_root, 'log'), owner=env.webuser, use_sudo=True) if env.environment != "vagrant" and not ffiles.exists(env.code_root): with cd(env.project_root): sudo('git clone {} source'.format(env.repo), user=env.webuser) # Replace remote secrets file only if we are not using Vagrant (because # the secrets file should be automatically synchronized) and the file # does not already exist on the remote server. if env.environment != "vagrant" and not ffiles.exists(env.remote_secrets): files.file( env.remote_secrets, source=os.path.join(env.deploy_dir, 'secrets.py'), use_sudo=True, owner=env.webuser) if env.environment != "vagrant": with cd(env.code_root): # discard any local changes to the repo sudo('git reset --hard', user=env.webuser) sudo('git checkout {}'.format(version), user=env.webuser) sudo('git pull', user=env.webuser)
def install(): packages([ 'build-essential', 'php5', 'php5-mysql', ], update=False) mysql(password="******") apache() stopped('apache2') site_disabled('default') site( 'mylampvm.dev', template_source=full_path + '/templates/apache2/vhost.tpl', port=80, server_name='mylampvm.dev', document_root='/srv', ) template_file(template_source=full_path + '/templates/apache2/envvars.tpl', path='/etc/apache2/envvars', context={ 'apache_run_user': '******', 'apache_run_group': 'vagrant', }, owner='root', group='root', use_sudo=True) directory('/var/lock/apache2', True, 'vagrant', 'vagrant') # site_enabled('mylampvm.dev') restarted('apache2')
def install(): packages([ 'build-essential', 'php5', 'php5-mysql', ], update=False) mysql(password="******") apache() stopped('apache2') site_disabled('default') site( 'mylampvm.dev', template_source=full_path + '/templates/apache2/vhost.tpl', port=80, server_name='mylampvm.dev', document_root='/srv', ) template_file( template_source = full_path + '/templates/apache2/envvars.tpl', path='/etc/apache2/envvars', context = { 'apache_run_user': '******', 'apache_run_group': 'vagrant', }, owner = 'root', group = 'root', use_sudo=True ) directory('/var/lock/apache2', True, 'vagrant', 'vagrant') # site_enabled('mylampvm.dev') restarted('apache2')
def deploy(artifact_name, remote_path): artifact_name = str(artifact_name) remote_path = str(remote_path) print "deploying artifact: {artifact_name} to {remote_path}"\ .format(artifact_name=artifact_name, remote_path=remote_path) dest_dir = remote_path + "/" file_extension = '.tar.gz' bare_artifact_name = artifact_name if artifact_name.endswith(file_extension): bare_artifact_name = artifact_name[:(-1 * len(file_extension))] dest_dir = dest_dir + bare_artifact_name else: dest_dir = dest_dir + artifact_name if bare_artifact_name in ['prev', 'current', 'next']: raise ValueError("sorry, {artifact_name} is not a legal artifact name because it collides " "with a word reserved for symbolic links used by rainbow".format(artifact_name=artifact_name)) # note: the request to create the remote_path should be superfluous since dest_dir contains it directory(path=remote_path, use_sudo=True) directory(path=dest_dir, use_sudo=True, owner=fabric_env.user) put(local_path=artifact_name, remote_path=remote_path, use_sudo=True) with cd(path=remote_path): run("tar -xvf {artifact_name} -C {dest_dir}".format(dest_dir=dest_dir, artifact_name=artifact_name)) run_as_root("ln -nsf {dest_dir} next".format(dest_dir=dest_dir))
def create(venv=None, pyver=None): deb.packages(['libjpeg8', 'libjpeg8-dev', 'libfreetype6', 'libfreetype6-dev', 'zlib1g-dev']) validate = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$" if not env.get("new_user"): if env.no_input_mode: env.new_user = env.new_user_default else: prompt("User: "******"new_user", env.get('new_user_default', ''), validate=validate) if not fabtools.user.exists(env.new_user): prompt("Password for {0}: ".format(env.new_user), "new_passwd", '', validate=validate) env.home_dir = '{0}/{1}'.format(env.home_user, env.new_user) fabtools.user.create(env.new_user, home=env.home_dir, group=env.new_user, create_home=True, system=False, shell='/bin/bash', create_group=True, password=env.new_passwd) if not env.get("project"): if env.no_input_mode: env.project = env.project_default else: prompt("Project name: ", "project", env.get('project_default', '')) if not env.get("repository"): if env.no_input_mode: env.repository = env.repository_default else: prompt("Deploy from: ", "repository", env.get('repository_default', '')) if not env.get("domain"): if env.no_input_mode: abort("Need set env.domain !") else: prompt("Project DNS url: ", "domain", env.get('domain_default', ''), validate=validate) else: if not re.findall(validate, env.domain): abort("Invalid env.domain !") require('repository', 'domain', 'project') if venv is not None: env.venv = venv else: prompt("Virtual ENV: ", "venv", env.get('venv_default', ''), validate=validate) if pyver is not None: env.pyver = pyver else: prompt("Python VERSION: ", "pyver", env.get('pyver_default', ''), validate=validate) env.virt = '{0}/{1}/{2}'.format(env.home_user, env.new_user, env.virt_home) pyver_dir = '{0}{1}/{2}-{3}'.format(env.python_dir, env.pyver, env.new_user, env.venv) files.directory(env.virt, mode='750', owner=env.new_user, group=env.new_user, use_sudo=True) if not is_dir(posixpath.join(env.virt, env.venv)): with prefix('pythonbrew use {0}'.format(env.pyver)): if not is_dir(pyver_dir): sudo('pythonbrew venv create {0}-{1}'.format(env.new_user, env.venv)) sudo('ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so {0}/lib/'.format(pyver_dir)) sudo('ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so {0}/lib/'.format(pyver_dir)) sudo('ln -s /usr/lib/x86_64-linux-gnu/libz.so {0}/lib/'.format(pyver_dir)) sudo("find {2}/venvs/ -type d -iname '{1}-{0}' -print0 | xargs -I{3} -0 chown -R --preserve-root --no-dereference {1}:pythonbrew '{3}'".format(env.venv, env.new_user, '${PYTHONBREW_ROOT}', '{}')) sudo('ln -s {0} {1}/'.format(pyver_dir, env.virt)) sudo('chown -R {0}:{0} {1}'.format(env.new_user, env.virt))
def mount_device(device="/dev/datavg01/datavol01", mountpoint="/data/brick1", fstype="ext4"): directory(mountpoint, use_sudo=True) append("/etc/fstab", "{0} {1} {2} defaults,nosuid,nodev 1 2".format( device, mountpoint, fstype), use_sudo=True) mount(device, mountpoint) sudo("mount")
def deploy_vagrant_files(): """ ensure that the directory tree resembles production The Vagrantfile mounts the current working directory where the source directory will be in production. """ require('project_root', 'webuser') files.directory(env.project_root, owner=env.webuser, use_sudo=True) files.directory(os.path.join(env.project_root, 'log'), owner=env.webuser, use_sudo=True) files.file(os.path.join(env.code_root, 'conf_site/settings/secrets.py'), source=os.path.join(env.deploy_dir, 'secrets.py'), use_sudo=True, owner=env.webuser)
def u(c_param='prod'): if c_param == 'local': with lcd(env.lcwd): if not is_dir('{0}/public/static'.format(env.lcwd)): #files.directory('{0}/public/static'.format(env.lcwd), mode='755') files.directory('public/static'.format(env.lcwd)) for mcom in conf.get('MANAGER_COMMAND_RUN'): virt_comm('python ./manage.py {0}'.format(mcom).replace('/', os.path.sep)) else: with cd(env.root): # if not is_dir('{0}/public/static'.format(env.project_dir_name)): # files.directory('{0}/public/static'.format(env.project_dir_name), use_sudo=True, owner=env.project_user, # group=env.project_group, mode='755') # sudo( # 'chown -R ' + env.project_user + ':' + env.project_group + ' db* log* public/static* public/media*') env.virt = posixpath.join(env.home_dir, env.virt_home, conf[lookup_param]['venv']) with prefix('pythonbrew use {0}'.format(env.pyver)): # django comands with fabtools.python.virtualenv(env.virt): for mcom in conf.get('MANAGER_COMMAND_RUN'): run('python ./manage.py {0}'.format(mcom))
def deploy_files(version='master'): """ ensure that the directory tree exists and has the requested version of the site """ require('code_root', 'project_root', 'repo', 'webuser') if env.environment == "vagrant": deploy_vagrant_files() return files.directory(env.project_root, owner=env.webuser, use_sudo=True) files.directory(os.path.join(env.project_root, 'log'), owner=env.webuser, use_sudo=True) if not ffiles.exists(env.code_root): with cd(env.project_root): sudo('git clone {} source'.format(env.repo), user=env.webuser) files.file(os.path.join(env.code_root, 'conf_site/settings/secrets.py'), source=os.path.join(env.deploy_dir, 'secrets.py'), use_sudo=True, owner=env.webuser) with cd(env.code_root): # discard any local changes to the repo sudo('git reset --hard', user=env.webuser) sudo('git checkout {}'.format(version), user=env.webuser) sudo('git pull', user=env.webuser)
def push(): """ This function for create django site project work flow on remote server. Django site source cloning from remote git repository. NOTE: This function may be used in other fab file. For this need setup global `env` dict. **`env` settings** env.user - deploy user name (use for ssh) env.password - deploy user password (use for ssh) env.hosts - list deploy hosts (use for ssh) env.domain - django site domain (DNS) use for: - nginx settings - uWSGI start user - project dir name env.repository - remote git repository url, use for git clone site source env.no_input_mode - in this variable True use no input deploy mode. If no_input_mode==True using follow strategy: Abort if env.domain (env.repository) value not set or invalid. And using default confirm() value if needed. """ # cwd => ./deploy env.lcwd = os.path.abspath(os.path.dirname(__file__)) require('no_input_mode') #env.no_input_mode = False if env.no_input_mode: def confirm_local(question, default=True): puts(question) puts("Use no_input_mode [default: {0}]".format("Y" if default else "N")) return default confirm = confirm_local else: confirm = confirm_global validate = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$" if not env.get("domain"): if env.no_input_mode: abort("Need set env.domain !") else: prompt("Project DNS url: ", "domain", env.get('domain_default', ''), validate=validate) else: if not re.findall(validate, env.domain): abort("Invalid env.domain !") if not env.get("repository"): if env.no_input_mode: env.repository = env.repository_default else: prompt("Deploy from: ", "repository", env.get('repository_default', '')) require('repository', 'domain') puts("Deploy site: {0} \nFrom: {1}".format(env.domain, env.repository)) DOMAIN_WITHOUT_DOT = env.domain.replace('.', '_') env.project_user = DOMAIN_WITHOUT_DOT env.project_group = DOMAIN_WITHOUT_DOT env.project_dir_name = DOMAIN_WITHOUT_DOT env.root = posixpath.join(PROJECTS_ROOT, env.project_dir_name) env.debug = True deb.packages(['git']) files.directory(PROJECTS_ROOT, use_sudo=True, owner='root', group='root', mode='755') with cd(PROJECTS_ROOT): # pip cache files.directory('.pip.cache', use_sudo=True, owner='deploy', group='deploy', mode='755') pip_cache_dir = posixpath.join(PROJECTS_ROOT, '.pip.cache') # proj dir create if is_dir(env.project_dir_name) and confirm("proj dir exist! abort ?", default=False): return files.directory(env.project_dir_name, use_sudo=True, owner='root', group='root', mode='755') # proj user create if not fabtools.user.exists(env.project_user): fabtools.user.create(env.project_user, home=env.root, group=env.project_group, create_home=False, system=True, shell='/bin/false', create_group=True) # proj infrastructure with cd(env.project_dir_name): # proj source if not is_dir('src') or confirm("proj src exist! [rm all and re clone / git pull]?", default=False): files.directory('src', use_sudo=True, owner='deploy', group='deploy', mode='755') with cd('src'): sudo('rm -Rf .??* *') sudo('git clone {repository:s} .'.format(env), user='******') else: with cd('src'): sudo('git pull', user='******') # proj virtual env if not is_dir('.virtualenvs') or confirm("proj venv dir exist! [rm all and recreate / repeat install]?", default=False): files.directory('.virtualenvs', use_sudo=True, owner='deploy', group='deploy', mode='755') with cd('.virtualenvs'): sudo('rm -Rf .??* *') python.virtualenv('.virtualenvs', use_sudo=True, user='******', clear=True) with fabtools.python.virtualenv('.virtualenvs'): python.install_requirements('src/requirements.txt', use_mirrors=False, use_sudo=True, user='******', download_cache=pip_cache_dir) # ------------------- # # WEB SERVER SETTINGS # # ------------------- # # I`m use nginx <-> uWSGI <-> Django nginx.server() deb.packages(['uwsgi', 'uwsgi-plugin-python']) # proj conf! if not is_dir('conf') or confirm("proj conf dir exist! [backup and update? / skip]", default=False): files.directory('conf', use_sudo=True, owner='root', group='root', mode='755') with cd('conf'): local_conf_templates = os.path.join(os.path.dirname(__file__), 'template', 'conf') uwsgi_conf = os.path.join(local_conf_templates, 'uwsgi.ini') nginx_conf = os.path.join(local_conf_templates, 'nginx.conf') sudo("rm -Rf *.back") sudo("ls -d *{.conf,.ini} | sed 's/.*$/mv -fu \"&\" \"\\0.back\"/' | sh") files.template_file('uwsgi.ini', template_source=uwsgi_conf, context=env, use_sudo=True, owner='root', group='root', mode='644') files.file('reload', use_sudo=True, owner='root', group='root') sudo('ln -sf $(pwd)/uwsgi.ini /etc/uwsgi/apps-enabled/' + env.project_dir_name + '.ini') files.template_file('nginx.conf', template_source=nginx_conf, context=env, use_sudo=True, owner='root', group='root', mode='644') sudo('ln -sf $(pwd)/nginx.conf /etc/nginx/sites-enabled/' + env.project_dir_name) sudo('service nginx restart') sudo('service uwsgi restart')
def deploy(lookup_param='prod', pip='install'): with cd(env.home_dir): files.directory(env.project_root, mode='750') files.directory(env.shared, mode='750') with cd(env.shared): files.directory('.pip.cache', mode='750') files.directory('db', mode='750') files.directory('log', mode='750') files.directory('pids', mode='750') files.directory('system', mode='750') files.directory('media', mode='750') with cd(env.project_root): git.working_copy(env.repository, env.root, branch=env.config['www']['branch']) with cd(env.root): if not exists('db'): run('ln -s {0}/{1} {2}/'.format(env.shared, 'db', env.root)) if not exists('log'): run('ln -s {0}/{1} {2}/'.format(env.shared, 'log', env.root)) if not exists('public/media'): run('ln -s {0}/{1} {2}/public/'.format(env.shared, 'media', env.root)) execute(libs, lookup_param=lookup_param, pip=pip)
def ensure_exists(path, use_sudo=False, owner=None, group=None, mode=None): files.directory(path, use_sudo, owner, group, mode)
def test(): with cd(PROJECTS_ROOT):# with settings(warn_only=True): run("ls -ltX") run('python manage.py syncdb --noinput') if not is_dir('src') or confirm("proj src exist!?", default=True): files.directory('src', mode='755') # # def deploy(): # """ # This function for create django site project work flow on remote server. # Django site source cloning from remote git repository. # NOTE: This function may be used in other fab file. # For this need setup global `env` dict. # **`env` settings** # env.user - deploy user name (use for ssh) # env.password - deploy user password (use for ssh) # env.hosts - list deploy hosts (use for ssh) # env.domain - django site domain (DNS) use for: # - nginx settings # - uWSGI start user # - project dir name # env.repository - remote git repository url, use for git clone site source # env.no_input_mode - in this variable True use no input deploy mode. # If no_input_mode==True using follow strategy: # Abort if env.domain (env.repository) value not set or invalid. # And using default confirm() value if needed. # """ # # cwd => ./deploy # env.lcwd = os.path.abspath(os.path.dirname(__file__)) # require('no_input_mode') # #env.no_input_mode = False # if env.no_input_mode: # def confirm_local(question, default=True): # puts(question) # puts("Use no_input_mode [default: {0}]".format("Y" if default else "N")) # return default # confirm = confirm_local # else: # confirm = confirm_global # validate="^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$" # if not env.get("domain"): # if env.no_input_mode: # abort("Need set env.domain !") # else: # prompt("Project DNS url: ", "domain", env.get('domain_default', ''), validate=validate) # else: # if not re.findall(validate, env.domain): # abort("Invalid env.domain !") # if not env.get("repository"): # if env.no_input_mode: # env.repository = env.repository_default # else: # prompt("Deploy from: ", "repository", env.get('repository_default', '')) # require('repository', 'domain') # puts("Deploy site: {0} \nFrom: {1}".format(env.domain, env.repository)) # DOMAIN_WITHOUT_DOT = env.domain.replace('.', '_') # env.project_user = DOMAIN_WITHOUT_DOT # env.project_group = DOMAIN_WITHOUT_DOT # env.project_dir_name = DOMAIN_WITHOUT_DOT # env.root = posixpath.join(PROJECTS_ROOT, env.project_dir_name) # env.debug = True # deb.packages(['git']) # if not fabtools.user.exists('deploy'): # fabtools.user.create('deploy', home=PROJECTS_ROOT, group='deploy', create_home=False, system=True, # shell='/bin/false', create_group=True) # files.directory(PROJECTS_ROOT, use_sudo=True, owner='root', group='root', mode='755') # with cd(PROJECTS_ROOT): # # pip cache # files.directory('.pip.cache', use_sudo=True, owner='deploy', group='deploy', mode='755') # pip_cache_dir = posixpath.join(PROJECTS_ROOT, '.pip.cache') # # proj dir create # if is_dir(env.project_dir_name) and confirm("proj dir exist! abort ?", default=False): # return # files.directory(env.project_dir_name, use_sudo=True, owner='root', group='root', mode='755') # # proj user create # if not fabtools.user.exists(env.project_user): # fabtools.user.create(env.project_user, home=env.root, group=env.project_group, create_home=False, system=True, shell='/bin/false', create_group=True) # # proj infrastructure # with cd(env.project_dir_name): # # proj source # if not is_dir('src') or confirm("proj src exist! [rm all and re clone / git pull]?", default=False): # files.directory('src', use_sudo=True, owner='deploy', group='deploy', mode='755') # with cd('src'): # sudo('rm -Rf .??* *') # sudo('git clone %(repository)s .' % env, user='******') # else: # with cd('src'): # sudo('git pull', user='******') # # proj virtual env # if not is_dir('venv') or confirm("proj venv dir exist! [rm all and recreate / repeat install]?", default=False): # files.directory('venv', use_sudo=True, owner='deploy', group='deploy', mode='755') # with cd('venv'): # sudo('rm -Rf .??* *') # python.virtualenv('venv', use_sudo=True, user='******', clear=True) # with fabtools.python.virtualenv('venv'): # python.install_requirements('src/requirements.txt', use_mirrors=False, use_sudo=True, user='******', download_cache=pip_cache_dir) # # proj dirs # files.directory('log', use_sudo=True, owner='root', group='root', mode='755') # files.directory('db', use_sudo=True, owner=env.project_user, group=env.project_group, mode='755') # files.directory('media', use_sudo=True, owner=env.project_user, group=env.project_group, mode='755') # files.directory('static', use_sudo=True, owner=env.project_user, group=env.project_group, mode='755') # sudo('chown -R ' + env.project_user + ':' + env.project_group + ' db* static* media*') # # django comands # with fabtools.python.virtualenv('venv'): # sudo('python src/manage.py collectstatic --noinput', user=env.project_user) # sudo('python src/manage.py syncdb --noinput', user=env.project_user) # sudo('python src/manage.py migrate --noinput', user=env.project_user) # #sudo('python src/manage.py loaddata fixtures.json', user=env.project_user) # # ------------------- # # # WEB SERVER SETTINGS # # # ------------------- # # # I`m use nginx <-> uWSGI <-> Django # nginx.server() # deb.packages(['uwsgi', 'uwsgi-plugin-python']) # # proj conf! # if not is_dir('conf') or confirm("proj conf dir exist! [backup and update? / skip]", default=False): # files.directory('conf', use_sudo=True, owner='root', group='root', mode='755') # with cd('conf'): # local_conf_templates = os.path.join(os.path.dirname(__file__), 'template', 'conf') # uwsgi_conf = os.path.join(local_conf_templates, 'uwsgi.ini') # nginx_conf = os.path.join(local_conf_templates, 'nginx.conf') # sudo("rm -Rf *.back") # sudo("ls -d *{.conf,.ini} | sed 's/.*$/mv -fu \"&\" \"\\0.back\"/' | sh") # files.template_file('uwsgi.ini', template_source=uwsgi_conf, context=env, # use_sudo=True, owner='root', group='root', mode='644') # files.file('reload', use_sudo=True, owner='root', group='root') # sudo('ln -sf $(pwd)/uwsgi.ini /etc/uwsgi/apps-enabled/' + env.project_dir_name + '.ini') # files.template_file('nginx.conf', template_source=nginx_conf, context=env, # use_sudo=True, owner='root', group='root', mode='644') # sudo('ln -sf $(pwd)/nginx.conf /etc/nginx/sites-enabled/' + env.project_dir_name) # sudo('service nginx restart') # sudo('service uwsgi restart') # #def is_git(): # # with settings(hide('running', 'warnings', 'stderr', 'stdout'), warn_only=True): # # res = run('git status') # # return res.succeeded # def local_template_render(local_template, dict, local_target): # local_file_template = os.path.join(os.path.dirname(__file__), 'template', local_template) # local_out = os.path.join(env.lcwd, local_target) # with open(local_file_template, 'r') as f: # rendered = f.read().format(**dict) # with open(local_out, 'w') as out: # out.write(rendered) # BITBUCKET_AUTH=(BITBUCKET_USER, BITBUCKET_PASSWORD ) # def init(): # # cwd => ./deploy # env.lcwd = os.path.abspath(os.path.dirname(__file__)) # env.debug = True # prompt("project domain: ", "project", validate="^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$") # puts("create project: {0}".format(env.project)) # with lcd('..'): # local('mkdir ' + env.project) # with lcd(env.project): # local('mkdir db src venv static media') # with lcd('src'): # # copy proj infrastructure # local('cp -r ../../deploy/project/* .'.replace('/', os.path.sep)) # local_template_render('gitignore.txt', env, '.gitignore') # # init git # local('git init') # local('git add *') # local('git commit -am "init"') # # init virtual env # local('virtualenv --clear venv') # local('./venv/Scripts/activate && pip install --download-cache=../deploy/.pip.cache -r ./src/requirements.txt'.replace('/', os.path.sep)) # # init Django # local('./venv/Scripts/activate && python ./src/manage.py syncdb --noinput && python ./src/manage.py migrate --noinput'.replace('/', os.path.sep)) # if BITBUCKET_USER and BITBUCKET_PASSWORD and confirm_global('create private bitbucket repository?'): # env.bit_user=BITBUCKET_USER # env.bit_password=BITBUCKET_PASSWORD # import requests as r # rez = r.post('https://api.bitbucket.org/1.0/repositories/', # data=dict(name=env.project, is_private=True), # auth=BITBUCKET_AUTH, # ) # puts('request status ok: {0}'.format(rez.ok)) # if rez.ok: # with lcd(env.project): # local_template_render('fabfile.txt', env, 'fabs.py') # with lcd('src'): # local('git remote add origin https://{0}:{2}@bitbucket.org/{0}/{1}.git'.format(env.bit_user, env.project, env.bit_password)) # local('git push -u origin --all') # to push changes for the first time # if __name__ == '__main__': # # hack for pycharm run configuration. # import subprocess, sys # subprocess.call(['fab', '-f', __file__] + sys.argv[1:])