Skip to main content
Redhat Developers  Logo
  • Products

    Platforms

    • Red Hat Enterprise Linux
      Red Hat Enterprise Linux Icon
    • Red Hat AI
      Red Hat AI
    • Red Hat OpenShift
      Openshift icon
    • Red Hat Ansible Automation Platform
      Ansible icon
    • See all Red Hat products

    Featured

    • Red Hat build of OpenJDK
    • Red Hat Developer Hub
    • Red Hat JBoss Enterprise Application Platform
    • Red Hat OpenShift Dev Spaces
    • Red Hat OpenShift Local
    • Red Hat Developer Sandbox

      Try Red Hat products and technologies without setup or configuration fees for 30 days with this shared Red Hat OpenShift and Kubernetes cluster.
    • Try at no cost
  • Technologies

    Featured

    • AI/ML
      AI/ML Icon
    • Linux
      Linux Icon
    • Kubernetes
      Cloud icon
    • Automation
      Automation Icon showing arrows moving in a circle around a gear
    • See all technologies
    • Programming languages & frameworks

      • Java
      • Python
      • JavaScript
    • System design & architecture

      • Red Hat architecture and design patterns
      • Microservices
      • Event-Driven Architecture
      • Databases
    • Developer experience

      • Productivity
      • Tools
      • GitOps
    • Automated data processing

      • AI/ML
      • Data science
      • Apache Kafka on Kubernetes
    • Platform engineering

      • DevOps
      • DevSecOps
      • Red Hat Ansible Automation Platform for applications and services
    • Secure development & architectures

      • Security
      • Secure coding
  • Learn

    Featured

    • Kubernetes & cloud native
      Openshift icon
    • Linux
      Rhel icon
    • Automation
      Ansible cloud icon
    • AI/ML
      AI/ML Icon
    • See all learning resources

    E-books

    • GitOps cookbook
    • Podman in action
    • Kubernetes operators
    • The path to GitOps
    • See all e-books

    Cheat sheets

    • Linux commands
    • Bash commands
    • Git
    • systemd commands
    • See all cheat sheets

    Documentation

    • Product documentation
    • API catalog
    • Legacy documentation
  • Developer Sandbox

    Developer Sandbox

    • Access Red Hat’s products and technologies without setup or configuration, and start developing quicker than ever before with our new, no-cost sandbox environments.
    • Explore the Developer Sandbox

    Featured Developer Sandbox activities

    • Get started with your Developer Sandbox
    • OpenShift virtualization and application modernization using the Developer Sandbox
    • Explore all Developer Sandbox activities

    Ready to start developing apps?

    • Try at no cost
  • Blog
  • Events
  • Videos

Reproducible builds in Project Hummingbird

Achieving reproducibility in software supply chain

March 26, 2026
Jonathan Lebon
Related topics:
Application modernizationSecurity
Related products:
Red Hat OpenShift

    When you pull an OCI image from the registry, you implicitly trust that it contains what its builder claims it does. They may even provide an SBOM for this image, but the SBOM itself must also be trusted. Nothing prevents a builder from reporting an innocuous SBOM, while injecting malware into the image.

    Reproducible builds render this sort of undetectable tampering impossible: A user can directly rebuild the image and verify that the result is bit-for-bit identical to the published blobs. In fact, this capability is useful for an end-user and builder alike because it provides a powerful software supply chain security check against infrastructure compromises. In an era where digital sovereignty is top of mind for many, reproducibility is increasingly important to establish trust and verification of artifacts.

    Hummingbird reproducibility

    Red Hat recently announced Project Hummingbird, a catalog of hardened minimal container images built to address the needs of environments that demand near-zero CVEs. Hummingbird images are built in Konflux, a Tekton-based software factory with a focus on supply chain security. All images built by Konflux also come with both an SBOM and a SLSA provenance artifact.

    Using these Konflux artifacts, it's possible to rebuild any Hummingbird images using just cosign and podman. First, we download and verify the SLSA provenance attestation for the desired image (for now, the key used in this example is only available in the upstream GitLab project):

    $ IMAGE=quay.io/hummingbird-hatchling/jq:latest
    $ curl -LO https://gitlab.com/redhat/hummingbird/containers/-/raw/fc5c29670347ea2666ec2910a28880f76f5cdc4e/ci/key.pub
    $ cosign verify-attestation --key key.pub --insecure-ignore-tlog \
      --type slsaprovenance $IMAGE > attestation.json

    Run the rebuild script, feeding in the attestation and capturing the final image ID:

    $ iid=$(podman run -i --rm --privileged -v /mnt \
      quay.io/hummingbird-ci/builder rebuild < attestation.json)

    And finally, pull the original image and verify its image ID matches what was rebuilt locally:

    $ iid2=$(podman pull $IMAGE)
    $ [ $iid = $iid2 ] && echo "Identical"

    If it prints Identical, then congratulations! You've successfully reproduced a Hummingbird image.

    Note the comparison here is checking the image ID, which is of uncompressed content. This is distinct from the repo digest once it's pushed to a registry, which is calculated from compressed contents. More detailed steps and information are available in the Project Hummingbird upstream repo.

    Achieving reproducibility is not a one-time task. It's a property that requires constant upkeep as new content is added or as build tooling evolves. For example, Hummingbird images have recently started leveraging chunkah, a tool that splits images into content-based layers for more efficient updates and storage. Part of the onboarding process for this required fixing various reproducibility issues in the splitting process.

    To ensure all our images are always reproducible, our CI rebuilds images on every change. The image is built once in Konflux, and then rebuilt once more outside of it using steps similar to the above.

    Note: It's important to understand that in this process, we did not rebuild the individual RPMs that go into Hummingbird images. What we've reproduced is only the assembly of those RPMs into an OCI image.

    How it works

    There are a lot of things that must come together for this to succeed. First, most inputs to the Hummingbird image builds are kept in the Git repo itself. This allows us to do CI testing before any input is updated (this is not very different from how a Rust application may use Cargo.lock). But it also means that given an image and the associated Git commit from which it was built, we know exactly which RPMs were used to produce it.

    Both Konflux and the rebuild process above use Buildah for building images. In Buildah 1.41, support was added for reproducible builds using the --source-date-epoch (or SOURCE_DATE_EPOCH environment variable) and --rewrite-timestamp options. SOURCE_DATE_EPOCH is a standardized way to tell tools to use a fixed timestamp for reproducible output. When building Hummingbird images, the SOURCE_DATE_EPOCH comes from the timestamp of the Git commit we're building from.

    The Git commit can be obtained from the SLSA provenance. But there are other factors which influence the build output that's not captured by the Git commit:

    1. Konflux uses a containerized version of buildah. For maximum reproducibility, we need the exact buildah image that was used during the build. This is obtained from the SLSA provenance.
    2. Hummingbird images are built using a multi-stage build process where a builder image creates the target image (using e.g. dnf install --installroot=...). When reproducing builds, we need the exact builder image that was used during the build. This is obtained from the image's SBOM.

    And this is what the rebuild command does: It identifies all of these inputs using the SLSA attestation and SBOM and then builds the image.

    Reaching reproducibility

    Installing RPMs is currently an imperative process. RPMs are unpacked, scriptlets are run in a specific order, and various files are created at runtime, including non-trivial ones like databases. All of these had to be made reproducible. For instance, the RPM SQLite database by default is in WAL mode, which produces non-deterministic journal files, so it must be switched to DELETE mode after installation (sometimes called "parking"). The order in which RPMs are installed was made reproducible by having dnf sort the package list before feeding to RPM. The order in which OCI annotations are added matters. Various non-reproducible bits which don't matter or don't belong in images were removed (such as /etc/machine-id).

    Once we had reproducible builds locally, we also had to adapt the Konflux build process itself to better support reproducibility for production builds. For example, Konflux injects various security-related metadata into built images for use by scanners. For better reproducibility, we moved this logic to live directly in the Containerfile build process rather than in Konflux. The Konflux release pipeline still verifies that this metadata is correct and in line with supply chain security best practices.

    Looking ahead

    Reproducible builds play a key role in software supply chain security. It cannot be only theoretical. Reproducibility as a property is worthless until someone actually exercises it. This is why Hummingbird images were designed to be easy to reproduce, with minimal tooling. A major output of this effort was the start of Konflux discussions to make reproducible builds a priority feature of Konflux. This entails moving a lot of the work that happened in Hummingbird out to shared tooling, where more images can achieve reproducibility. Until then, feel free to grab a Project Hummingbird image and try reproducing it!

    Related Posts

    • Build a CI/CD pipeline with OpenShift Dev Spaces and GitOps

    • How to build an image mode pipeline with GitLab

    • Signing RPM packages using quantum-resistant cryptography

    • Python packaging for RHEL 9 & 10 using pyproject RPM macros

    • What's inside an RPM .repo file?

    • Ephemeral OpenShift clusters in Konflux CI using the Cluster-as-a-Service operator

    Recent Posts

    • Reproducible builds in Project Hummingbird

    • Getting started with the vLLM Semantic Router project's Athena release: Optimize your tokens for agentic AI

    • Dynamic resource allocation goes GA in Red Hat OpenShift 4.21: Smarter GPU scheduling for AI workloads

    • How to run a Red Hat-powered local AI audio transcription

    • Run Model-as-a-Service for multiple LLMs on OpenShift

    What’s up next?

    Share graphics_Red Hat universal base image

    Red Hat Universal Base Images (UBI)

    Mike Guerette
    Red Hat Developers logo LinkedIn YouTube Twitter Facebook

    Platforms

    • Red Hat AI
    • Red Hat Enterprise Linux
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform
    • See all products

    Build

    • Developer Sandbox
    • Developer tools
    • Interactive tutorials
    • API catalog

    Quicklinks

    • Learning resources
    • E-books
    • Cheat sheets
    • Blog
    • Events
    • Newsletter

    Communicate

    • About us
    • Contact sales
    • Find a partner
    • Report a website issue
    • Site status dashboard
    • Report a security problem

    RED HAT DEVELOPER

    Build here. Go anywhere.

    We serve the builders. The problem solvers who create careers with code.

    Join us if you’re a developer, software engineer, web designer, front-end designer, UX designer, computer scientist, architect, tester, product manager, project manager or team lead.

    Sign me up

    Red Hat legal and privacy links

    • About Red Hat
    • Jobs
    • Events
    • Locations
    • Contact Red Hat
    • Red Hat Blog
    • Inclusion at Red Hat
    • Cool Stuff Store
    • Red Hat Summit
    © 2026 Red Hat

    Red Hat legal and privacy links

    • Privacy statement
    • Terms of use
    • All policies and guidelines
    • Digital accessibility

    Report a website issue