From 8482cb30b758c723d50d517252767f82095f82db Mon Sep 17 00:00:00 2001 From: Stephen Lane-Walsh Date: Thu, 9 Jul 2026 22:55:09 -0400 Subject: [PATCH 1/4] Build: Add tests for package installs Add "Test Packages" stage to Jenkinsfile Add a new flag to build.py, --test-package-install, which must be run with/after --package. This will create a stock docker container and attempt to install the packages and then do a small test Add --dockerimage-target to build.py to be used with --test-package-install Add --dockerimage-target to most debian/redhat/windows .opts files Standardize --platform in all updated .opts files Refactor build.py to avoid duplicating the code in do_docker * Add run_docker to handle most docker-related functions * Add get_redhat_package_version/get_exe_version for converting 1.2.3 -> 1.2-3 version formats --- Jenkinsfile | 5 + deploy/build.py | 375 ++++++++++++------ deploy/os/debian-10-amd64.opts | 3 +- deploy/os/debian-11-amd64.opts | 4 +- deploy/os/debian-12-amd64.opts | 4 +- deploy/os/debian-12-arm64.opts | 4 +- ...ian-bookwork.opts => debian-bookworm.opts} | 0 deploy/os/rhel-7-x86_64.opts | 3 +- deploy/os/rhel-8-x86_64.opts | 4 +- deploy/os/rhel-9-x86_64.opts | 4 +- deploy/os/ubuntu-18-amd64.opts | 4 +- deploy/os/ubuntu-20-amd64.opts | 4 +- deploy/os/ubuntu-22-amd64.opts | 4 +- deploy/os/ubuntu-24-amd64.opts | 6 +- deploy/os/ubuntu-24-arm64.opts | 4 +- deploy/os/windows-x64.opts | 1 + deploy/platform/debian/test-install.sh | 16 + deploy/platform/redhat/test-install.sh | 20 + deploy/platform/windows/test-install.sh | 13 + 19 files changed, 336 insertions(+), 142 deletions(-) rename deploy/os/{debian-bookwork.opts => debian-bookworm.opts} (100%) create mode 100755 deploy/platform/debian/test-install.sh create mode 100755 deploy/platform/redhat/test-install.sh create mode 100755 deploy/platform/windows/test-install.sh diff --git a/Jenkinsfile b/Jenkinsfile index 9dfec3ff14..cb812edb97 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -100,6 +100,11 @@ def packageStage(os) { archiveArtifacts artifacts: "packages/*.tgz,packages/*.exe", followSymlinks: false } } + + stage("Test Packages") { + def threads = getNumThreads() + sh "deploy/build.py --os=${os} --test-package-install" + } } } diff --git a/deploy/build.py b/deploy/build.py index 937e569a34..441a42dcb2 100755 --- a/deploy/build.py +++ b/deploy/build.py @@ -204,6 +204,13 @@ help='Run all tests and report the results. Use -j/--parallel to run tests in parallel. Use -R/--test-regex or --rerun-failed to control which tests are run.', ) +parser.add_argument( + '--test-package-install', + action=boolean_action, + default=False, + help='Run a docker image, specified by --dockerimage-target, and test the installation of the generated packages.', +) + parser.add_argument( '--valgrind', nargs='?', @@ -256,6 +263,12 @@ help='Create a docker container with this image, and run the build inside there. Can be combined with -i/--interactive to get a shell inside the docker container.', ) +parser.add_argument( + '--dockerimage-target', + metavar='IMAGE', + help='Specifies the docker image to use for --test-package-install.', +) + parser.add_argument( '--dockernetwork', metavar='NETWORK', @@ -443,6 +456,148 @@ def build_command_line(): return cli_args +def get_redhat_package_version(version): + "Converts from 1.2.3 to 1.2-3" + return '-'.join(version.rsplit('.', maxsplit=1)) +get_exe_version = get_redhat_package_version + +docker = shutil.which('docker') + +def run_docker(image=None, entrypoint='/bin/bash', docker_args=[], network=None, interactive=False): + global args, docker + + if image is None: + return 0 + + if docker is None: + print('Unable to find `docker`') + exit(1) + + if args.dockerpull: + print() + print(f'Pulling docker image {image}') + + result = subprocess.run([ docker, 'pull', image ]) + if result.returncode != 0: + print(f'Failed to pull docker image {image}') + exit(1) + + if network is not None: + print(f'Creating docker network {network}') + result = subprocess.run([ docker, 'network', 'create', network ]) + if result.returncode != 0: + result = subprocess.run([ docker, 'network', 'inspect', network ]) + if result.returncode != 0: + print(f'Failed to create docker network {network}') + exit(1) + print(f'Docker network {network} already exists') + + docker_args.append(f'--network={network}') + + docker_args.append(image) + + print() + print('Docker arguments:') + for arg in docker_args: + print(f" {arg}") + + if type(entrypoint) is str: + entrypoint = [entrypoint] + + print('Docker entrypoint:') + print(f" {' '.join(entrypoint)}") + + docker_args.extend(entrypoint) + + if interactive: + + subprocess.run( + [ + docker, 'run', + '--interactive', + '--tty', + '--rm', + *docker_args + ] + ) + + if network is not None: + subprocess.run([ docker, 'network', 'rm', network ]) + + return 0 + + else: + + result = subprocess.run( + [ + docker, 'run', + '--detach', + *docker_args, + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + + if result.returncode != 0: + print(f'Failed to run docker container: {result.stderr.decode()}') + exit(1) + + container_id = result.stdout.decode().strip() + + docker_logs = subprocess.Popen( + [ + docker, 'logs', + '--follow', + '--timestamps', + container_id + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + + def kill_docker(signum, frame): + print() + print(f'Killing docker container {container_id}') + + subprocess.run([ docker, 'kill', container_id ]) + subprocess.run([ docker, 'rm', container_id ]) + + if network is not None: + subprocess.run([ 'docker', 'network', 'rm', network ]) + + exit(0) + + signal.signal(signal.SIGINT, kill_docker) + + while True: + line = docker_logs.stdout.readline() + if not line: + break + + print(line.decode().rstrip()) + + signal.signal(signal.SIGINT, signal.SIG_DFL) + + # Perform an autopsy + result = subprocess.run( + [ + docker, 'inspect', + container_id, + '--format="{{.State.ExitCode}}"' + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + + exit_code = int(result.stdout.decode().strip().strip('"')) + + subprocess.run([ docker, 'rm', container_id ]) + + if network is not None: + subprocess.run([ docker, 'network', 'rm', network ]) + + return exit_code + # CMake Configuration cmake_cache_filename = os.path.join(build_dir, 'CMakeCache.txt') @@ -551,21 +706,12 @@ def check_add_cmake_arg(arg): # Stages def do_docker(): + global docker - docker = shutil.which('docker') if docker is None: print('Unable to find `docker`') exit(1) - if args.dockerpull: - print() - print(f'Pulling docker image {args.dockerimage}') - - result = subprocess.run([ docker, 'pull', args.dockerimage ]) - if result.returncode != 0: - print(f'Failed to pull docker image {args.dockerimage}') - exit(1) - os.makedirs(args.workspace, exist_ok=True) docker_args = [ @@ -578,39 +724,15 @@ def do_docker(): f'--env=HOME={args.workspace}', # HACK: To allow publish.py to know what docker image to run for publishing packages - f'--env=DOCKERIMAGE={args.dockerimage}' - ] - - # # Enable colors - # if sys.stdout.isatty(): - # docker_args.append('--tty') - - # TODO: Investigate - # Without this, we lose track of the processes - docker_args.append('--tty') - - if args.dockernetwork is not None: - print(f'Creating docker network {args.dockernetwork}') - result = subprocess.run([ docker, 'network', 'create', args.dockernetwork ]) - if result.returncode != 0: - result = subprocess.run([ docker, 'network', 'inspect', args.dockernetwork ]) - if result.returncode != 0: - print(f'Failed to create docker network {args.dockernetwork}') - exit(1) - print(f'Docker network {args.dockernetwork} already exists') + f'--env=DOCKERIMAGE={args.dockerimage}', - docker_args.append(f'--network={args.dockernetwork}') + # HACK: Without this, we lose track of the processes + '--tty', + ] if platform.system() != 'Windows': docker_args.append(f'--user={os.getuid()}:{os.getgid()}') - docker_args.append(args.dockerimage) - - print() - print('Docker arguments:') - for arg in docker_args: - print(f" {arg}") - passthrough_args = [] for arg in build_command_line(): @@ -621,6 +743,10 @@ def do_docker(): # We don't want docker to run recursively if arg.startswith('--docker'): continue + + # This runs its own container, and cannot be run from within docker + if arg.startswith('--test-package-install'): + continue passthrough_args.append(arg) @@ -635,93 +761,16 @@ def do_docker(): exit(1) docker_python3 = result.stdout.decode().strip() - docker_entrypoint = [ docker_python3, os.path.abspath(__file__) ] + passthrough_args - - print('Docker entrypoint:') - print(f" {' '.join(docker_entrypoint)}") - - if args.interactive: - - subprocess.run( - [ - docker, 'run', - '--interactive', - '--rm', - ] + docker_args + docker_entrypoint, - ) - - if args.dockernetwork is not None: - subprocess.run([ docker, 'network', 'rm', args.dockernetwork ]) - - else: - - result = subprocess.run( - [ - docker, 'run', - '--detach', - ] + docker_args + docker_entrypoint, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - - if result.returncode != 0: - print(f'Failed to run docker container: {result.stderr.decode()}') - exit(1) - - container_id = result.stdout.decode().strip() - - docker_logs = subprocess.Popen( - [ - docker, 'logs', - '--follow', - '--timestamps', - container_id - ], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - - def kill_docker(signum, frame): - print() - print(f'Killing docker container {container_id}') - - subprocess.run([ docker, 'kill', container_id ]) - subprocess.run([ docker, 'rm', container_id ]) - - if args.dockernetwork is not None: - subprocess.run([ 'docker', 'network', 'rm', args.dockernetwork ]) - - exit(0) - - signal.signal(signal.SIGINT, kill_docker) - - while True: - line = docker_logs.stdout.readline() - if not line: - break - - print(line.decode().rstrip()) - - signal.signal(signal.SIGINT, signal.SIG_DFL) - - # Perform an autopsy - result = subprocess.run( - [ - docker, 'inspect', - container_id, - '--format="{{.State.ExitCode}}"' - ], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - - exit_code = int(result.stdout.decode().strip().strip('"')) - - subprocess.run([ docker, 'rm', container_id ]) - - if args.dockernetwork is not None: - subprocess.run([ docker, 'network', 'rm', args.dockernetwork ]) - + entrypoint = [ docker_python3, os.path.abspath(__file__) ] + passthrough_args + + exit_code = run_docker( + image=args.dockerimage, + entrypoint=entrypoint, + docker_args=docker_args, + network=args.dockerimage, + interactive=args.interactive + ) + if exit_code != 0: exit(exit_code) def do_interactive(): @@ -975,10 +1024,6 @@ def do_package(): if args.version is None: args.version = cmake_cache.get('RELEASE_VERSION', '0.0.0') - # HACK: Remove after merging cmake branch - if args.flavor == 'cmake': - args.flavor = 'alpha' - bname = '' if args.flavor != 'stable': bname = f'-{args.flavor}' @@ -1467,6 +1512,75 @@ def stop_testing(signum, frame): if failed_test_count > 0: exit(1) +def do_test_package_install(): + global docker + + if args.dockerimage_target is None: + print('Unable to test the packages for this platform') + exit(0) + + print(f'Testing package install') + + if docker is None: + print('Unable to find `docker`') + exit(1) + + publish_info_filename = f'{args.workspace}/mdsplus-publish.json' + if not os.path.exists(publish_info_filename): + print('Unable to test the packages without having built them first, please run with --package') + exit(1) + + with open(publish_info_filename, 'rt') as file: + publish_info = json.load(file) + + target_platform = publish_info['platform'] + target_packages = publish_info['packages'] + + entrypoint = ['/entrypoint.sh'] + docker_args = [] + + if target_platform == 'debian': + entrypoint_filename = f'{source_dir}/deploy/platform/debian/test-install.sh' + docker_args.append(f'--volume={entrypoint_filename}:/entrypoint.sh:ro') + + packages_dir = os.path.dirname(target_packages[0]) + docker_args.append(f'--volume={os.path.join(dist_dir, packages_dir)}:/packages') + + for deb in target_packages: + entrypoint.append(os.path.relpath(deb, packages_dir)) + + elif target_platform == 'redhat': + entrypoint_filename = f'{source_dir}/deploy/platform/redhat/test-install.sh' + docker_args.append(f'--volume={entrypoint_filename}:/entrypoint.sh:ro') + + packages_dir = os.path.dirname(target_packages[0]) + packages_dir = os.path.dirname(packages_dir) # have to skip architecture folder + docker_args.append(f'--volume={os.path.join(dist_dir, packages_dir)}:/packages') + + for rpm in target_packages: + entrypoint.append(os.path.relpath(rpm, packages_dir)) + + elif target_platform == 'windows': + entrypoint_filename = f'{source_dir}/deploy/platform/windows/test-install.sh' + docker_args.append(f'--volume={entrypoint_filename}:/entrypoint.sh:ro') + + packages_dir = os.path.dirname(target_packages[0]) + docker_args.append(f'--volume={os.path.join(dist_dir, packages_dir)}:/packages') + + entrypoint.append(os.path.relpath(target_packages[0], packages_dir)) + else: + print('Unable to test the packages for this platform') + exit(0) + + exit_code = run_docker( + image=args.dockerimage_target, + entrypoint=entrypoint, + docker_args=docker_args, + interactive=False, + ) + + if exit_code != 0: + exit(exit_code) # main if args.dockerimage is not None: @@ -1505,3 +1619,6 @@ def stop_testing(signum, frame): if args.test: do_test() + +if args.test_package_install: + do_test_package_install() diff --git a/deploy/os/debian-10-amd64.opts b/deploy/os/debian-10-amd64.opts index 098af5dfb8..77ddd198b6 100644 --- a/deploy/os/debian-10-amd64.opts +++ b/deploy/os/debian-10-amd64.opts @@ -1,2 +1,3 @@ ---dockerimage=mdsplus/builder:debian-10-amd64 --distname=DebianBuster +--dockerimage=mdsplus/builder:debian-10-amd64 +--distname=DebianBuster --platform=debian -DGSI=gcc64 diff --git a/deploy/os/debian-11-amd64.opts b/deploy/os/debian-11-amd64.opts index 8f799412d7..af87d6a515 100644 --- a/deploy/os/debian-11-amd64.opts +++ b/deploy/os/debian-11-amd64.opts @@ -1,2 +1,4 @@ ---dockerimage=mdsplus/builder:debian-11-amd64 --distname=DebianBullseye +--dockerimage=mdsplus/builder:debian-11-amd64 +--dockerimage-target=debian:bullseye +--distname=DebianBullseye --platform=debian -DGSI=gcc64 -DENABLE_HDF5=ON diff --git a/deploy/os/debian-12-amd64.opts b/deploy/os/debian-12-amd64.opts index 9b552fc9f5..0467acc47c 100644 --- a/deploy/os/debian-12-amd64.opts +++ b/deploy/os/debian-12-amd64.opts @@ -1,2 +1,4 @@ ---dockerimage=mdsplus/builder:debian-12-amd64 --distname=DebianBookworm +--dockerimage=mdsplus/builder:debian-12-amd64 +--dockerimage-target=debian:bookworm +--distname=DebianBookworm --platform=debian -DGSI=gcc64 -DENABLE_HDF5=ON diff --git a/deploy/os/debian-12-arm64.opts b/deploy/os/debian-12-arm64.opts index 2579733f23..8dd2cb6621 100644 --- a/deploy/os/debian-12-arm64.opts +++ b/deploy/os/debian-12-arm64.opts @@ -1,2 +1,4 @@ ---dockerimage=mdsplus/builder:debian-12-arm64 --distname=DebianBookworm --platform=debian +--dockerimage=mdsplus/builder:debian-12-arm64 +--dockerimage-target=arm64v8/debian:bookworm +--distname=DebianBookworm --platform=debian -DENABLE_LABVIEW=OFF -DENABLE_HDF5=ON diff --git a/deploy/os/debian-bookwork.opts b/deploy/os/debian-bookworm.opts similarity index 100% rename from deploy/os/debian-bookwork.opts rename to deploy/os/debian-bookworm.opts diff --git a/deploy/os/rhel-7-x86_64.opts b/deploy/os/rhel-7-x86_64.opts index 8d1cdaf7fb..0dda25b1fb 100644 --- a/deploy/os/rhel-7-x86_64.opts +++ b/deploy/os/rhel-7-x86_64.opts @@ -1,2 +1,3 @@ ---dockerimage=mdsplus/builder:centos-7-x86_64 --distname=el7 +--dockerimage=mdsplus/builder:centos-7-x86_64 +--distname=el7 --platform=redhat -DGSI=gcc64 -DENABLE_HDF5=ON -DENABLE_SYBASE=ON \ No newline at end of file diff --git a/deploy/os/rhel-8-x86_64.opts b/deploy/os/rhel-8-x86_64.opts index 64a0e28ec9..04b5d8336a 100644 --- a/deploy/os/rhel-8-x86_64.opts +++ b/deploy/os/rhel-8-x86_64.opts @@ -1,2 +1,4 @@ ---dockerimage=mdsplus/builder:rocky-8-x86_64 --distname=el8 +--dockerimage=mdsplus/builder:rocky-8-x86_64 +--dockerimage-target=rockylinux:8 +--distname=el8 --platform=redhat -DGSI=gcc64 -DENABLE_HDF5=ON -DENABLE_SYBASE=ON \ No newline at end of file diff --git a/deploy/os/rhel-9-x86_64.opts b/deploy/os/rhel-9-x86_64.opts index 46849e3a4c..658c066ce5 100644 --- a/deploy/os/rhel-9-x86_64.opts +++ b/deploy/os/rhel-9-x86_64.opts @@ -1,2 +1,4 @@ ---dockerimage=mdsplus/builder:rocky-9-x86_64 --distname=el9 +--dockerimage=mdsplus/builder:rocky-9-x86_64 +--dockerimage-target=rockylinux:9 +--distname=el9 --platform=redhat -DGSI=gcc64 -DENABLE_HDF5=ON -DENABLE_SYBASE=ON \ No newline at end of file diff --git a/deploy/os/ubuntu-18-amd64.opts b/deploy/os/ubuntu-18-amd64.opts index 15a8376a92..1a051d6018 100644 --- a/deploy/os/ubuntu-18-amd64.opts +++ b/deploy/os/ubuntu-18-amd64.opts @@ -1,2 +1,4 @@ ---dockerimage=mdsplus/builder:ubuntu-18.04-amd64 --distname=Ubuntu18 --platform=debian +--dockerimage=mdsplus/builder:ubuntu-18.04-amd64 +--dockerimage-target=ubuntu:bionic +--distname=Ubuntu18 --platform=debian -DGSI=gcc64 -DENABLE_HDF5=ON diff --git a/deploy/os/ubuntu-20-amd64.opts b/deploy/os/ubuntu-20-amd64.opts index dce7979909..018fbfadd8 100644 --- a/deploy/os/ubuntu-20-amd64.opts +++ b/deploy/os/ubuntu-20-amd64.opts @@ -1,2 +1,4 @@ ---dockerimage=mdsplus/builder:ubuntu-20.04-amd64 --distname=Ubuntu20 --platform=debian +--dockerimage=mdsplus/builder:ubuntu-20.04-amd64 +--dockerimage-target=ubuntu:focal +--distname=Ubuntu20 --platform=debian -DGSI=gcc64 -DENABLE_HDF5=ON diff --git a/deploy/os/ubuntu-22-amd64.opts b/deploy/os/ubuntu-22-amd64.opts index 778dbbd650..503ee9da65 100644 --- a/deploy/os/ubuntu-22-amd64.opts +++ b/deploy/os/ubuntu-22-amd64.opts @@ -1,2 +1,4 @@ ---dockerimage=mdsplus/builder:ubuntu-22.04-amd64 --distname=Ubuntu22 --platform=debian +--dockerimage=mdsplus/builder:ubuntu-22.04-amd64 +--dockerimage-target=ubuntu:jammy +--distname=Ubuntu22 --platform=debian -DGSI=gcc64 -DENABLE_HDF5=ON diff --git a/deploy/os/ubuntu-24-amd64.opts b/deploy/os/ubuntu-24-amd64.opts index a80d327ba3..dff1771852 100644 --- a/deploy/os/ubuntu-24-amd64.opts +++ b/deploy/os/ubuntu-24-amd64.opts @@ -1,2 +1,4 @@ ---dockerimage=mdsplus/builder:ubuntu-24.04-amd64 --distname=Ubuntu24 --platform=debian --DGSI=gcc64 -DENABLE_HDF5=ON +--dockerimage=mdsplus/builder:ubuntu-24.04-amd64 +--dockerimage-target=ubuntu:noble +--distname=Ubuntu24 --platform=debian +-DGSI=gcc64 -DENABLE_HDF5=ON \ No newline at end of file diff --git a/deploy/os/ubuntu-24-arm64.opts b/deploy/os/ubuntu-24-arm64.opts index 247a4ed883..2de2c3aadd 100644 --- a/deploy/os/ubuntu-24-arm64.opts +++ b/deploy/os/ubuntu-24-arm64.opts @@ -1,2 +1,4 @@ ---dockerimage=mdsplus/builder:ubuntu-24.04-arm64 --distname=Ubuntu24 --platform=debian +--dockerimage=mdsplus/builder:ubuntu-24.04-arm64 +--dockerimage-target=arm64v8/ubuntu:noble +--distname=Ubuntu24 --platform=debian -DENABLE_LABVIEW=OFF diff --git a/deploy/os/windows-x64.opts b/deploy/os/windows-x64.opts index f1ba5a50d8..59afc68965 100644 --- a/deploy/os/windows-x64.opts +++ b/deploy/os/windows-x64.opts @@ -1,4 +1,5 @@ --dockerimage=mdsplus/builder:windows-x86-x64 +--dockerimage-target=ubuntu:resolute --platform=windows --arch=x64 --distname=Windows --toolchain=/usr/share/mingw/toolchain-mingw64.cmake -DTEST_WITH_WINE=ON -DWINE_PYTHON=/python27/python.exe diff --git a/deploy/platform/debian/test-install.sh b/deploy/platform/debian/test-install.sh new file mode 100755 index 0000000000..09d194baed --- /dev/null +++ b/deploy/platform/debian/test-install.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +apt update +apt upgrade -y + +cd /packages + +echo "=== Installing all MDSplus packages ===" +apt -f install -y "${@/#/./}" # all files must be relative paths + +echo "=== Testing ===" +. /usr/local/mdsplus/setup.sh +mdstcl show version + +# MDSplus uses weird return codes +[ $? -eq 1 ] || exit 42 diff --git a/deploy/platform/redhat/test-install.sh b/deploy/platform/redhat/test-install.sh new file mode 100755 index 0000000000..b0e11eba5c --- /dev/null +++ b/deploy/platform/redhat/test-install.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +dnf check-update +dnf update -y +dnf install -y epel-release + +# For RHEL 8 +dnf install -y dnf-plugins-core && dnf -y config-manager --set-enabled powertools + +cd /packages + +echo "=== Installing all MDSplus packages ===" +dnf install -y "$@" || exit 1 + +echo "=== Testing ===" +. /usr/local/mdsplus/setup.sh +mdstcl show version + +# MDSplus uses weird return codes +[ $? -eq 1 ] || exit 42 diff --git a/deploy/platform/windows/test-install.sh b/deploy/platform/windows/test-install.sh new file mode 100755 index 0000000000..35a7120453 --- /dev/null +++ b/deploy/platform/windows/test-install.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +apt update +apt upgrade -y +apt install -y wine + +cd /packages + +wine "$1" /S /AllUsers +wine mdstcl.bat show version + +# MDSplus uses weird return codes +[ $? -eq 1 ] || exit 42 From 535839cdbfe330e83c9dfcb74b209ec3fc7466dc Mon Sep 17 00:00:00 2001 From: Stephen Lane-Walsh Date: Fri, 10 Jul 2026 12:25:13 -0400 Subject: [PATCH 2/4] Lowercase bname to hopefully fix PR package tests --- deploy/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/build.py b/deploy/build.py index 441a42dcb2..5eaacee77f 100755 --- a/deploy/build.py +++ b/deploy/build.py @@ -1026,7 +1026,7 @@ def do_package(): bname = '' if args.flavor != 'stable': - bname = f'-{args.flavor}' + bname = f'-{args.flavor}'.lower() if args.arch is None: if args.platform == 'debian': From 55c67ca8a7d9051f229626785d0aadd5388c74be Mon Sep 17 00:00:00 2001 From: Stephen Lane-Walsh Date: Mon, 13 Jul 2026 13:22:40 -0400 Subject: [PATCH 3/4] Add arguments for testing installs --- deploy/os/ubuntu-26-amd64.opts | 4 +++- deploy/os/ubuntu-26-arm64.opts | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/deploy/os/ubuntu-26-amd64.opts b/deploy/os/ubuntu-26-amd64.opts index 701e28b7ea..185e488c78 100644 --- a/deploy/os/ubuntu-26-amd64.opts +++ b/deploy/os/ubuntu-26-amd64.opts @@ -1,2 +1,4 @@ ---dockerimage=mdsplus/builder:ubuntu-26.04-amd64 --distname=Ubuntu26 --platform=debian +--dockerimage=mdsplus/builder:ubuntu-26.04-amd64 +--dockerimage-target=ubuntu:resolute +--distname=Ubuntu26 --platform=debian -DGSI=gcc64 -DENABLE_HDF5=ON diff --git a/deploy/os/ubuntu-26-arm64.opts b/deploy/os/ubuntu-26-arm64.opts index 673fa5d720..030b0225ed 100644 --- a/deploy/os/ubuntu-26-arm64.opts +++ b/deploy/os/ubuntu-26-arm64.opts @@ -1,2 +1,4 @@ ---dockerimage=mdsplus/builder:ubuntu-26.04-arm64 --distname=Ubuntu26 --platform=debian +--dockerimage=mdsplus/builder:ubuntu-26.04-arm64 +--dockerimage-target=arm64v8/ubuntu:resolute +--distname=Ubuntu26 --platform=debian -DENABLE_LABVIEW=OFF From 2bbe25b77408e6f7634fa7b4b7263cf9885bcba8 Mon Sep 17 00:00:00 2001 From: Stephen Lane-Walsh Date: Thu, 16 Jul 2026 13:30:07 -0400 Subject: [PATCH 4/4] Fix issues with `netbase` package requiring input during install --- deploy/platform/debian/test-install.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/deploy/platform/debian/test-install.sh b/deploy/platform/debian/test-install.sh index 09d194baed..01f5c844e8 100755 --- a/deploy/platform/debian/test-install.sh +++ b/deploy/platform/debian/test-install.sh @@ -6,7 +6,10 @@ apt upgrade -y cd /packages echo "=== Installing all MDSplus packages ===" -apt -f install -y "${@/#/./}" # all files must be relative paths +# all files must be relative paths +DEBIAN_FRONTEND=noninteractive \ + apt -f install -yf "${@/#/./}" \ + --option=Dpkg::Options::=--force-confdef echo "=== Testing ===" . /usr/local/mdsplus/setup.sh