def deploy(branch): """ Deploy the application in a timestamped release folder. $ fab deploy:staging Internally this does the following: * `git pull` if a cached repository already exists * `git clone` if it's the first deploy ever * Checkout the current selected branch * Create a new timestamped release directory * Copy the cached repository to the new release directory * Setup the virtualenv * Install PIP's requirements, downloading new ones if not already cached * Symlink `<branch>/current` to `<branch>/releases/<timestamped release directory>` """ if not git.is_repository(_repo_path(env.github_repo_name)): # repository doesn't exist, do a fresh clone with cd(env.repo_path): git.clone(env.github_repo, env.github_repo_name) with _repo(env.github_repo_name): git.checkout(branch) else: # repository exists with _repo(env.github_repo_name): if not (branch == git.current_branch()): # switch to our branch if not already git.checkout(branch) # pull in the latest code git.pull(branch) # 20100603_125848 new_release_name = datetime.utcnow().strftime(RELEASE_NAME_FORMAT) # /var/praekelt/richmond/staging/releases/20100603_125848 new_release_path = _join(env.releases_path, new_release_name) # /var/praekelt/richmond/staging/releases/20100603_125848/richmond # Django needs the project name as it's parent dir since that is # automagically appended to the loadpath new_release_repo = _join(new_release_path, env.github_repo_name) system.create_dir(new_release_path) system.copy_dirs(_repo_path(env.github_repo_name), new_release_path) # copy_settings_file(branch, release=new_release_name) symlink_shared_dirs = ['logs', 'tmp'] for dirname in symlink_shared_dirs: with cd(new_release_repo): system.remove(dirname, recursive_force=True) system.symlink(_join(env.shared_path, dirname), dirname) # create the virtualenv create_virtualenv(branch) # ensure we're deploying the exact revision as we locally have base.set_current(new_release_name)
def update(branch): """ Pull in the latest code for the latest release. $ fab update:staging Only to be used for small fixed, typos etc.. """ current_release = base.releases(env.releases_path)[-1] with cd(_join(env.current, env.github_repo_name)): git.pull(branch)
def update(branch): """ Pull in the latest code for the latest release. $ fab update:staging Only to be used for small fixed, typos etc.. Runs git stash first to undo fabdir effects """ current_release = base.releases(env.releases_path)[-1] copy_settings_file(branch, release=current_release) with cd(_join(env.current, env.github_repo_name)): run("git stash") git.pull(branch)