From c6c4aff8ae5190e4a6681b0999dfbb40fd5488f6 Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Thu, 22 Dec 2016 12:02:54 +0000 Subject: [PATCH] Redeploy script: put each build in a separate directory (#2790) * Redeploy script: put each build in a separate directory Hopefully this will fix the problem whereby we can overwrite the live deployment. --- scripts/redeploy.py | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/scripts/redeploy.py b/scripts/redeploy.py index fddd5da9..36585f53 100755 --- a/scripts/redeploy.py +++ b/scripts/redeploy.py @@ -13,7 +13,7 @@ def download_file(url): local_filename = url.split('/')[-1] r = requests.get(url, stream=True) with open(local_filename, 'wb') as f: - for chunk in r.iter_content(chunk_size=1024): + for chunk in r.iter_content(chunk_size=1024): if chunk: # filter out keep-alive new chunks f.write(chunk) return local_filename @@ -107,21 +107,40 @@ def on_receive_jenkins_poke(): ) print("Retrieving .tar.gz file: %s" % tar_gz_url) + + # we rely on the fact that flask only serves one request at a time to + # ensure that we do not overwrite a tarball from a concurrent request. filename = download_file(tar_gz_url) print("Downloaded file: %s" % filename) + + try: + # we extract into a directory based on the build number. This avoids the + # problem of multiple builds building the same git version and thus having + # the same tarball name. That would lead to two potential problems: + # (a) sometimes jenkins serves corrupted artifacts; we would replace + # a good deploy with a bad one + # (b) we'll be overwriting the live deployment, which means people might + # see half-written files. + build_dir = os.path.join(arg_extract_path, "%s-#%s" % (job_name, build_num)) + if os.path.exists(build_dir): + abort(400, "Not deploying. We have previously deployed this build.") + return + os.mkdir(build_dir) + + untar_to(filename, build_dir) + print("Extracted to: %s" % build_dir) + finally: + if arg_should_clean: + os.remove(filename) + name_str = filename.replace(".tar.gz", "") - untar_to(filename, arg_extract_path) - - extracted_dir = os.path.join(arg_extract_path, name_str) - - if arg_should_clean: - os.remove(filename) - - create_symlink(source=extracted_dir, linkname=arg_symlink) + extracted_dir = os.path.join(build_dir, name_str) if arg_config_location: create_symlink(source=arg_config_location, linkname=os.path.join(extracted_dir, 'config.json')) + create_symlink(source=extracted_dir, linkname=arg_symlink) + return jsonify({}) if __name__ == "__main__":