alpine-zdt-images/scripts/gen-release-readme.py.in
Jake Buchholz 0f1cc5c4b2 Latest AMIs per Version in releases/README.md
Only keep the latest AMIs per version in releases/README.md instead of per release.
2019-07-14 09:07:01 -07:00

120 lines
3.3 KiB
Python

@PYTHON@
# vim: ts=4 et:
from datetime import datetime
from distutils.version import StrictVersion
import functools
import os
import re
import sys
import yaml
if len(sys.argv) != 2:
sys.exit("Usage: " + os.path.basename(__file__) + "<profile>")
PROFILE = sys.argv[1]
RELEASE_DIR = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
'..', 'releases'
)
README_MD = os.path.join( RELEASE_DIR, 'README.md')
RELEASE_YAML = os.path.join( RELEASE_DIR, PROFILE + '.yaml')
# read in releases/<profile>.yaml
with open(RELEASE_YAML, 'r') as data:
RELEASES = yaml.safe_load(data)
sections = {}
for build, releases in RELEASES.items():
for release, amis in releases.items():
for name, info in amis.items():
version = info['version']
arch = info['arch']
built = info['build_time']
if version in sections:
ver = sections[version]
else:
ver = {
'release': '',
'built': {},
'name': {},
'ami': {}
}
if (arch not in ver['built'] or
ver['built'][arch] < built):
ver['release'] = release
ver['name'][arch] = name
ver['built'][arch] = built
for region, ami in info['artifacts'].items():
if region not in ver['ami']:
ver['ami'][region] = {}
ver['ami'][region][arch] = ami
sections[version] = ver
SECTION = """
### Alpine Linux {release} ({date})
<details><summary><i>click to show/hide</i></summary><p>
{rows}
</p></details>
"""
AMI = " [{id}](https://{r}.console.aws.amazon.com/ec2/home#Images:visibility=public-images;imageId={id}) " + \
"([launch](https://{r}.console.aws.amazon.com/ec2/home#launchAmi={id})) |"
ARCHS = ['x86_64', 'aarch64']
# most -> least recent version, edge at end
def ver_cmp(a, b):
try:
if StrictVersion(a) < StrictVersion(b):
return 1
if StrictVersion(a) > StrictVersion(b):
return -1
return 0
except ValueError:
# "edge" doesn't work with StrictVersion
if a == 'edge':
return 1
if b == 'edge':
return -1
return 0
ami_list = "## AMIs\n"
for version in sorted(list(sections.keys()), key=functools.cmp_to_key(ver_cmp)):
info = sections[version]
release = info['release']
rows = []
rows.append('| Region |')
rows.append('| ------ |')
for arch in ARCHS:
if arch in info['name']:
rows[0] += ' {n} |'.format(n=info['name'][arch])
rows[1] += ' --- |'
for region, amis in info['ami'].items():
row = '| {r} |'.format(r=region)
for arch in ARCHS:
if arch in amis:
row += AMI.format(r=region, id=amis[arch])
rows.append(row)
ami_list += SECTION.format(
release=release.capitalize(),
date=datetime.utcfromtimestamp(max(info['built'].values())).date(),
rows="\n".join(rows)
)
with open(README_MD, 'r') as file:
readme = file.read()
readme_re = re.compile('## AMIs.*\Z', re.S)
with open(README_MD, 'w') as file:
file.write(readme_re.sub(ami_list, readme))