releng: add prod environment, ready for release

I am *reasonably* confident that this releng infrastructure can actually
build a Lix 2.90 and release it successfully. Let's make it possible to
do, and add some cute colours to the confirmation message.

Change-Id: I85e498b6fb49ffc5e75c0a72c5e45fb1f69030d3
This commit is contained in:
jade 2024-06-09 01:26:21 -07:00
parent ce71d0e9ab
commit 82dc712d93
3 changed files with 55 additions and 4 deletions

View file

@ -240,9 +240,10 @@ def upload_artifacts(env: RelengEnvironment, noconfirm=False, no_check_git=False
tree @(ARTIFACTS) tree @(ARTIFACTS)
env_part = f'environment {env.name}'
not noconfirm and confirm( not noconfirm and confirm(
f'Would you like to release {ARTIFACTS} as {VERSION}? Type "I want to release this" to confirm\n', f'Would you like to release {ARTIFACTS} as {VERSION} in {env.colour(env_part)}? Type "I want to release this to {env.name}" to confirm\n',
'I want to release this' f'I want to release this to {env.name}'
) )
docker_images = list((ARTIFACTS / f'lix/lix-{VERSION}').glob(f'lix-{VERSION}-docker-image-*.tar.gz')) docker_images = list((ARTIFACTS / f'lix/lix-{VERSION}').glob(f'lix-{VERSION}-docker-image-*.tar.gz'))

View file

@ -49,7 +49,7 @@ def upload_docker_images(target: DockerTarget, paths: list[Path]):
docker_os = inspection['Os'] docker_os = inspection['Os']
meta = inspection['Labels'] meta = inspection['Labels']
log.info('Pushing image %s for %s', path, docker_arch) log.info('Pushing image %s for %s to %s', path, docker_arch, target.registry_path)
# insecure-policy: we don't have any signature policy, we are just uploading an image # insecure-policy: we don't have any signature policy, we are just uploading an image
# We upload to a junk tag, because otherwise it will upload to `latest`, which is undesirable # We upload to a junk tag, because otherwise it will upload to `latest`, which is undesirable
@ -67,7 +67,7 @@ def upload_docker_images(target: DockerTarget, paths: list[Path]):
# FIXME: this is not possible because GitHub only has a proprietary API for it. amazing. 11/10. # FIXME: this is not possible because GitHub only has a proprietary API for it. amazing. 11/10.
# reg.delete_tag(target.registry_path, 'temp') # reg.delete_tag(target.registry_path, 'temp')
log.info('Pushed images, building a bigger and more menacing manifest from %r with metadata %r', manifests, meta) log.info('Pushed images to %r, building a bigger and more menacing manifest from %r with metadata %r', target, manifests, meta)
# send the multiarch manifest to each tag # send the multiarch manifest to each tag
index = OCIIndex(manifests=manifests, annotations=meta) index = OCIIndex(manifests=manifests, annotations=meta)
for tag in tag_names: for tag in tag_names:

View file

@ -1,4 +1,8 @@
from typing import Callable
import urllib.parse import urllib.parse
import re
import functools
import subprocess
import dataclasses import dataclasses
S3_HOST = 's3.lix.systems' S3_HOST = 's3.lix.systems'
@ -41,6 +45,7 @@ class DockerTarget:
@dataclasses.dataclass @dataclasses.dataclass
class RelengEnvironment: class RelengEnvironment:
name: str name: str
colour: Callable[[str], str]
cache_store_overlay: dict[str, str] cache_store_overlay: dict[str, str]
cache_bucket: str cache_bucket: str
@ -56,8 +61,19 @@ class RelengEnvironment:
return self.cache_bucket + "?" + urllib.parse.urlencode(qs) return self.cache_bucket + "?" + urllib.parse.urlencode(qs)
SGR = '\x1b['
RED = '31;1m'
GREEN = '32;1m'
RESET = '0m'
def sgr(colour: str, text: str) -> str:
return f'{SGR}{colour}{text}{SGR}{RESET}'
STAGING = RelengEnvironment( STAGING = RelengEnvironment(
name='staging', name='staging',
colour=functools.partial(sgr, GREEN),
docs_bucket='s3://staging-docs', docs_bucket='s3://staging-docs',
cache_bucket='s3://staging-cache', cache_bucket='s3://staging-cache',
cache_store_overlay={'secret-key': 'staging.key'}, cache_store_overlay={'secret-key': 'staging.key'},
@ -72,8 +88,42 @@ STAGING = RelengEnvironment(
], ],
) )
GERRIT_REMOTE_RE = re.compile(r'^ssh://(\w+@)?gerrit.lix.systems:2022/lix$')
def guess_gerrit_remote():
"""
Deals with people having unknown gerrit username.
"""
out = [
x.split()[1] for x in subprocess.check_output(
['git', 'remote', '-v']).decode().splitlines()
]
return next(x for x in out if GERRIT_REMOTE_RE.match(x))
PROD = RelengEnvironment(
name='production',
colour=functools.partial(sgr, RED),
docs_bucket='s3://docs',
cache_bucket='s3://cache',
# FIXME: we should decrypt this with age into a tempdir in the future, but
# the issue is how to deal with the recipients file. For now, we should
# just delete it after doing a release.
cache_store_overlay={'secret-key': 'prod.key'},
releases_bucket='s3://releases',
git_repo=guess_gerrit_remote(),
docker_targets=[
# latest will be auto tagged if appropriate
DockerTarget('git.lix.systems/lix-project/lix',
tags=['{version}', '{major}']),
DockerTarget('ghcr.io/lix-project/lix', tags=['{version}', '{major}']),
],
)
ENVIRONMENTS = { ENVIRONMENTS = {
'staging': STAGING, 'staging': STAGING,
'production': PROD,
} }