增加按应用选择的本地构建与 fzc 发布入口
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
"""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()
|
||||
Reference in New Issue
Block a user