From 74fb2e8c47cbcb3fe9dff417b5ce61550588708f Mon Sep 17 00:00:00 2001 From: Jade Lovelace Date: Thu, 13 Jun 2024 14:03:27 -0700 Subject: [PATCH] releng: support multiple systems I guess this is kind of important to being able to "release it". Change-Id: Id6f295d0b4944fa1203783a400a246727dbd94b6 --- releng/cli.py | 10 +++++--- releng/create_release.xsh | 15 ++++------- releng/docker_assemble.py | 8 ------ releng/release-jobs.nix | 54 +++++++++++++++++++++++++++++++-------- 4 files changed, 55 insertions(+), 32 deletions(-) diff --git a/releng/cli.py b/releng/cli.py index 89391e0a7..f78d4b12d 100644 --- a/releng/cli.py +++ b/releng/cli.py @@ -2,16 +2,16 @@ from . import create_release from . import docker from .environment import RelengEnvironment from . import environment -import functools import argparse import sys def do_build(args): if args.target == 'all': - create_release.build_artifacts(no_check_git=args.no_check_git) + create_release.build_artifacts(args.profile, no_check_git=args.no_check_git) elif args.target == 'manual': - eval_result = create_release.eval_jobs() + # n.b. args.profile does nothing here, you will just get the x86_64-linux manual no matter what. + eval_result = create_release.eval_jobs(args.profile) create_release.build_manual(eval_result) else: raise ValueError('invalid target, unreachable') @@ -80,6 +80,10 @@ def main(): build.add_argument('--target', choices=['manual', 'all'], help='Whether to build everything or just the manual') + build.add_argument('--profile', + default='all', + choices=('all', 'x86_64-linux-only'), + help='Which systems to build targets for.') build.set_defaults(cmd=do_build) upload = sps.add_parser( diff --git a/releng/create_release.xsh b/releng/create_release.xsh index b51a3ad23..96b13ae4c 100644 --- a/releng/create_release.xsh +++ b/releng/create_release.xsh @@ -27,9 +27,6 @@ RELENG_MSG = "Release created with releng/create_release.xsh" BUILD_CORES = 16 MAX_JOBS = 2 -# TODO -RELEASE_SYSTEMS = ["x86_64-linux"] - def setup_creds(env: RelengEnvironment): key = keys.get_ephemeral_key(env) @@ -82,11 +79,9 @@ def realise(paths: list[str]): nix-store @(args) @(paths) -def eval_jobs(): - nej_output = $(nix-eval-jobs --workers 4 --gc-roots-dir @(GCROOTS_DIR) --force-recurse --flake '.#release-jobs') - return [x for x in (json.loads(s) for s in nej_output.strip().split('\n')) - if x['system'] in RELEASE_SYSTEMS - ] +def eval_jobs(build_profile): + nej_output = $(nix-eval-jobs --workers 4 --gc-roots-dir @(GCROOTS_DIR) --force-recurse --flake f'.#release-jobs.{build_profile}') + return [json.loads(s) for s in nej_output.strip().split('\n')] def upload_drv_paths_and_outputs(env: RelengEnvironment, paths: list[str]): @@ -295,14 +290,14 @@ def upload_manual(env: RelengEnvironment): aws s3 sync @(MANUAL)/ @(env.docs_bucket)/manual/lix/stable/ -def build_artifacts(no_check_git=False): +def build_artifacts(build_profile, no_check_git=False): rm -rf release/ if not no_check_git: verify_are_on_tag() git_preconditions() print('[+] Evaluating') - eval_result = eval_jobs() + eval_result = eval_jobs(build_profile) drv_paths = [x['drvPath'] for x in eval_result] print('[+] Building') diff --git a/releng/docker_assemble.py b/releng/docker_assemble.py index ef1d8c4e6..a03ec2766 100644 --- a/releng/docker_assemble.py +++ b/releng/docker_assemble.py @@ -100,14 +100,6 @@ class OCIIndex: } -def docker_architecture_from_nix_system(system: str) -> DockerArchitecture: - MAP = { - 'x86_64-linux': 'amd64', - 'aarch64-linux': 'arm64', - } - return MAP[system] # type: ignore - - @dataclasses.dataclass class TaggingOperation: manifest: OCIIndex diff --git a/releng/release-jobs.nix b/releng/release-jobs.nix index 4db0baed3..49508e4ef 100644 --- a/releng/release-jobs.nix +++ b/releng/release-jobs.nix @@ -3,8 +3,27 @@ let inherit (pkgs) lib; lix = hydraJobs.build.x86_64-linux; - systems = [ "x86_64-linux" ]; - dockerSystems = [ "x86_64-linux" ]; + # This is all so clumsy because we can't use arguments to functions in + # flakes, and certainly not with n-e-j. + profiles = { + # Used for testing + x86_64-linux-only = { + systems = [ "x86_64-linux" ]; + dockerSystems = [ "x86_64-linux" ]; + }; + all = { + systems = [ + "x86_64-linux" + "aarch64-linux" + "aarch64-darwin" + "x86_64-darwin" + ]; + dockerSystems = [ + "x86_64-linux" + "aarch64-linux" + ]; + }; + }; doTarball = { @@ -27,7 +46,8 @@ let sha256sum --binary $filename | cut -f1 -d' ' > $out/$basename.sha256 ''; - targets = + targetsFor = + { systems, dockerSystems }: builtins.map (system: { target = hydraJobs.binaryTarball.${system}; targetName = "*.tar.xz"; @@ -44,14 +64,26 @@ let tar -cvzf "$out/lix-${lix.version}-manual.tar.gz" lix-${lix.version}-manual ''; - tarballs = pkgs.runCommand "lix-release-tarballs" { } '' - mkdir -p $out - ${lib.concatMapStringsSep "\n" doTarball targets} - cp ${manualTar}/*.tar.gz $out - cp -r ${lix.doc}/share/doc/nix/manual $out - ''; + tarballsFor = + { systems, dockerSystems }: + pkgs.runCommand "lix-release-tarballs" { } '' + mkdir -p $out + ${lib.concatMapStringsSep "\n" doTarball (targetsFor { + inherit systems dockerSystems; + })} + cp ${manualTar}/*.tar.gz $out + cp -r ${lix.doc}/share/doc/nix/manual $out + ''; in -{ +(builtins.mapAttrs ( + _: + { systems, dockerSystems }: + { + build = lib.filterAttrs (x: _: builtins.elem x systems) hydraJobs.build; + tarballs = tarballsFor { inherit systems dockerSystems; }; + } +) profiles) +// { inherit (hydraJobs) build; - inherit tarballs; + inherit tarballsFor; }