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 set_current(release_name): new_release_path = join(env.releases_path, release_name) return system.symlink(new_release_path, env.current)