Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package container-build-checks for 
openSUSE:Factory checked in at 2026-05-24 19:34:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/container-build-checks (Old)
 and      /work/SRC/openSUSE:Factory/.container-build-checks.new.2084 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "container-build-checks"

Sun May 24 19:34:59 2026 rev:12 rq:1354718 version:1779450556.9feaecd

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/container-build-checks/container-build-checks.changes
    2024-08-13 13:22:34.640579761 +0200
+++ 
/work/SRC/openSUSE:Factory/.container-build-checks.new.2084/container-build-checks.changes
  2026-05-24 19:35:59.336100173 +0200
@@ -1,0 +2,8 @@
+Fri May 22 11:52:57 UTC 2026 - Fabian Vogt <[email protected]>
+
+- Update to version 1779450556.9feaecd:
+  * Mention oci-archive support in README.md
+  * Support nested indexes and multiple manifests in OCI archives
+  * GitHub workflow: Run in Leap 15.6, BCI 16.0 and TW container images
+
+-------------------------------------------------------------------

Old:
----
  container-build-checks-1723452932.412e7f6.obscpio

New:
----
  container-build-checks-1779450556.9feaecd.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ container-build-checks.spec ++++++
--- /var/tmp/diff_new_pack.hXoZlL/_old  2026-05-24 19:36:01.680196084 +0200
+++ /var/tmp/diff_new_pack.hXoZlL/_new  2026-05-24 19:36:01.704197067 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package container-build-checks
 #
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           container-build-checks
-Version:        1723452932.412e7f6
+Version:        1779450556.9feaecd
 Release:        0
 Summary:        Scripts to validate built container images
 License:        GPL-2.0-or-later

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.hXoZlL/_old  2026-05-24 19:36:02.336222927 +0200
+++ /var/tmp/diff_new_pack.hXoZlL/_new  2026-05-24 19:36:02.364224073 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/openSUSE/container-build-checks.git</param>
-              <param 
name="changesrevision">412e7f60c08221a549b0f00dfcc4bee7694193ab</param></service></servicedata>
+              <param 
name="changesrevision">9feaecd842be3c623487e3986158c822783cfdad</param></service></servicedata>
 (No newline at EOF)
 

++++++ container-build-checks-1723452932.412e7f6.obscpio -> 
container-build-checks-1779450556.9feaecd.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/container-build-checks-1723452932.412e7f6/.github/workflows/test.yml 
new/container-build-checks-1779450556.9feaecd/.github/workflows/test.yml
--- old/container-build-checks-1723452932.412e7f6/.github/workflows/test.yml    
2024-08-12 10:55:32.000000000 +0200
+++ new/container-build-checks-1779450556.9feaecd/.github/workflows/test.yml    
2026-05-22 13:49:16.000000000 +0200
@@ -9,25 +9,21 @@
     strategy:
       matrix:
         include:
-          - os: ubuntu-20.04
-            # Version in SLE 15
-            python: "3.6"
-          - os: ubuntu-latest
-            # Version in openSUSE Tumbleweed
-            python: "3.11"
-    runs-on: ${{ matrix.os }}
+          # SLE and Leap 15.x uses python 3.6
+          - container: registry.opensuse.org/opensuse/leap:15.6
+          # SLE 16.0 uses python 3.13
+          - container: registry.suse.com/bci/bci-base:16.0
+          # TW uses python 3.13 (as of this writing)
+          - container: registry.opensuse.org/opensuse/tumbleweed
+    runs-on: ubuntu-latest
+    container:
+      image: ${{ matrix.container }}
+      options: --privileged
     steps:
-    - uses: actions/checkout@v3
-    - name: Set up Python
-      uses: actions/setup-python@v4
-      with:
-        python-version: ${{ matrix.python }}
     - name: Install dependencies
       run: |
-        pip3 install --upgrade pip
-        pip3 install flake8
-        sudo apt update
-        sudo apt install -y podman
+        zypper in -y diffutils gzip make tar podman python3-flake8
+    - uses: actions/checkout@v6
     - name: Lint
       run: make lint
     - name: Test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/container-build-checks-1723452932.412e7f6/README.md 
new/container-build-checks-1779450556.9feaecd/README.md
--- old/container-build-checks-1723452932.412e7f6/README.md     2024-08-12 
10:55:32.000000000 +0200
+++ new/container-build-checks-1779450556.9feaecd/README.md     2026-05-22 
13:49:16.000000000 +0200
@@ -5,7 +5,7 @@
 
 It is designed to run at the end of image builds inside OBS, where it will 
look at all built images (both KIWI and DOCKER types) and fail the build if 
fatal issues were found. `make install` copies it to the directory where OBS 
expects it (https://github.com/openSUSE/obs-build/pull/675).
 
-As input, it reads .containerinfo files generated by OBS, which contain 
information like the disturl, chosen tags and the name of the tarball in 
`docker save` format (other container tools are available). The latter contains 
`manifest.json`, the image config and layers.
+As input, it reads .containerinfo files generated by OBS, which contain 
information like the disturl, chosen tags and the name of the tarball in 
`docker-archive` or `oci-archive` format. The latter contains a manifest, the 
image config and layers.
 
 To run it against built containers outside of OBS, it's necessary to craft a 
.containerinfo file containing the needed metainfo yourself, e.g.:
 
@@ -74,4 +74,4 @@
 Editing in Gitpod
 ==================
 
-You can apply your edits directly from within your browser on 
[Gitpod](https://gitpod.io/#https://github.com/openSUSE/container-build-checks).
\ No newline at end of file
+You can apply your edits directly from within your browser on 
[Gitpod](https://gitpod.io/#https://github.com/openSUSE/container-build-checks).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/container-build-checks-1723452932.412e7f6/container-build-checks.py 
new/container-build-checks-1779450556.9feaecd/container-build-checks.py
--- old/container-build-checks-1723452932.412e7f6/container-build-checks.py     
2024-08-12 10:55:32.000000000 +0200
+++ new/container-build-checks-1779450556.9feaecd/container-build-checks.py     
2026-05-22 13:49:16.000000000 +0200
@@ -1,5 +1,5 @@
 #!/usr/bin/python3
-# SPDX-FileCopyrightText: 2021,2024 SUSE LLC
+# SPDX-FileCopyrightText: 2026 SUSE LLC
 # SPDX-License-Identifier: GPL-2.0-or-later
 
 from pathlib import Path
@@ -16,23 +16,64 @@
 class Image:
     """Information about the image to be tested."""
 
+    def _ociResolveDigest(self, digest):
+        """Given the digest, return a path to the blob"""
+        return "blobs/" + digest.replace(":", "/")
+
+    def _ociManifestsFromIndex(self, indexFilename):
+        """Given the filename of a OCI image index JSON,
+           collect all referenced manifests. Returns an array."""
+        allManifests = []
+        index = json.load(self.tarfile.extractfile(indexFilename))
+        for manifest in index["manifests"]:
+            if manifest["mediaType"] == 
"application/vnd.oci.image.index.v1+json":  # Nested index
+                indexPath = self._ociResolveDigest(manifest["digest"])
+                allManifests += self._ociManifestsFromIndex(indexPath)
+            elif manifest["mediaType"] == 
"application/vnd.oci.image.manifest.v1+json":
+                manifestPath = self._ociResolveDigest(manifest["digest"])
+                allManifests += [manifestPath]
+            else:
+                raise Exception(f"Unsupported mediaType 
{manifest['mediaType']}")
+
+        return allManifests
+
     def __init__(self, containerinfo, tar):
         self.containerinfo = containerinfo
         self.tarfile = tar
+        self.manifest = None
+        self.config = None
+        self.is_local_build = "release" not in containerinfo and "disturl" not 
in containerinfo
+
         if "oci-layout" in self.tarfile.getnames():
-            self.index = json.load(tar.extractfile("index.json"))
-            if len(self.index["manifests"]) != 1:
-                raise Exception("OCI index doesn't have exactly one entry")
-            manifest = "blobs/" + 
self.index["manifests"][0]["digest"].replace(":", "/")
-            self.manifest = json.load(tar.extractfile(manifest))
-            config = "blobs/" + self.manifest["config"]["digest"].replace(":", 
"/")
+            # Iterate all manifests, find a usable one, hopefully just one.
+            for manifestPath in self._ociManifestsFromIndex("index.json"):
+                thisManifest = json.load(tar.extractfile(manifestPath))
+
+                # config format has to be known
+                if thisManifest["config"]["mediaType"] != 
"application/vnd.oci.image.config.v1+json":
+                    continue
+
+                # and look like something that can be run
+                configPath = 
self._ociResolveDigest(thisManifest["config"]["digest"])
+                thisConfig = json.load(tar.extractfile(configPath))
+                if thisConfig["os"] == "unknown" or 
len(thisConfig["config"].keys()) == 0:
+                    continue
+
+                if self.manifest is not None:
+                    raise Exception("Found more than one potential manifest")
+
+                self.manifest = thisManifest
+                self.config = thisConfig
+
+            if self.manifest is None:
+                raise Exception("No usable manifest found")
         else:
             self.manifest = json.load(tar.extractfile("manifest.json"))
             if len(self.manifest) != 1:
                 raise Exception("Manifest doesn't have exactly one entry")
-            config = self.manifest[0]["Config"]
-        self.config = json.load(self.tarfile.extractfile(config))
-        self.is_local_build = "release" not in containerinfo and "disturl" not 
in containerinfo
+
+            configPath = self.manifest[0]["Config"]
+            self.config = json.load(self.tarfile.extractfile(configPath))
 
 
 class LabelInfo:

++++++ container-build-checks.obsinfo ++++++
--- /var/tmp/diff_new_pack.hXoZlL/_old  2026-05-24 19:36:03.512271046 +0200
+++ /var/tmp/diff_new_pack.hXoZlL/_new  2026-05-24 19:36:03.564273174 +0200
@@ -1,5 +1,5 @@
 name: container-build-checks
-version: 1723452932.412e7f6
-mtime: 1723452932
-commit: 412e7f60c08221a549b0f00dfcc4bee7694193ab
+version: 1779450556.9feaecd
+mtime: 1779450556
+commit: 9feaecd842be3c623487e3986158c822783cfdad
 

Reply via email to