From fa17d2f1e81e5bd8e01a19b4f0cecd35d1d7a553 Mon Sep 17 00:00:00 2001 From: Karim Hamidou Date: Tue, 28 Feb 2017 11:27:12 -0800 Subject: [PATCH] [deployment] Add a `deploy-it` script for our EB services Summary: This is a simple wrapper around `eb-deploy`. It checks that you're using the `production` branch when deploying to a production service. It also creates a tag whenever you make a new deploy so that we can track them. Test Plan: Tested manually. Reviewers: spang, juan, jerm Reviewed By: jerm Maniphest Tasks: T7870 Differential Revision: https://phab.nylas.com/D4045 --- deploy-it | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100755 deploy-it diff --git a/deploy-it b/deploy-it new file mode 100755 index 000000000..b94d81970 --- /dev/null +++ b/deploy-it @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# deploy-it is the script we use to deploy changes to our N1 backend systems. +# it tags releases automatically and helps prevent obvious mistakes like +# deploying a non-production branch to our prod infra. +import sys +import subprocess + +if len(sys.argv) != 2: + print "deploy-it is the script we use to deploy changes to our N1 backend systems." + print "usage: deploy-it environment" + sys.exit(-1) + +environment = sys.argv[1] +level = 'prod' +if 'staging' in environment: + level = 'staging' +elif 'dev' in environment: + level = 'dev' + +branch = subprocess.check_output('git rev-parse --abbrev-ref HEAD'.split()).strip() + +if level == 'prod' and branch != 'production': + sys.exit("Deploys to production environments must be made from the 'production' " + "branch.") + +if level == 'prod': + print "Fetching latest repo data." + # this can fail for all sorts of reasons; best to just let a human + # deal with any errors + try: + subprocess.check_call(['git', 'pull']) + except: + sys.exit("`git pull` failed — can't proceed.") + +# Tag the deploy so that we know exactly what has been deployed by whom. +short_commit = subprocess.check_output('git rev-parse --short HEAD'.split()).strip() +username = subprocess.check_output(['whoami']).strip() +tag_name = "{}-{}-{}".format(short_commit, environment, username) + +# Check if the tag already exists. +if subprocess.call(['git', 'rev-parse', '-q', '--verify', tag_name]) != 0: + # If not create it. + try: + subprocess.check_call(['git', 'tag', '-a', tag_name, '-m', "'{}'".format(tag_name)]) + subprocess.check_call(['git', 'push', 'origin', tag_name]) + except: + sys.exit("Unable to create and save tag — won't proceed.") + +# Hand things off to `eb deploy`. It will push a tagged release to EB. +try: + subprocess.check_call(['eb', 'deploy', environment]) +except: + sys.exit("eb deploy failed!")