From patchwork Sat Jun 6 02:51:15 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 89425 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5D9E6CD8C88 for ; Sat, 6 Jun 2026 02:51:48 +0000 (UTC) Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.9455.1780714299601827075 for ; Fri, 05 Jun 2026 19:51:39 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@konsulko.com header.s=google header.b=dBdPftae; spf=pass (domain: konsulko.com, ip: 209.85.214.171, mailfrom: tim.orling@konsulko.com) Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2bf2e8ccca1so19131625ad.0 for ; Fri, 05 Jun 2026 19:51:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=konsulko.com; s=google; t=1780714299; x=1781319099; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=0Gz6PtQ7RBykcVKfuiCd5YiRZxhzZeHKwdIeWfTBGp0=; b=dBdPftaeSPyNH8c027jsP+JuHZmFckBZIAjqnuVBGmsIPBBvBf7tnpWKMhvMmUaXSe UQDR/OBrV0JYyXCErbhXeG/Sd9m9bn6IJP6eRvyaBCLTmxI5bknQ3WBno9bR1bck/Mn7 4k44TQ6d7cpV5vcZa/k6XfvlGrvTau+XZHfkg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780714299; x=1781319099; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=0Gz6PtQ7RBykcVKfuiCd5YiRZxhzZeHKwdIeWfTBGp0=; b=NMDAlAu9lkmOGvR2NDEs2GTebabTd42XsoplD46VLlFM/9eIYmqOOFVX9ilTPWrS// uuqgwOdph/2RL+Si2WTczJv5paIOTjR41RrQ9/Vw0Hoa/C1pysUz6L2sHmlMzNWmATb/ X+uTEJdzis33varM4zMjP8rIx3CPFzEDh2pxwdeNwArv4QWC6PqxbZDY0ok4be/EDFHu KevnmEcwkDuDyjWw+xkXeKp8O69sA2CJJpvMjmdgW8BjamkPRsj6YFk0M5DvlyUVQQjo gIYN4EJR/E764qfuGxaaKvD477juLaeRdGTH8OHQUSEQQXjiA3XVFEmyeci3647AvyWn 8Jyw== X-Gm-Message-State: AOJu0YxcYt0OZBuo/rtjJ4fxv2RJY6KpP05kmvCAU99JRUVC44JLsahS 6IUwfKptYlabVWFOgZ/FsPVEn3ZP4SZKTzF7tWMM//CA3bvEB7ekhDQZy8lv7/0OZBVQiLkD1Le n08fd X-Gm-Gg: Acq92OH3Aag6fqp/f8VT1ZhRxIoL9IaN/CxObTGZq9vPbSid3ATUqDpTRN7E726yard hNeh6qqtBbIyFU7zD/EYGpCK/NiZBA7ujMrrT2XimYDC9jD6XKYzjuy9BXHtq4GYj+66xned+5K uBaPag3FP178xSydEDohfnYDV6TC5hXvGj9t4CqFrzclppPwmVJGYYay8kwLzbIK9skOLd5TG2U ERg2xAms3PyK4V+G2Tr4J8lwEQNeOQv3kVoJqRDYjKtn9x3xpjhOjCrCFqoWkYMft/9Or1X/JD2 JmQhCVkgz0rsEdFoIluaci2xTuGUnrjiZg/ZRzOsHSMM1sXzk0mlOvr9IJ3eN3Q13B8ujvBt94N sLnyVNZsoHNyi4EDxUKLtCluOqVeZCeMAzvzHr8T+btJptqbdyYlRGZBP/N8BK4eM3D4VXBJfnu V6luREmm/TphaD0FKNtrT61C149+cyIatQwFILkdkzKcbolq0izXOkgqjMmBAIiGxqp2sZIK8z0 g== X-Received: by 2002:a17:903:a03:b0:2bf:2b84:c207 with SMTP id d9443c01a7336-2c1e8331ff9mr41437145ad.35.1780714298874; Fri, 05 Jun 2026 19:51:38 -0700 (PDT) Received: from localhost (c-98-232-159-17.hsd1.or.comcast.net. [98.232.159.17]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2c16649d2dfsm106113825ad.75.2026.06.05.19.51.38 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jun 2026 19:51:38 -0700 (PDT) From: tim.orling@konsulko.com To: yocto-patches@lists.yoctoproject.org Subject: [yocto-autobuilder2][PATCH v3 1/6] scripts: add vcontainer-tarball setup, integration, and publishing Date: Fri, 5 Jun 2026 19:51:15 -0700 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sat, 06 Jun 2026 02:51:48 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/4156 From: Tim Orling Introduce the vcontainer-tarball SDK plumbing used by container build jobs. The vcontainer-tarball is a meta-virtualization-derived SDK (modelled after buildtools-tarball) that ships the container build toolchain so worker jobs do not need to rebuild it for every step. * scripts/utils.py: add setup_vcontainer_tarball(), and add an env_glob keyword argument to setup_tools_tarball() and enable_tools_tarball() so the vcontainer-tarball can source its specific environment-setup-ci file rather than the universal glob. * scripts/run-config: source the vcontainer-tarball environment for build-targets when "vcontainer" parameter is passed in, similar to "extratools" behavior. * scripts/publish-artefacts: publish the vcontainer-tarball artefact so downstream test jobs can fetch a stable SDK. AI-Generated: Claude Cowork Opus 4.8 Signed-off-by: Tim Orling --- scripts/publish-artefacts | 5 +++++ scripts/run-config | 11 +++++++++++ scripts/utils.py | 20 ++++++++++++++++---- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/scripts/publish-artefacts b/scripts/publish-artefacts index e56e131..0e820e9 100755 --- a/scripts/publish-artefacts +++ b/scripts/publish-artefacts @@ -146,5 +146,10 @@ case "$target" in sha256sums $TMPDIR/deploy/images/qemux86-64 cp -R --no-dereference --preserve=links $TMPDIR/deploy/images/qemux86-64/*qemux86* $DEST/patchtest ;; + "vcontainer-tarball") + mkdir -p $DEST/vcontainer-tarball + sha256sums $TMPDIR/deploy/sdk + cp -R --no-dereference --preserve=links $TMPDIR/deploy/sdk/*vcontainer* $DEST/vcontainer-tarball + ;; esac diff --git a/scripts/run-config b/scripts/run-config index e896234..90a5996 100755 --- a/scripts/run-config +++ b/scripts/run-config @@ -153,6 +153,17 @@ else: if args.phase == "init" and args.stepname == "buildtools": sys.exit(0) +vcontainer = utils.getconfigvar("vcontainer", ourconfig, args.target) +if jcfg: + if vcontainer: + addentry("vcontainer", "Setup vcontainer tarball", "init") +elif vcontainer: + # vcontainer is opt-in per target via the "vcontainer" config variable, + # so this is a no-op for targets which don't set it + utils.setup_vcontainer_tarball(ourconfig, args.target, args.builddir + "/../vcontainer-tarball") + if args.phase == "init" and args.stepname == "vcontainer": + sys.exit(0) + extratools = utils.getconfigvar("extratools", ourconfig, args.target) if jcfg: if extratools: diff --git a/scripts/utils.py b/scripts/utils.py index a4dd12e..bddc715 100644 --- a/scripts/utils.py +++ b/scripts/utils.py @@ -456,8 +456,8 @@ def sha256_file(filename): pass return method.hexdigest() -def enable_tools_tarball(btdir, name): - btenv = glob.glob(btdir + "/environment-setup*") +def enable_tools_tarball(btdir, name, env_glob="/environment-setup*"): + btenv = glob.glob(btdir + env_glob) print("Using %s %s" % (name, btenv)) # We either parse or wrap all our execution calls, rock and a hard place :( with open(btenv[0], "r") as f: @@ -474,6 +474,18 @@ def enable_tools_tarball(btdir, name): if line in os.environ: del os.environ[line] +# Unlike buildtools (a host/worker property, keyed by worker name globs), +# the vcontainer-tarball is only needed by specific jobs (e.g. +# containers-library), so it is keyed off the target/builder via a +# per-target "vcontainer" config variable, following the extratools pattern. +def setup_vcontainer_tarball(ourconfig, target, vcdir, checkonly=False): + vctarball = getconfigvar("vcontainer", ourconfig, target) or None + + if checkonly: + return vctarball + + setup_tools_tarball(ourconfig, vcdir, vctarball, name="vcontainer-tarball", env_glob="/environment-setup-ci") + def setup_buildtools_tarball(ourconfig, workername, btdir, checkonly=False): bttarball = None if "buildtools" in ourconfig and workername: @@ -488,7 +500,7 @@ def setup_buildtools_tarball(ourconfig, workername, btdir, checkonly=False): setup_tools_tarball(ourconfig, btdir, bttarball) -def setup_tools_tarball(ourconfig, btdir, bttarball, name="buildtools"): +def setup_tools_tarball(ourconfig, btdir, bttarball, name="buildtools", env_glob="/environment-setup*"): btenv = None if bttarball: @@ -557,7 +569,7 @@ def setup_tools_tarball(ourconfig, btdir, bttarball, name="buildtools"): if not os.path.exists(btdir): print("Extracting %s %s" % (name, bttarball)) subprocess.check_call(["bash", btdlpath, "-d", btdir, "-y"]) - enable_tools_tarball(btdir, name) + enable_tools_tarball(btdir, name, env_glob) def get_string_from_version(version, milestone=None, rc=None): """ Point releases finishing by 0 (e.g 4.0.0, 4.1.0) do no exists, From patchwork Sat Jun 6 02:51:16 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 89427 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 91685CD8C8E for ; Sat, 6 Jun 2026 02:51:48 +0000 (UTC) Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.9456.1780714301691120959 for ; Fri, 05 Jun 2026 19:51:41 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@konsulko.com header.s=google header.b=qwO4tXnO; spf=pass (domain: konsulko.com, ip: 209.85.214.179, mailfrom: tim.orling@konsulko.com) Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2c0c2a68d01so18060315ad.1 for ; Fri, 05 Jun 2026 19:51:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=konsulko.com; s=google; t=1780714301; x=1781319101; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=He9gZJRQPmPuaoZ3sbniehphQp6s5kpR6HtWcinvqFk=; b=qwO4tXnOMpMEwp6SF9Os46DvvPcnqGF66FrMFBCkFVQqadA0FHdXZALEzqYZzTthdO 81RxM5RAoXdVAQXSJDM+IffarXAcOiYUk8izBi5HrGW/1apEcmH/+n26KYlStG09SjH8 zMoRuqvef/bDra2AGdju+SBOJhJQF/E673Veo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780714301; x=1781319101; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=He9gZJRQPmPuaoZ3sbniehphQp6s5kpR6HtWcinvqFk=; b=muwwlTjh5B2K1bxxxwZjr0IWlbyxZPImbVbnuy0+SvjYPkL8fuPee4bCCshblrPuNv HTXhPiegrhkUL/7ZC49W7K1smF8QRYHTHGIQnuH8Vs0Om2Fr4RVPk0JFZ5Ku3vRvPYCI qL5s1h3UXBKQ7YTyhcEkO+wFXfrFGvZphECzSpFcA0qwMCeyDi8S/T9B9ZfwW56QksVP ojN+wJFSrsiQLmcNCXB0vBnhYDaRYpll7BiAyyAcXmuIQyzcuav/6eKj49A5r24Gg87W l7/yPMZUnURJSLPlgtSEfoLX6/7AgUswy2aKV7EZfszuIUTWV6E39Z8ft2FKwtMcr/oJ L0Fw== X-Gm-Message-State: AOJu0YyDgh5vXoslIHjSIvc/t+yp4QXa6PNIfnW7pC+XiaYKaoLcbwYy 0LhxS7n6BhlKu1XMkJHHUMAmVWn4RXIeO96unaYyBir+Tnx1NqZTA0laut/LkQ5+XSYnjc0CQyV 9lwcv X-Gm-Gg: Acq92OEkUt9E+ZiZUoSfmHSx8Gf5ojQDQ2HOVokYMB9NVpkLxQhQYoyxLqydN7ssLS6 FiQ6qRjvaBoW8ihkdT8cn+Q7i7RgwJW6kHrnm3TdC+zg+NblED2fM/ZwAUDzm5tGBIsOWQOiiIl zujkbzgmQrK1Krc+NEl4sx6B05M2/4A1zEFy2iiyff00QuqeQ7S5CPpqhx1Gj6+QLQQGmscI0UK vTIZxw10kSXIT2x7cgz+rYm5+owI02Ov82HXP5R3eDnpWzfNI877P/i2cPgpKP80HMQp+CXrkQ0 cSnCeANU5tx2cFi/QLHNg1pHeQrjt2yEYajIsOXTp9BjT+KvNUgkWC1QAnyxxOPk9IoCcXZYISh 0bXFIVDOz+OgfGMANLcnmq5NNnGido6TDU/XBIcLY+2eQ4upet3RceauwTi0SvoAdarmSF2jnuo puXS4YlkM+MC+yooCzVsNjboC7nz7CFzJjrdtvboOThyVk0Yahvun7j0VBXnVdocFBL/FtVq09Q g== X-Received: by 2002:a17:902:da86:b0:2c0:ab82:6b99 with SMTP id d9443c01a7336-2c1e822587dmr65253745ad.33.1780714301014; Fri, 05 Jun 2026 19:51:41 -0700 (PDT) Received: from localhost (c-98-232-159-17.hsd1.or.comcast.net. [98.232.159.17]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2c164f6e86dsm108116535ad.8.2026.06.05.19.51.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jun 2026 19:51:40 -0700 (PDT) From: tim.orling@konsulko.com To: yocto-patches@lists.yoctoproject.org Subject: [yocto-autobuilder2][PATCH v3 2/6] config.json: add vcontainer-tarball build target Date: Fri, 5 Jun 2026 19:51:16 -0700 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sat, 06 Jun 2026 02:51:48 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/4157 From: Tim Orling Add the vcontainer-tarball build target which produces the meta-virtualization SDK used by downstream container build jobs. Modelled after the buildtools-tarball target. The target uses EXTRACMDS to reset BBMULTICONFIG for the worker shell, places the extravars in the per-step config, and includes a publish-artefacts step so the resulting SDK tarball is staged for reuse by container-tests and other consumers. Since meta-virtualization is the first layer removed by 'remove-layers', our BBMULTICONFIGs become invalid immediately after layer removal and throw an error. In scripts/run-config, EXTRACMDS runs after BBTARGETS, but before 'remove-layers'. Use 'sed' to reset BBMULTICONFIG to ''. The error in the 'remove-layers' step can be summarized as: bb.parse.ParseError: ParseError at /home/pokybuild/yocto-worker/vcontainer-tarball/build/layers/openembedded-core/meta/conf/bitbake.conf:824: Could not include required file conf/multiconfig/vruntime-aarch64.conf Signed-off-by: Tim Orling --- config.json | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/config.json b/config.json index 4904439..2971fe9 100644 --- a/config.json +++ b/config.json @@ -1827,6 +1827,32 @@ }, "toaster" : { "EXTRACMDS" : ["${SCRIPTSDIR}/run-toaster-tests ${HELPERBUILDDIR} ${HELPERBUILDDIR}/../layers/bitbake"] + }, + "vcontainer-tarball": { + "NEEDREPOS" : ["bitbake", "meta-openembedded", "meta-virtualization"], + "ADDLAYER" : [ + "${BUILDDIR}/../meta-openembedded/meta-oe", + "${BUILDDIR}/../meta-openembedded/meta-python", + "${BUILDDIR}/../meta-openembedded/meta-networking", + "${BUILDDIR}/../meta-openembedded/meta-filesystems", + "${BUILDDIR}/../meta-virtualization" + ], + "step1" : { + "shortname" : "Build vcontainer-tarballs", + "BBTARGETS" : "vcontainer-tarball", + "extravars" : [ + "DISTRO_FEATURES:append = ' virtualization vcontainer'", + "BBMULTICONFIG = 'vruntime-aarch64 vruntime-x86-64'", + "INIT_MANAGER = 'systemd'" + ], + "EXTRACMDS" : ["sed -i '/vruntime-aarch64 vruntime-x86-64/d' ${HELPERBUILDDIR}/conf/auto.conf"] + }, + "step2" : { + "shortname" : "Publish vcontainer SDK for test reuse", + "EXTRACMDS" : [ + "install -d ${BASE_SHAREDDIR}/pub/vcontainer-tarball-latest && install -m 0755 ${BUILDDIR}/tmp/deploy/sdk/vcontainer-standalone.sh ${BASE_SHAREDDIR}/pub/vcontainer-tarball-latest/vcontainer-standalone.sh.new && mv -f ${BASE_SHAREDDIR}/pub/vcontainer-tarball-latest/vcontainer-standalone.sh.new ${BASE_SHAREDDIR}/pub/vcontainer-tarball-latest/vcontainer-standalone.sh" + ] + } } }, "repo-defaults" : { From patchwork Sat Jun 6 02:51:17 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 89428 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 790CCCD8C8F for ; Sat, 6 Jun 2026 02:51:48 +0000 (UTC) Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.9586.1780714303852122268 for ; Fri, 05 Jun 2026 19:51:43 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@konsulko.com header.s=google header.b=CFdfdjQi; spf=pass (domain: konsulko.com, ip: 209.85.216.49, mailfrom: tim.orling@konsulko.com) Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-36d5fd50d20so1619838a91.1 for ; Fri, 05 Jun 2026 19:51:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=konsulko.com; s=google; t=1780714303; x=1781319103; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=/bPHjOxfbjQ9W+jvWNQXK1aXWSvTMAKTkFiF4LvOATo=; b=CFdfdjQim6oNKT02GZfBWTy20eihIEr7oR3tw7OeqHo9BtvXX0kyqsfu9HKkiuii7N Ofy9j5OBEHFc7H16CHsx5mS5vOOo//+YndV1G9QpbY2DPeGkumyI+IxdMS2bFNSUt8sR toVGQ9ZMjonqlRxwLyHmDlHRM4F5itRy+5bfk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780714303; x=1781319103; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=/bPHjOxfbjQ9W+jvWNQXK1aXWSvTMAKTkFiF4LvOATo=; b=DWAlrF4WLmtdcWXXwH1bGaJHyURxWA3x+akV2dK0NxUiVCfuipLUkKV7JRi1gqZeFX 91QWMmTeFQFoTR9AJnH9k11H6XyiIM1FgrC9GWEdcey9gT3RUOwInn6mSLVDsPKDvja0 Y5jOLQs0Pz7DzWB/PBq6u7PvgFYoR7ygoM0b8SOd1bEbSjxOjSzWa/AYDN7e8FF2NM8J jaMLa5QKbtgnNoWb1P33SmPFkWV7xAy5ZzwvvILRbPNKJo5QId5Pg/7jCga13yrlm3pu OyWbdNlhNPYPeitlCQ8cIRLnrwCrlkLJanwrGsVpjnpOYH82ihm4S0axVpCx4+qXoLoK 6tNw== X-Gm-Message-State: AOJu0YwYtTLoi/hFakb8ipD4R84ett8Y2BavIe1mL6VqF/1DDwwIeGw6 icBJZ+OvSVmv1Gb7GgkRX6amYbNKpqfWlxQhn4JohN/DF51EGjCzDF8W75LjouQHKthyQg17LoF +5vtr X-Gm-Gg: Acq92OFVCKGkkl0FvDNDIkuntSb7Y/PaoEx/hdJf1eP6Lh+tPAxoFNRVqgVSX6oWQ0t rb9aZXknpfj8NnrnqPiAKD9TzxIchTCHP5QO95qnH9myGGWtVo0G0n19Pa3t1OvaXGayxcNh4sA zeTtoggqQCe8DbnGiPUvk4vMXdOi4LuTfUMuzxeGM2NKmNugr6XAkX46jhtiKO/WYzQy//x0uyz Xsa3W/8h78YbYHJbvz8y7wZFq8Cqli4GDToTb931C0+CHwzx9S7uKvgB19m9dZC0xJJwWAo3gjK XFaNzcqcqesXqWLmxLiFsO0oPlrGI6xjIRU1zIqsfU5gS/fG0RiUMoG9SzNgmE8JXDkXXqaG4SC CRGCC94yCLe1BW5clqMzEM1fIBY3z+KiVlgor/MtD69Qm3Tjq9ib0vbYSfNxIi528oTrwmFug4a SqKHbLTVr90DacJMWfUcrxe4gFmrGS3DnPIlJjPrqKfPkVC5fqhxZE7aotZ/9cluEned9aZVkfF qiJPDKXw7va X-Received: by 2002:a17:90b:3b49:b0:36d:6315:1de4 with SMTP id 98e67ed59e1d1-370f096ab48mr6648455a91.17.1780714303105; Fri, 05 Jun 2026 19:51:43 -0700 (PDT) Received: from localhost (c-98-232-159-17.hsd1.or.comcast.net. [98.232.159.17]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-36f711e52b0sm8275396a91.15.2026.06.05.19.51.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jun 2026 19:51:42 -0700 (PDT) From: tim.orling@konsulko.com To: yocto-patches@lists.yoctoproject.org Subject: [yocto-autobuilder2][PATCH v3 3/6] scripts: add run-vcontainer-tests for meta-virtualization Date: Fri, 5 Jun 2026 19:51:17 -0700 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sat, 06 Jun 2026 02:51:48 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/4158 From: Tim Orling Add scripts/run-vcontainer-tests, the test runner used by the vcontainers-test job. It sources the vcontainer-tarball SDK, discovers the meta-virtualization pytest suite, and runs a configurable set of suites (vdkr, vpdmn, memres) against the checked-out layers. Suites can be selected per-step so the top-level 'vcontainer-tests' job runs the container engine agnostic tests: - tests/test_container_cross_install.py - tests/test_container_registry_script.py - tests/test_vcontainer_auth_config.py - tests/test_multiarch_oci.py - tests/test_multilayer_oci.py The 'vdkr-tests' and 'vpdmn-tests' jobs run only their respective suites (including memres for each container engine): - tests/test_vdkr.py - tests/test_vdkr_registry.py and - tests/test_vpdmn.py The purpose of this script is to test the just built vcontainer-tarball, so that it can be considered "known-good" and be published for use by container building jobs that need the vcontainer-tarball installed. AI-Generated: Claude Cowork Opus 4.7 Signed-off-by: Tim Orling --- config.json | 31 +++++ scripts/run-vcontainer-tests | 212 +++++++++++++++++++++++++++++++++++ 2 files changed, 243 insertions(+) create mode 100755 scripts/run-vcontainer-tests diff --git a/config.json b/config.json index 2971fe9..3fccd83 100644 --- a/config.json +++ b/config.json @@ -1853,6 +1853,37 @@ "install -d ${BASE_SHAREDDIR}/pub/vcontainer-tarball-latest && install -m 0755 ${BUILDDIR}/tmp/deploy/sdk/vcontainer-standalone.sh ${BASE_SHAREDDIR}/pub/vcontainer-tarball-latest/vcontainer-standalone.sh.new && mv -f ${BASE_SHAREDDIR}/pub/vcontainer-tarball-latest/vcontainer-standalone.sh.new ${BASE_SHAREDDIR}/pub/vcontainer-tarball-latest/vcontainer-standalone.sh" ] } + }, + "vcontainer-tests": { + "NEEDREPOS" : ["bitbake", "meta-openembedded", "meta-virtualization"], + "ADDLAYER" : [ + "${BUILDDIR}/../meta-openembedded/meta-oe", + "${BUILDDIR}/../meta-openembedded/meta-python", + "${BUILDDIR}/../meta-openembedded/meta-networking", + "${BUILDDIR}/../meta-openembedded/meta-filesystems", + "${BUILDDIR}/../meta-virtualization" + ], + "step1" : { + "shortname" : "Run vcontainer pytest suite", + "NOBUILDTOOLS" : 1, + "EXTRACMDS" : [ + "${SCRIPTSDIR}/run-vcontainer-tests -s vcontainer -b ${BUILDDIR} -m ${BUILDDIR}/../meta-virtualization -S ${BASE_SHAREDDIR}/pub/vcontainer-tarball-latest/vcontainer-standalone.sh -r ${HELPERRESULTSDIR}" + ] + }, + "step2" : { + "shortname" : "Run vdkr pytest suite", + "NOBUILDTOOLS" : 1, + "EXTRACMDS" : [ + "${SCRIPTSDIR}/run-vcontainer-tests -s vdkr -b ${BUILDDIR} -m ${BUILDDIR}/../meta-virtualization -S ${BASE_SHAREDDIR}/pub/vcontainer-tarball-latest/vcontainer-standalone.sh -r ${HELPERRESULTSDIR}" + ] + }, + "step3" : { + "shortname" : "Run vpdmn pytest suite", + "NOBUILDTOOLS" : 1, + "EXTRACMDS" : [ + "${SCRIPTSDIR}/run-vcontainer-tests -s vpdmn -b ${BUILDDIR} -m ${BUILDDIR}/../meta-virtualization -S ${BASE_SHAREDDIR}/pub/vcontainer-tarball-latest/vcontainer-standalone.sh -r ${HELPERRESULTSDIR}" + ] + } } }, "repo-defaults" : { diff --git a/scripts/run-vcontainer-tests b/scripts/run-vcontainer-tests new file mode 100755 index 0000000..a7dbab3 --- /dev/null +++ b/scripts/run-vcontainer-tests @@ -0,0 +1,212 @@ +#!/bin/bash +# +# SPDX-License-Identifier: GPL-2.0-only +# +# Run meta-virtualization pytest test suites against the vcontainer +# standalone SDK (vdkr/vpdmn) that was built in a previous bitbake +# step. +# +# Usage: +# run-vcontainer-tests -s -b -m [options] +# +# Required: +# -s suite name: one of "vcontainer", "vdkr", "vpdmn" +# -b bitbake build directory (${BUILDDIR}) +# -m path to the meta-virtualization layer +# +# Optional: +# -S path to the vcontainer standalone SDK installer. The +# autobuilder -tests jobs share the SDK produced by the +# separate vcontainer-tarball builder. When unset, falls +# back to looking in /tmp/deploy/sdk. +# -e where to extract the standalone SDK tarball +# (default: /vcontainer-test-extracted) +# -i path to an OCI image directory (enables vdkr/vpdmn +# import tests) +# -a target architecture for vdkr/vpdmn tests (default: x86_64) +# -r directory to copy pytest artefacts (junit xml / log) to +# -k pytest marker filter (default excludes long running / +# infrastructure dependent tests) +# -h show this help and exit +# +# The script is intentionally conservative: any pytest tests that cannot run +# in the CI environment (those marked "slow", "network", "boot") are skipped +# so that the autobuilder step completes without needing network access. Those +# can be re-enabled via -k before invocation. +# +# It is assumed that /dev/kvm is writable by the CI user running the tests, +# since the performance is significantly faster with 'memres'. +# + +set -e +set -u +set -o pipefail +set -x + +usage() { + cat >&2 <<'EOF' +Usage: run-vcontainer-tests -s -b -m [options] + +Required: + -s vcontainer | vdkr | vpdmn + -b bitbake build directory + -m path to the meta-virtualization layer + +Optional: + -S path to the vcontainer standalone SDK installer + -e where to extract the standalone SDK tarball + -i path to an OCI image directory + -a target architecture (default: x86_64) + -r directory to copy pytest artefacts to + -k pytest marker filter + -h show this help and exit +EOF +} + +suite="" +builddir="" +metavirtdir="" +sdk_tarball="" +extract_dir="" +oci_image="" +arch="" +results_dir="" +marker_filter="not slow and not network and not boot and not incus and not k3s" + +while getopts ":s:b:m:S:e:i:a:r:k:h" opt; do + case "$opt" in + s) suite="$OPTARG" ;; + b) builddir="$OPTARG" ;; + m) metavirtdir="$OPTARG" ;; + S) sdk_tarball="$OPTARG" ;; + e) extract_dir="$OPTARG" ;; + i) oci_image="$OPTARG" ;; + a) arch="$OPTARG" ;; + r) results_dir="$OPTARG" ;; + k) marker_filter="$OPTARG" ;; + h) usage; exit 0 ;; + :) echo "ERROR: option -$OPTARG requires an argument" >&2; usage; exit 2 ;; + \?) echo "ERROR: unknown option -$OPTARG" >&2; usage; exit 2 ;; + esac +done + +if [ -z "$suite" ] || [ -z "$builddir" ] || [ -z "$metavirtdir" ]; then + echo "ERROR: -s, -b and -m are required" >&2 + usage + exit 2 +fi + +builddir=$(realpath "$builddir") +metavirtdir=$(realpath "$metavirtdir") + +if [ ! -d "$metavirtdir/tests" ]; then + echo "ERROR: meta-virtualization tests directory not found at $metavirtdir/tests" >&2 + exit 1 +fi + +# Locate the vcontainer standalone SDK tarball. Prefer an explicitly-provided +# SDK (-S), and fall back to looking in the local build's +# deploy/sdk directory when running stand-alone. +if [ -n "$sdk_tarball" ]; then + if [ ! -f "$sdk_tarball" ]; then + echo "ERROR: SDK installer '$sdk_tarball' is set but not a file" >&2 + exit 1 + fi +else + sdk_tarball="$builddir/tmp/deploy/sdk/vcontainer-standalone.sh" + if [ ! -f "$sdk_tarball" ]; then + # Try to find any matching tarball in case naming changed (e.g. versioned) + alt=$(ls -1 "$builddir"/tmp/deploy/sdk/vcontainer-*.sh 2>/dev/null | head -n1 || true) + if [ -n "$alt" ]; then + sdk_tarball="$alt" + else + echo "ERROR: vcontainer standalone SDK not found." >&2 + echo " Pass -S with an existing SDK installer, or" >&2 + echo " build vcontainer-tarball so $builddir/tmp/deploy/sdk/vcontainer-standalone.sh exists." >&2 + exit 1 + fi + fi +fi + +extract_dir="${extract_dir:-$builddir/vcontainer-test-extracted}" +rm -rf "$extract_dir" +mkdir -p "$(dirname "$extract_dir")" + +# Self-extracting installer (silent, -y agrees to license, -d picks dir) +"$sdk_tarball" -d "$extract_dir" -y + +# Prepare a Python venv so we don't pollute the worker's system packages. +python3 -m venv "$builddir/meta-virt-test-venv" +# shellcheck disable=SC1091 +source "$builddir/meta-virt-test-venv/bin/activate" +# Avoid warnings by upgrading pip; install pytest/pexpect into the venv via pip. +export PIP_DISABLE_PIP_VERSION_CHECK=1 +python3 -m pip install --quiet -r "$metavirtdir/tests/requirements.txt" + +# Per-suite test file selection. Uses -k/-m for fine-grained filtering and +# keeps the CLI small for logging clarity. +case "$suite" in + vdkr) + test_files=( + "tests/test_vdkr.py" + "tests/test_vdkr_registry.py" + ) + ;; + vpdmn) + test_files=( + "tests/test_vpdmn.py" + ) + ;; + vcontainer) + # Broad vcontainer/bbclass/tooling coverage that doesn't require the + # vdkr/vpdmn CLI harness to be running. + test_files=( + "tests/test_container_cross_install.py" + "tests/test_container_registry_script.py" + "tests/test_vcontainer_auth_config.py" + "tests/test_multiarch_oci.py" + "tests/test_multilayer_oci.py" + ) + ;; + *) + echo "ERROR: unknown suite '$suite' (expected vcontainer|vdkr|vpdmn)" >&2 + exit 2 + ;; +esac + +pytest_args=( + -v + --tb=short + -m "$marker_filter" + --vdkr-dir "$extract_dir" + --junitxml="$builddir/pytest-$suite-results.xml" +) + +# Allow tests that consume an OCI image (import/save/load) to find one. +if [ -n "$oci_image" ] && [ -d "$oci_image" ]; then + pytest_args+=(--oci-image "$oci_image") +fi + +# Pass architecture through when set (default is x86_64). +if [ -n "$arch" ]; then + pytest_args+=(--arch "$arch") +fi + +cd "$metavirtdir" +# Don't let a single failing test kill the whole step - collect the junit +# report, then surface the exit code via the junit file + exit status. +set +e +python3 -m pytest "${pytest_args[@]}" "${test_files[@]}" +rc=$? +set -e + +# Copy artefacts to the results dir if one was provided. +if [ -n "$results_dir" ]; then + mkdir -p "$results_dir" + cp -f "$builddir/pytest-$suite-results.xml" "$results_dir/" 2>/dev/null || true + if [ -f /tmp/pytest-vcontainer.log ]; then + cp -f /tmp/pytest-vcontainer.log "$results_dir/pytest-$suite.log" || true + fi +fi + +exit $rc From patchwork Sat Jun 6 02:51:18 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 89429 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7906BCD8C8C for ; Sat, 6 Jun 2026 02:51:48 +0000 (UTC) Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.9587.1780714305859555575 for ; Fri, 05 Jun 2026 19:51:45 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@konsulko.com header.s=google header.b=UD0euxVw; spf=pass (domain: konsulko.com, ip: 209.85.210.179, mailfrom: tim.orling@konsulko.com) Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-8423610ec93so1999082b3a.2 for ; Fri, 05 Jun 2026 19:51:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=konsulko.com; s=google; t=1780714305; x=1781319105; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=WveKnbto7xdliqmKUZvkOHdcTJqF/PT0PBVVTGkyrA0=; b=UD0euxVwFNeb+btTmtHf226yCn9w6DU8fxtHuzFhTQqS/6Q4jrqQ9iYL9dTAbkcnzB 1ykWmMM/H+gk5wPoPeew85Nc5Iq8RawQvzKM+WmRxm/pjbp/X4MO2C5nBLjW07+sDBGX E8ELrZevWlDHCZqrWUfuBW7I2xgTKZRZEOnMc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780714305; x=1781319105; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=WveKnbto7xdliqmKUZvkOHdcTJqF/PT0PBVVTGkyrA0=; b=WcW9L4Cw04Fc9LaGohBSUpqorII1BIzuHCCFGo3oxhjczOmGFjxvEdbG+mgWBDQfc9 eJQwD8ufLZj4H/O635b1JILbAe4QT1KegPDRcKtFpFXZDNCOmgX/OoOrVQ9bBuLdz1zF m9CWBC7e12+2IfZbuzeiTAj5RcKl4Y5DKxDvRk19tCjl41U29GB0+7Pw998SKJ9yEu8t xy5zhKbQawaOmYYWetJ074lp1HLZaPZVMluwHtMVyTgIK+SYf+PKm+xfFufSnCjSrCiu HasorV3A2M4HBGKSoWBKqdVaHOTHLD77yo2YMBYN/H2dK3K2qQMhIzoWeM0EMN/U9TW2 Kdpw== X-Gm-Message-State: AOJu0YxrAcAgaN1aaIAQG+dFakLB5fW/1vodBc2jsDcnFUCoYuqHmMDR IW2EWQUG8JlA1Birul62TAMy4t2/z/JVnuqlgGH+m81CeapBKYxc5ihg43DTMnsjQHC2A0cnOi6 l4mBj X-Gm-Gg: Acq92OEw14EIAo5rN7c2AaxRWDqVM1ARA6vgysfCXoz4fqea9p6STBit0PmD6CAEuwV U5g5fypnhYFwiAkZLOwlIXOSCMe6R7cQbVPCPEFIIZraA0SVvKagoGDda3sBHOeBi5HIyCHbYVf VmCqx8jRQ6Fqi1H5gKM4gQePNvMevpee6ird0m9dirEZRfsbNmCGbXeDsiPruIOeX0EZ+sckFqd cwhp45ImMckIAw5NHn+q/YdYi7fPEQHIx6CCXYQu2iN1xeYYc1HjFH+LbwysJ6TF+awuhbDq/yF j9YE4Kn0fTOk5NihjPB/oH29TPz2TokvTdsJlgsR4svRf4NCpPUwZlSzFarHWE7UgshrI2l0CVt 58zJAc2J6+f/vP1aB24yyWdeicc3sonWc5cCQe+zXP6Gp59KjmzwmIK7sexVQOfWxg6aSY4f++P H8WEgAFVpXt65R1g29qza3+EZSxcl13ZGnDl3BS+j5M9HTVP/3Te/RO78CPFthWyL921viwtARM w== X-Received: by 2002:aa7:8892:0:b0:842:459b:d62a with SMTP id d2e1a72fcca58-842b0de6486mr6387037b3a.17.1780714305134; Fri, 05 Jun 2026 19:51:45 -0700 (PDT) Received: from localhost (c-98-232-159-17.hsd1.or.comcast.net. [98.232.159.17]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84282883647sm12722450b3a.36.2026.06.05.19.51.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jun 2026 19:51:44 -0700 (PDT) From: tim.orling@konsulko.com To: yocto-patches@lists.yoctoproject.org Subject: [yocto-autobuilder2][PATCH v3 4/6] scripts: add container registry push, auth, tagging, runtime selection Date: Fri, 5 Jun 2026 19:51:18 -0700 Message-ID: <83d7e0d4ebaf3a0d559c4e2a5b6a4f2ff1972e4a.1780710041.git.tim.orling@konsulko.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sat, 06 Jun 2026 02:51:48 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/4159 From: Tim Orling Add the push-containers infrastructure that drives the post-build steps for the 'containers-library' job. After each build step the runtime container store is harvested and pushed to one or more registries with derived per-step tags. * config.json: add CONTAINER_REGISTRIES, CONTAINER_AUTH_CONFIG, CONTAINER_RUNTIME, CONTAINER_TAG_CMDS, CONTAINER_VERSION_RECIPE and CONTAINER_IMAGE_MAP configuration knobs. * scripts/run-config: drive push-containers as a post-step action (by running scripts/run-push-containers). * scripts/run-push-containers: Tags are generated from recipe and distro metadata (yocto- tag uses major.minor on snapshots and full PV on releases) with CONTAINER_VERSION_RECIPE allowing a step to source PV from a different recipe than the image itself. * Registry auth is staged via .../config.json or podman .../auth.json using CONTAINER_AUTH_CONFIG, replacing an interactive login that could hang. CONTAINER_RUNTIME picks between vdkr (Docker-compatible) and vpdmn (Podman) runtimes. * Robustness: skip gracefully when no registries are configured, fix the OCI directory path, handle memres already running, and avoid hanging when memres has not yet come up. AI-Generated: Claude Cowork Opus 4.8 Signed-off-by: Tim Orling --- config.json | 5 ++ scripts/run-config | 12 +++ scripts/run-push-containers | 165 ++++++++++++++++++++++++++++++++++++ 3 files changed, 182 insertions(+) create mode 100755 scripts/run-push-containers diff --git a/config.json b/config.json index 3fccd83..e1ea01a 100644 --- a/config.json +++ b/config.json @@ -43,6 +43,11 @@ "BUILDINFOVARS" : ["INHERIT += 'image-buildinfo'", "IMAGE_BUILDINFO_VARS:append = ' IMAGE_BASENAME IMAGE_NAME'"], "WRITECONFIG" : true, "SENDERRORS" : true, + "CONTAINER_RUNTIME" : "vpdmn", + "CONTAINER_REGISTRIES" : [], + "CONTAINER_TAGS" : ["latest"], + "CONTAINER_TAG_CMDS" : [], + "CONTAINER_IMAGE_MAP" : {}, "extravars" : [ "SANITY_TESTED_DISTROS = ''", "BB_HASHSERVE = '${AUTOBUILDER_HASHSERV}'", diff --git a/scripts/run-config b/scripts/run-config index 90a5996..31db212 100755 --- a/scripts/run-config +++ b/scripts/run-config @@ -195,6 +195,8 @@ utils.mkdir(errordir) errorlogs = set() +push_containers = properties.get("push_containers", False) + def log_file_contents(filename, builddir, stepnum, stepname): logfile = logname(builddir, stepnum, stepname) with open(logfile, "a") as outf, open(filename, "r") as f: @@ -313,6 +315,16 @@ def handle_stepnum(stepnum): hp.printheader("Step %s/%s: Running bitbake %s" % (stepnum, maxsteps, sanitytargets)) bitbakecmd(args.builddir, "bitbake %s -k" % (sanitytargets), report, stepnum, args.stepname) + # Push container images to registries when push_containers is enabled. + # The push logic itself lives in scripts/run-push-containers. + container_images = utils.getconfigdict("CONTAINER_IMAGE_MAP", ourconfig, args.target, stepnum) + if container_images and push_containers: + if jcfg: + addstepentry("push-containers", "Push containers", shortdesc, desc, str(container_images), str(stepnum)) + elif args.stepname == "push-containers": + hp.printheader("Step %s/%s: Pushing container images %s" % (stepnum, maxsteps, list(container_images.keys()))) + bitbakecmd(args.builddir, "%s/run-push-containers %s %s" % (scriptsdir, args.target, stepnum), report, stepnum, args.stepname) + # Run any extra commands specified cmds = utils.getconfiglist("EXTRACMDS", ourconfig, args.target, stepnum) if jcfg: diff --git a/scripts/run-push-containers b/scripts/run-push-containers new file mode 100755 index 0000000..cdef497 --- /dev/null +++ b/scripts/run-push-containers @@ -0,0 +1,165 @@ +#!/usr/bin/env python3 +# +# SPDX-License-Identifier: GPL-2.0-only +# +# Push container images built by a target step to the configured registries. +# +# Invoked by run-config for 'push-containers' steps with the OE build +# environment already sourced (bitbake and the vcontainer runtime wrappers +# must be on PATH). All configuration comes from the target/step config: +# +# CONTAINER_IMAGE_MAP - dict of image recipe -> registry image name +# CONTAINER_RUNTIME - vpdmn (default) or vdkr +# CONTAINER_REGISTRIES - list of registries to push to +# CONTAINER_TAGS - list of static tags (e.g. latest) +# CONTAINER_TAG_CMDS - extra shell to populate _EXTRA_TAGS +# CONTAINER_VERSION_RECIPE - recipe whose PV provides the version tag +# CONTAINER_AUTH_CONFIG - registry auth file staged into the guest +# + +import subprocess +import sys + +import utils + +parser = utils.ArgParser(description='Pushes container images for a target step to the configured registries.') + +parser.add_argument('target', + help="The target build name") +parser.add_argument('stepnum', + type=int, + help="The step number within the target") + +args = parser.parse_args() + +ourconfig = utils.loadconfig() + +container_images = utils.getconfigdict("CONTAINER_IMAGE_MAP", ourconfig, args.target, args.stepnum) +if not container_images: + print("No CONTAINER_IMAGE_MAP for %s step %s, nothing to push" % (args.target, args.stepnum)) + sys.exit(0) + +registries = utils.getconfiglist("CONTAINER_REGISTRIES", ourconfig, args.target, args.stepnum) +if not registries: + utils.printheader("push-containers skipped — CONTAINER_REGISTRIES is empty, no containers pushed") + sys.exit(0) + +runtime = utils.getconfigvar("CONTAINER_RUNTIME", ourconfig, args.target, args.stepnum) or "vpdmn" +static_tags = utils.getconfiglist("CONTAINER_TAGS", ourconfig, args.target, args.stepnum) +auth_config = utils.getconfigvar("CONTAINER_AUTH_CONFIG", ourconfig, args.target, args.stepnum) +if not auth_config: + if runtime == "vpdmn": + auth_config = "${HOME}/.config/containers/auth.json" + else: + auth_config = "${HOME}/.docker/config.json" + +utils.printheader("Pushing container images %s" % list(container_images.keys())) + +script = [ + "set -e", + "test -w /dev/kvm || { echo 'ERROR: /dev/kvm is not writable, cannot push containers'; exit 1; }", + # Always bring up a fresh memres VM in the foreground. + # + # 'memres status' only checks that the QEMU PID in daemon.pid + # is alive (see daemon_is_running()/daemon_status() in + # meta-virtualization's vrunner.sh); it returns 0 as soon as + # QEMU forks, so a hung/partially-booted VM from a previous + # run — or a VM in mid-boot — is reported as healthy. The + # subsequent 'login'/'vimport'/'push' commands then hang on + # the unresponsive daemon socket. + # + # 'memres restart' is synchronous: it does stop+start and + # runs a PING/PONG readiness probe against the daemon socket + # (120s timeout), exiting non-zero if the VM never answers. + # Running it in the foreground gives us a trustworthy ready + # signal via its exit code, so we can drop the status-poll + # loop entirely. + # + # Install an EXIT trap first so we always tear the daemon + # down, even if bitbake -e / vimport / push fails mid-step + # under 'set -e'. The trap is armed before the restart so + # a restart failure also triggers cleanup. + # + # Registry auth is staged into the guest at VM boot via + # the global '--config' flag — vrunner.sh's setup_auth_share() + # copies $AUTH_CONFIG onto a read-only 9p share, and + # vdkr-init.sh / vpdmn-init.sh's install_auth_config() + # installs it at /root/.docker/config.json (vdkr) or + # /run/containers/0/auth.json (vpdmn) inside the guest. + # Subsequent 'push' calls use those creds directly, so no + # explicit 'login' step is needed. Calling 'login' would + # actually hang under the autobuilder (no PTY): when the + # memres daemon is running, vcontainer-common.sh dispatches + # login via '--daemon-interactive' and blocks reading the + # password from stdin (see login case in vcontainer-common.sh). + "trap '%s-$(arch) memres stop 2>/dev/null || true' EXIT" % runtime, + "%s-$(arch) --config %s memres restart ' suffix on AUTOREV/dev recipes — Docker + # reference format does not allow '+' in tags, and the + # base PV is what consumers expect. + # + # DISTRO_VERSION needs context-sensitive handling. Poky's + # DISTRO_VERSION resolves to '${PV}+snapshot-${METADATA_REVISION}' + # off a tag and just '${PV}' on a release tag. The '+' in + # the snapshot form is illegal in a Docker tag, but more + # importantly the patch level on a snapshot build (e.g. + # '6.0.99' between 6.0 and 6.1) is a moving target that + # doesn't correspond to any real release — only the + # major.minor line is meaningful. So: + # - snapshot build (DISTRO_VERSION contains '+') → tag + # with major.minor only, e.g. 'yocto-6.0'. + # - release-tag build (no '+') → tag with the full + # version, e.g. 'yocto-5.0.5' from the yocto-5.0.5 tag. + script += [ + "_BBENV=$(bitbake -e %s 2>/dev/null) || true" % recipe, + "_PV=$(echo \"$_BBENV\" | awk -F'\"' '/^PV=/{ print $2; exit }' | sed 's/+.*//')", + "_DISTRO_CODENAME=$(echo \"$_BBENV\" | awk -F'\"' '/^DISTRO_CODENAME=/{ print $2; exit }')", + "_DISTRO_VERSION_RAW=$(echo \"$_BBENV\" | awk -F'\"' '/^DISTRO_VERSION=/{ print $2; exit }')", + "case \"$_DISTRO_VERSION_RAW\" in", + " *+*) _DISTRO_VERSION=$(echo \"${_DISTRO_VERSION_RAW%%+*}\" | cut -d. -f1,2) ;;", + " *) _DISTRO_VERSION=\"$_DISTRO_VERSION_RAW\" ;;", + "esac", + "_DEPLOY_DIR_IMAGE=$(echo \"$_BBENV\" | awk -F'\"' '/^DEPLOY_DIR_IMAGE=/{ print $2; exit }')", + "_EXTRA_TAGS=\"\"", + ] + if version_recipe: + # When the image recipe's PV is a wrapper-style + # placeholder (e.g. app-container-python_1.0.0.bb, + # whose 1.0.0 is meaningless to a downstream user), + # CONTAINER_VERSION_RECIPE points at the recipe whose + # PV is actually meaningful for the resulting tag — + # typically the language runtime or app being packaged + # (e.g. python3 -> 3.14.x). Override _PV from that + # recipe; image-recipe state still drives + # DEPLOY_DIR_IMAGE and DISTRO_* since those are + # environment-wide. + script += [ + "_VBBENV=$(bitbake -e %s 2>/dev/null) || true" % version_recipe, + "_PV=$(echo \"$_VBBENV\" | awk -F'\"' '/^PV=/{ print $2; exit }' | sed 's/+.*//')", + ] + script += tag_cmds + script.append( + "_TAGS=\"%s $_PV $_DISTRO_CODENAME yocto-$_DISTRO_VERSION $_EXTRA_TAGS\"" % " ".join(static_tags) + ) + for registry in registries: + # No per-registry 'login': credentials were staged into + # the guest by '--config' on 'memres restart' above. + script += [ + "for _tag in $_TAGS; do", + " %s-$(arch) vimport ${_DEPLOY_DIR_IMAGE}/%s-latest-oci %s/%s:${_tag}" % (runtime, recipe, registry, image), + " %s-$(arch) push %s/%s:${_tag}" % (runtime, registry, image), + "done", + ] +# Tear-down is handled by the EXIT trap installed above. +utils.flush() +sys.exit(subprocess.call(["/bin/bash", "-c", "\n".join(script)])) From patchwork Sat Jun 6 02:51:19 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 89426 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5AD27CD8C89 for ; Sat, 6 Jun 2026 02:51:48 +0000 (UTC) Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.9457.1780714307716786038 for ; Fri, 05 Jun 2026 19:51:47 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@konsulko.com header.s=google header.b=j8eZ82wO; spf=pass (domain: konsulko.com, ip: 209.85.214.173, mailfrom: tim.orling@konsulko.com) Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2c0c379e8ffso17834865ad.3 for ; Fri, 05 Jun 2026 19:51:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=konsulko.com; s=google; t=1780714307; x=1781319107; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=WmvatY3D5s7K4rI8c7d7kRG0/CBouTRj/yBcEY6d2+Y=; b=j8eZ82wOKmcPJkstn7hi2vlRkAHiWV82PYtH+UMcuAbR7e/Sj4c8/BWprSQQu8oDlt taALRpQBA+gErzVVAiq2H3Ftprazgx0/hndfWCQyNzo3J95xLtPBPo15fmQlh3DxksBl tZG+pGzsPnTv6JaJBInoza5CQjmWr1hVHrCBE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780714307; x=1781319107; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=WmvatY3D5s7K4rI8c7d7kRG0/CBouTRj/yBcEY6d2+Y=; b=rugClygFCvFfOexs0ZwZ2v0BhzrHLfkC5hnQ62Rfu7WlsJY/qSg1AyMy0X4BpipPS1 WuacHcoSqU/nzCmyOplWTPnRmBSZWjO0cLg3pf/rPFQ3xLSQ5mG5SGNqWs9bAgdFdtuM htAxYOeuwH1XjA/Pv5IUxLXtxwWW0gbxXkT96hlbyO1XtmuunZWqywHdBWgzqf1P9PTb RuGk65HQZ8liZXgePwMn3aV0ObNRKTG4V/lzgs1hWYQloVPp5SJUQ28yMiGbXr5ZwigA 6+Uu6XRo2Ge5c8ZMfqrarybV6Sv0nqdEpK+ENf7n+G5U8pt2v6MGZZ41xEbVuQI6+wVC dJeg== X-Gm-Message-State: AOJu0YyGxt7NmZEdelqpvxK8+We393nczAsfF9+zPNFoarA74e25+JZ6 fkTnXXgzStevAD8fQD01XYACRbPz472S3Vy43c7/sS8lzdYMr+AgWxPh/wxCrV0Z1hvX/Vsawkx mdxbY X-Gm-Gg: Acq92OH4AmithTz4aEmJRdrHfd2nTlSMwLvrFXoiBNmORRfUOm/F+S2ZNA1vfqHbHdR lBhpfCcZ+B+TJ3tkio1bqkkAJ6exDl9y8iU5P7CHn4RdcMRWl+Kfy9J5RiohDb51bcKAcb8pDlj BJzctapS8ukrSw3q+p2U0qxB1vM6cQoS/cIYqyhl4u5TBwNIiQL+g8orpFZoeybAt2hd373uBS8 tqVKQYbrazXHEP6H6eMyzO7QVkv7SFdP+5IOvSbTZTIPjoyinPsUaJrQXoXlE8hC4vttraVH6kx EZSGOwUO2jJ2rBeNNc5lVKooP+RHSnrALqTpDjPF3KIE0ImynJveNuKGx/yzOMoiONHpik9d14K fJbCFPwy3SSDvzJ0rU6OMP1xcON2QHyIrXFyglCEeSAqp2Gd80gMiFe6il/wCdysF2uxmzYxz3/ 5u1PRIWrpDE+ZlM55WpTKbJ3se8lPu7wYy6L2ClHJi5q7Nl96DhUSzUJydnEeqhIj3Mmg2caYAV twJPHLEZsH0 X-Received: by 2002:a17:903:1813:b0:2c0:c262:b919 with SMTP id d9443c01a7336-2c1e78e4e97mr41368345ad.5.1780714307053; Fri, 05 Jun 2026 19:51:47 -0700 (PDT) Received: from localhost (c-98-232-159-17.hsd1.or.comcast.net. [98.232.159.17]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2c16609e2d7sm108113515ad.39.2026.06.05.19.51.46 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jun 2026 19:51:46 -0700 (PDT) From: tim.orling@konsulko.com To: yocto-patches@lists.yoctoproject.org Subject: [yocto-autobuilder2][PATCH v3 5/6] config.json: add 'containers-library' build job Date: Fri, 5 Jun 2026 19:51:19 -0700 Message-ID: <2a6d0e8432b255f5e4fcd2bbe3a219f4a69ab64f.1780710041.git.tim.orling@konsulko.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sat, 06 Jun 2026 02:51:48 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/4160 From: Tim Orling Add 'containers-library' build job that builds container images on top of the vcontainer-tarball SDK: * original container images from the intial "container-cross-install" branch of meta-virtualization - container-base - app-container-curl * additional images modelled after docker.io/library/* - app-container-python - app-container-mosquitto - app-container-valkey - app-container-nginx * Tag containers with versions based on the recipe to which they are mapped, e.g. python:3, python:3.14, python:3.14.5. Also tag with DISTRO_CODENAME and DISTRO_VERSION, e.g. wrynose and yocto-6.0. Signed-off-by: Tim Orling --- config.json | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/config.json b/config.json index e1ea01a..18a2b6b 100644 --- a/config.json +++ b/config.json @@ -1889,6 +1889,62 @@ "${SCRIPTSDIR}/run-vcontainer-tests -s vpdmn -b ${BUILDDIR} -m ${BUILDDIR}/../meta-virtualization -S ${BASE_SHAREDDIR}/pub/vcontainer-tarball-latest/vcontainer-standalone.sh -r ${HELPERRESULTSDIR}" ] } + }, + "containers-library": { + "NEEDREPOS" : ["bitbake", "meta-openembedded", "meta-virtualization"], + "ADDLAYER" : [ + "${BUILDDIR}/../meta-openembedded/meta-oe", + "${BUILDDIR}/../meta-openembedded/meta-python", + "${BUILDDIR}/../meta-openembedded/meta-networking", + "${BUILDDIR}/../meta-openembedded/meta-filesystems", + "${BUILDDIR}/../meta-openembedded/meta-webserver", + "${BUILDDIR}/../meta-virtualization" + ], + "extravars" : [ + "DISTRO_FEATURES:append = ' virtualization vcontainer'" + ], + "vcontainer" : "${VCONTAINER_TARBALL_URL}", + "CONTAINER_TAG_CMDS" : [ + "_PV_MAJOR=$(echo $_PV | cut -d. -f1)", + "_PV_MAJOR_MINOR=$(echo $_PV | cut -d. -f1,2)", + "_EXTRA_TAGS=\"$_PV_MAJOR $_PV_MAJOR_MINOR\"" + ], + "step1" : { + "shortname" : "Build 'base' container", + "BBTARGETS" : "container-base", + "CONTAINER_IMAGE_MAP" : {"container-base": "base"}, + "CONTAINER_VERSION_RECIPE" : "base-files" + }, + "step2" : { + "shortname" : "Build 'curl' container", + "BBTARGETS" : "app-container-curl", + "CONTAINER_IMAGE_MAP" : {"app-container-curl": "curl"}, + "CONTAINER_VERSION_RECIPE" : "curl" + }, + "step3" : { + "shortname" : "Build 'python' container", + "BBTARGETS" : "app-container-python", + "CONTAINER_IMAGE_MAP" : {"app-container-python": "python"}, + "CONTAINER_VERSION_RECIPE" : "python3" + }, + "step4" : { + "shortname" : "Build 'mosquitto' container", + "BBTARGETS" : "app-container-mosquitto", + "CONTAINER_IMAGE_MAP" : {"app-container-mosquitto": "mosquitto"}, + "CONTAINER_VERSION_RECIPE" : "mosquitto" + }, + "step5" : { + "shortname" : "Build 'valkey' container", + "BBTARGETS" : "app-container-valkey", + "CONTAINER_IMAGE_MAP" : {"app-container-valkey": "valkey"}, + "CONTAINER_VERSION_RECIPE" : "valkey" + }, + "step6" : { + "shortname" : "Build 'nginx' container", + "BBTARGETS" : "app-container-nginx", + "CONTAINER_IMAGE_MAP" : {"app-container-nginx": "nginx"}, + "CONTAINER_VERSION_RECIPE" : "nginx" + } } }, "repo-defaults" : { From patchwork Sat Jun 6 02:51:20 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Orling X-Patchwork-Id: 89430 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8A839CD8C88 for ; Sat, 6 Jun 2026 02:51:58 +0000 (UTC) Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.9588.1780714309672795267 for ; Fri, 05 Jun 2026 19:51:49 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@konsulko.com header.s=google header.b=FwwneHtJ; spf=pass (domain: konsulko.com, ip: 209.85.214.170, mailfrom: tim.orling@konsulko.com) Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-2c0b944f6edso27029145ad.2 for ; Fri, 05 Jun 2026 19:51:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=konsulko.com; s=google; t=1780714309; x=1781319109; darn=lists.yoctoproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=bZMHZo1p5cPVLHL8E/jw+HN4FWT+g9rk2ugPK84Qse8=; b=FwwneHtJJVg73EDpMqFAq2+ULG5sR+pOu8hIHjD6OThbv6ObiT8A4IJ1Mgqkh7IsPC +sTHa1GPHMsjMG4a8S35RIPYvJ5em9bmrVb7Mg9rLZ6vMECoIailoH9DHGdHFnMNcdoW mtTnSwm+0wUax4ApsPdWzo0u1VtHyhFOf6B5s= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780714309; x=1781319109; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=bZMHZo1p5cPVLHL8E/jw+HN4FWT+g9rk2ugPK84Qse8=; b=Pil+9IJRbKqSPpTHnYEwphrmLTslBIHGogtClOgFwSRWGGPsutFFt+sExRC6Rzd/vZ /A/P9Dtk99MvEZBViSbpSgiUEmwqOk+Lc94fo0QuMkE/fKnrjQaJetfzN3DXKxz2gZk9 9c4SSFVoPYEOR7MuQkWQ21EenMEOB8NIn/Ns/2cOc+VWnNYN4N2MJcz1k1c8Uh0F3rPi e3CBUJ7X0dcLzyg0VGLSoHBebYjTPTFHTiT465w8RjTBgkrqzQngzk0k6BeahReCOdQq eDe047/fVt53M+zHE0IwFaikYJzibsg7pimuiZnH3AolQUHd+a6ZSWNfCxNuLX6c2UhB sVjw== X-Gm-Message-State: AOJu0YxlsJuqXHT54CDMoem1rZQSoORVxkM4NK4b2mbw0WP9L/beVCiJ Gpx8id2qPfAQVoKrsoy/GM2aqZdjPEIBnnxji52AozLGuGzDkj5W7xjkzbbxQcfDqaeUq98Cuu6 1DJmr X-Gm-Gg: Acq92OH4JwBlr0pGnSMzkxFKkYoQyocx8QukfaIMGgh0hs0TlTJwCBull8KKWMXRINp 22etHIrvRf45QXXoR87wAxRUVIups9ulJ3LXiUh58IPzvjNVAiomK10zKtLQUvcbZ0RaIbZb313 9SLZ504B5ERmZ3zD7AMooo0ocbxan+ZVXGbvYAhtgkpIq7Aa4Aw8ForraGNwBC8DQiRBoG2omgX 4qzsve+gGpBbrx3ySi4ybaIa2EkYw+MwzOspmswziIdDuOJO17UuCGbIKiItCk5elyi8tPPR1Zy 4WrUf3pH9ciau7CvSDtWM/fWl3ll/a7pkbLggVY0uQbFMAwHdDzytOsumYuSWD4jgbPZ9qhf8Tq dTLMxVTZf/MCzsGlVNhWSdBrK7OaroNxdgVWlsG+0m0zYxhappZNobCSaUwUGeV63Nsc3iafoDH KeAH8Cwb0ESPoXXTm40hlAm/vyVHdkkgNeza6mKlFAG5Di/q8SZGkeU07daXUU8t4Mulivb3guX iF+rrzJUZ81 X-Received: by 2002:a17:902:da86:b0:2c0:f807:56b6 with SMTP id d9443c01a7336-2c1e7b3578cmr66590605ad.4.1780714309092; Fri, 05 Jun 2026 19:51:49 -0700 (PDT) Received: from localhost (c-98-232-159-17.hsd1.or.comcast.net. [98.232.159.17]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2c164f6d2bbsm112225495ad.1.2026.06.05.19.51.48 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jun 2026 19:51:48 -0700 (PDT) From: tim.orling@konsulko.com To: yocto-patches@lists.yoctoproject.org Subject: [yocto-autobuilder2][PATCH v3 6/6] scripts/run-push-containers: remove all images before push Date: Fri, 5 Jun 2026 19:51:20 -0700 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sat, 06 Jun 2026 02:51:58 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/yocto-patches/message/4161 From: Tim Orling Workaround for errors like: Error: reading blob sha256:: file integrity checksum failed for "" Error: reading blob sha256:: EOF The first time the blob (e.g. bin/bash.bash) is copied, it succeeds. All subsequent tries fail. Might possibly be an issue with sstate or a recent change to vcontainer-common to allow for multiarch containers. Signed-off-by: Tim Orling --- scripts/run-push-containers | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/run-push-containers b/scripts/run-push-containers index cdef497..4f1ac53 100755 --- a/scripts/run-push-containers +++ b/scripts/run-push-containers @@ -94,6 +94,8 @@ script = [ # password from stdin (see login case in vcontainer-common.sh). "trap '%s-$(arch) memres stop 2>/dev/null || true' EXIT" % runtime, "%s-$(arch) --config %s memres restart : file integrity checksum failed for ""' + "%s-$(arch) image rm --all 2>/dev/null" % (runtime), ] tag_cmds = utils.getconfiglist("CONTAINER_TAG_CMDS", ourconfig, args.target, args.stepnum) version_recipe = utils.getconfigvar("CONTAINER_VERSION_RECIPE", ourconfig, args.target, args.stepnum)