Cut new release
Python script to check stuff out of git and cut a new release.
#!/usr/bin/env python3
# PRXY=$(grep 'Acquire::http::Proxy' /etc/apt/apt.conf.d/05proxy | cut -d ' ' -f 2 | cut -d ';' -f 1 | cut -d '"' -f 2)
# export http_proxy="${PRXY}"
# export https_proxy="${PRXY}"
import argparse
import fileinput
import json
import os
import shutil
import socket
import subprocess
import sys
import urllib.request
import traceback
import tempfile
class MyAP(argparse.ArgumentParser):
"""
This just makes the parser print out the full help message on error
instead of just telling you what you did wrong.
"""
def error(self, message):
sys.stderr.write('error: %s\n' % message)
self.print_help()
sys.exit(2)
def parse_args():
parser = MyAP(description=
"""
Cuts a new HIP release (includes EPC AKA Cortex AKA Receptor)
""")
parser.add_argument(
'-r',
'--release-name',
required=True,
type=str,
help='The name of the release. For example: rc_1.13')
args = parser.parse_args(sys.argv[1:])
# try:
# socket.inet_aton(args.new_ip)
# except socket.error:
# parser.error('invalid ip address {ip}\n'.format(ip=args.new_ip))
return args
# reads specified json file into dict.
def read_json(file):
return json.load(open(file, 'r'))
def get_package_json(release_name):
pjname = './packages/' + release_name + '.json'
try:
pj = read_json(pjname)
print(json.dumps(pj, indent=3, sort_keys=True))
return pj
except FileNotFoundError as e:
print('package json file not found: ' + pjname)
sys.exit(5)
except:
traceback.print_exc()
sys.exit(5)
def set_git_base_dir():
gitbase = tempfile.gettempdir() + '/cut-release'
print('gitbase: ' + gitbase)
try:
shutil.rmtree(gitbase)
except:
pass
mkdir_p(gitbase)
os.chdir(gitbase)
return gitbase
def mkdir_p(path):
try:
os.makedirs(path)
except OSError as exc: # Python >2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
else: raise
def git(*args):
return subprocess.check_call(['git'] + list(args))
def fix_package_json(app_name, release_name):
if app_name in ['lens','nerve','report_service','pupil','retina']:
print('fixing package.json: ' + app_name)
with fileinput.FileInput('./package.json', inplace=True) as file:
for line in file:
print(line.replace('#develop', '#' + release_name), end='')
# "hip-cortex-api": "git+https://github.mandiant.com/HIP/hip-cortex-api#develop",
# "hip-db": "git+https://github.mandiant.com/HIP/hip-db#develop",
# "hip-kafka-node": "git+https://github.mandiant.com/HIP/hip-kafka-node#develop",
# "hip-utils": "git+https://github.mandiant.com/HIP/hip-utils#develop",
def is_branch_created(git_url, release_name):
try:
out = subprocess.check_output(
['git', 'ls-remote', '--heads', git_url, release_name],
stderr=subprocess.STDOUT).decode('utf-8')
return release_name in out
except:
traceback.print_exc()
sys.exit(5)
def create_or_checkout_branch(git_url, release_name):
if not is_branch_created(git_url, release_name):
print('creating branch: ' + release_name)
git('checkout', '-b', release_name)
else:
git('checkout', release_name)
def commit_and_push(release_name):
try:
git('commit', '-a', '-m', 'cut ' + release_name)
except:
pass
git('push', 'origin', release_name)
def do_git_stuff(app_name, release_name):
print('app_name: ' + app_name)
git_url = 'https://github.mandiant.com/HIP/{app_name}.git'.format(app_name=app_name)
if (app_name == 'epc_server'):
app_name = 'receptor'
git_url = 'https://github.mandiant.com/EndpointConnector/{app_name}.git'.format(app_name=app_name)
print('git_url: ' + git_url)
print('os.getcwd: ' + os.getcwd())
git('clone', git_url)
os.chdir(app_name)
print('os.getcwd: ' + os.getcwd())
create_or_checkout_branch(git_url, release_name)
fix_package_json(app_name, release_name)
commit_and_push(release_name)
os.chdir('..')
if __name__ == "__main__":
args = parse_args()
pkg_json = get_package_json(args.release_name)
set_git_base_dir()
do_git_stuff('hip-cortex-api', args.release_name)
do_git_stuff('hip-kafka-node', args.release_name)
do_git_stuff('hip-utils', args.release_name)
for svc in pkg_json:
do_git_stuff(svc['app_name'], args.release_name)