"""Local-built image release to an existing fzc workload; never provisions infrastructure.""" import argparse import json import shlex import subprocess import urllib.request def run(args, capture=False): return subprocess.run(args, check=True, text=True, capture_output=capture).stdout def main(): parser=argparse.ArgumentParser() parser.add_argument('--host', default='fzc') parser.add_argument('--namespace', required=True) parser.add_argument('--deployment', required=True) parser.add_argument('--container', required=True) parser.add_argument('--image', required=True) parser.add_argument('--cron', action='append', default=[], help='name:container') parser.add_argument('--health') args=parser.parse_args() def kube(*parts, capture=False): return run(['ssh',args.host,shlex.join(['kubectl','-n',args.namespace,*parts])],capture) targets=[('deployment',args.deployment,args.container)]+[('cronjob',*c.split(':')) for c in args.cron] previous=[] for kind,name,container in targets: obj=json.loads(kube('get',kind,name,'-o','json',capture=True)) spec=obj['spec']['template']['spec'] if kind=='deployment' else obj['spec']['jobTemplate']['spec']['template']['spec'] image=next(c['image'] for c in spec['containers'] if c['name']==container) previous.append((kind,name,container,image)) changed=[] try: for kind,name,container,image in previous: changed.append((kind,name,container,image)) kube('set','image',kind+'/'+name,container+'='+args.image) if kind=='deployment': kube('rollout','status',kind+'/'+name,'--timeout=180s') if args.health: with urllib.request.urlopen(args.health,timeout=20) as response: assert response.status == 200 except Exception: for kind,name,container,image in reversed(changed): kube('set','image',kind+'/'+name,container+'='+image) kube('rollout','status','deployment/'+args.deployment,'--timeout=180s') raise print('Released',args.image,'to',args.host,args.namespace, '; previous images:',previous) if __name__ == '__main__': main()