Skip to content
This repository was archived by the owner on Mar 21, 2026. It is now read-only.
Merged
41 changes: 23 additions & 18 deletions .github/workflows/reusable-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -125,32 +125,23 @@ jobs:
echo "OUTPUT_PATH=${OUTPUT_PATH}" >> $GITHUB_OUTPUT
sudo rm -rf ${OCI_DIR}

- name: Rechunk Image
id: rechunk-image
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
MATRIX_BASE_NAME: ${{ matrix.base_name }}
MATRIX_STREAM_NAME: ${{ matrix.stream_name }}
MATRIX_IMAGE_FLAVOR: ${{ matrix.image_flavor }}
run: |
sudo -E $(command -v just) rechunk "${MATRIX_BASE_NAME}" \
"${MATRIX_STREAM_NAME}" \
"${MATRIX_IMAGE_FLAVOR}" \
"1"
- name: debug
run: sudo podman images

- name: Load Image into Podman
id: load-rechunk
shell: bash
- name: Rechunk Image with rpm-ostree
id: rechunker
env:
MATRIX_BASE_NAME: ${{ matrix.base_name }}
DEFAULT_TAG: ${{ env.DEFAULT_TAG }}
MATRIX_IMAGE_FLAVOR: ${{ matrix.image_flavor }}
run: |
sudo -E $(command -v just) load-rechunk "${MATRIX_BASE_NAME}" \
sudo -E $(command -v just) rechunk "${MATRIX_BASE_NAME}" \
"${DEFAULT_TAG}" \
"${MATRIX_IMAGE_FLAVOR}"

- name: debug
run: sudo podman images

- name: Secureboot Check
id: secureboot
shell: bash
Expand Down Expand Up @@ -211,6 +202,14 @@ jobs:
with:
string: ${{ env.IMAGE_REGISTRY }}

# TODO: remove me when we have a new podman in 26.04 runners
# needed because old podman doesn't push layer annotations for
# the rpm-ostree rechunker at all
- name: install podman from brew
if: github.event_name != 'pull_request'
run: |
/home/linuxbrew/.linuxbrew/bin/brew install podman

- name: Login to GitHub Container Registry
if: github.event_name != 'pull_request'
run: |
Expand All @@ -231,9 +230,15 @@ jobs:
attempt_delay: 15000
command: |
set -euox pipefail
# HACK: push a second time so layer annotations are pushed
# TODO: remove me when https://github.com/containers/podman/issues/27796 fixed

for tag in ${ALIAS_TAGS}; do
sudo -E /home/linuxbrew/.linuxbrew/bin/podman push ${IMAGE_NAME}:${tag} ${LOWERCASE}/${IMAGE_NAME}:${tag}
done

for tag in ${ALIAS_TAGS}; do
sudo -E podman push ${IMAGE_NAME}:${tag} ${LOWERCASE}/${IMAGE_NAME}:${tag}
sudo -E /home/linuxbrew/.linuxbrew/bin/podman push ${IMAGE_NAME}:${tag} ${LOWERCASE}/${IMAGE_NAME}:${tag}
done

digest=$(skopeo inspect docker://${LOWERCASE}/${IMAGE_NAME}:${DEFAULT_TAG} --format '{{.Digest}}')
Expand Down
7 changes: 6 additions & 1 deletion Containerfile
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,15 @@ RUN --network=none \
--mount=type=bind,from=ctx,source=/,target=/ctx \
/ctx/build_files/shared/clean-stage.sh

# Set filesystem properties for rechunker
RUN --network=none \
--mount=type=bind,from=ctx,source=/,target=/ctx \
/ctx/build_files/base/20-layer-definitions.sh

# Sanity checks
RUN --network=none \
--mount=type=bind,from=ctx,source=/,target=/ctx \
/ctx/build_files/base/20-tests.sh
/ctx/build_files/base/21-tests.sh

RUN --network=none \
--mount=type=bind,from=ctx,source=/,target=/ctx \
Expand Down
172 changes: 29 additions & 143 deletions Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ build $image="aurora" $tag="latest" $flavor="main" rechunk="0" ghcr="0" pipeline
elif [[ "{{ rechunk }}" == "1" && "{{ ghcr }}" == "1" ]]; then
${SUDOIF} {{ just }} rechunk "${image}" "${tag}" "${flavor}" 1
elif [[ "{{ rechunk }}" == "1" ]]; then
${SUDOIF} {{ just }} rechunk "${image}" "${tag}" "${flavor}"
{{ just }} rechunk "${image}" "${tag}" "${flavor}"
fi

# Build Image and Rechunk
Expand Down Expand Up @@ -282,140 +282,49 @@ rechunk $image="aurora" $tag="latest" $flavor="main" ghcr="0" pipeline="0":

# Image Name
image_name=$({{ just }} image_name {{ image }} {{ tag }} {{ flavor }})
fedora_version=$({{ just }} fedora_version '{{ image }}' '{{ tag }}' '{{ flavor }}')

# Check if image is already built
ID=$(${PODMAN} images --filter reference=localhost/"${image_name}":"${tag}" --format "'{{ '{{.ID}}' }}'")
if [[ -z "$ID" ]]; then
{{ just }} build "${image}" "${tag}" "${flavor}"
fi

## Delete the rechunked image if present, rpm-ostree shits itself for whatever reason
## workaround for https://github.com/coreos/rpm-ostree/issues/5545
#if ${SUDOIF} ${PODMAN} image exists "localhost/${image_name}:${tag}-chunked"; then
# ${SUDOIF} ${PODMAN} image rm -f "localhost/${image_name}:${tag}-chunked"
#fi

# Load into Rootful Podman
ID=$(${SUDOIF} ${PODMAN} images --filter reference=localhost/"${image_name}":"${tag}" --format "'{{ '{{.ID}}' }}'")
if [[ -z "$ID" && ! ${PODMAN} =~ docker ]]; then
COPYTMP=$(mktemp -p "${PWD}" -d -t podman_scp.XXXXXXXXXX)
${SUDOIF} TMPDIR=${COPYTMP} ${PODMAN} image scp ${UID}@localhost::localhost/"${image_name}":"${tag}" root@localhost::localhost/"${image_name}":"${tag}"
rm -rf "${COPYTMP}"
ID_ROOT=$(${SUDOIF} ${PODMAN} images --filter reference=localhost/"${image_name}":"${tag}" --format "'{{ '{{.ID}}' }}'")
if [[ ! "${PODMAN}" =~ "docker" ]] && [[ -n "$ID" ]] && [[ "$ID" != "$ID_ROOT" ]]; then
${PODMAN} image scp $(whoami)@localhost::localhost/"${image_name}":"${tag}"
fi

# Prep Container
CREF=$(${SUDOIF} ${PODMAN} create localhost/"${image_name}":"${tag}" bash)
OLD_IMAGE=$(${SUDOIF} ${PODMAN} inspect $CREF | jq -r '.[].Image')
OUT_NAME="${image_name}_build"
MOUNT=$(${SUDOIF} ${PODMAN} mount "${CREF}")

# Fedora Version
fedora_version=$(${SUDOIF} ${PODMAN} inspect $CREF | jq -r '.[].Config.Labels["ostree.linux"]' | grep -oP 'fc\K[0-9]+')

# Label Version
VERSION=$(${SUDOIF} ${PODMAN} inspect $CREF | jq -r '.[].Config.Labels["org.opencontainers.image.version"]')

# Git SHA
SHA="dedbeef"
if [[ -z "$(git status -s)" ]]; then
SHA=$(git rev-parse HEAD)
fi

# Rest of Labels
LABELS="
io.artifacthub.package.deprecated=false
io.artifacthub.package.keywords=bootc,fedora,aurora,ublue,universal-blue
io.artifacthub.package.logo-url=https://avatars.githubusercontent.com/u/120078124?s=200&v=4
io.artifacthub.package.maintainers=[{\"name\": \"NiHaiden\", \"email\": \"me@nhaiden.io\"}]
io.artifacthub.package.readme-url=https://raw.githubusercontent.com/ublue-os/aurora/refs/heads/main/README.md
org.opencontainers.image.created=$(date -u +%Y\-%m\-%d\T%H\:%M\:%S\Z)
org.opencontainers.image.license=Apache-2.0
org.opencontainers.image.source=https://raw.githubusercontent.com/ublue-os/aurora/refs/heads/main/Containerfile
org.opencontainers.image.title=${image_name}
org.opencontainers.image.url=https://getaurora.dev
org.opencontainers.image.vendor={{ repo_organization }}
ostree.linux=$(${SUDOIF} ${PODMAN} inspect $CREF | jq -r '.[].Config.Labels["ostree.linux"]')
containers.bootc=1
"

# Cleanup Space during Github Action
if [[ "{{ ghcr }}" == "1" ]]; then
base_image_name=kinoite
if [[ "${tag}" =~ stable ]]; then
tag="stable-daily"
fi
ID=$(${SUDOIF} ${PODMAN} images --filter reference=ghcr.io/{{ repo_organization }}/"${base_image_name}":${fedora_version} --format "{{ '{{.ID}}' }}")
if [[ -n "$ID" ]]; then
${PODMAN} rmi "$ID"
fi
# In CI this will replace the unrechunked image
if [[ {{ ghcr }} == "1" ]]; then
CHUNKED_IMAGE="localhost/"${image_name}":"${tag}""
else
CHUNKED_IMAGE="localhost/"${image_name}":"${tag}"-chunked"
fi

# Rechunk Container
rechunker="{{ rechunker_image }}"

echo "::endgroup::"
echo "::group:: Prune"

# Run Rechunker's Prune
${SUDOIF} ${PODMAN} run --rm \
--pull=${PULL_POLICY} \
--security-opt label=disable \
--volume "$MOUNT":/var/tree \
--env TREE=/var/tree \
--user 0:0 \
"${rechunker}" \
/sources/rechunk/1_prune.sh

echo "::endgroup::"
echo "::group:: Create ostree tree"

# Run Rechunker's Create
${SUDOIF} ${PODMAN} run --rm \
--security-opt label=disable \
--volume "$MOUNT":/var/tree \
--volume "cache_ostree:/var/ostree" \
--env TREE=/var/tree \
--env REPO=/var/ostree/repo \
--env RESET_TIMESTAMP=1 \
--user 0:0 \
"${rechunker}" \
/sources/rechunk/2_create.sh

# Cleanup Temp Container Reference
${SUDOIF} ${PODMAN} unmount "$CREF"
${SUDOIF} ${PODMAN} rm "$CREF"
${SUDOIF} ${PODMAN} rmi "$OLD_IMAGE"

echo "::endgroup::"
echo "::group:: Rechunker"

# Run Rechunker
# 96 layers, conservative default, same what ci-test is using
# 499 is podman run limit
# not using base-imagectl, to avoid pulling 2GiB image for a wrapper script
${SUDOIF} ${PODMAN} run --rm \
--pull=${PULL_POLICY} \
--security-opt label=disable \
--volume "$PWD:/workspace" \
--volume "$PWD:/var/git" \
--volume cache_ostree:/var/ostree \
--env REPO=/var/ostree/repo \
--env PREV_REF=ghcr.io/ublue-os/"${image_name}":"${tag}" \
--env OUT_NAME="$OUT_NAME" \
--env LABELS="${LABELS}" \
--env "DESCRIPTION='The ultimate productivity workstation'" \
--env "VERSION=${VERSION}" \
--env VERSION_FN=/workspace/version.txt \
--env OUT_REF="oci:$OUT_NAME" \
--env GIT_DIR="/var/git" \
--env REVISION="$SHA" \
--user 0:0 \
"${rechunker}" \
/sources/rechunk/3_chunk.sh

# Fix Permissions of OCI
${SUDOIF} find ${OUT_NAME} -type d -exec chmod 0755 {} \; || true
${SUDOIF} find ${OUT_NAME}* -type f -exec chmod 0644 {} \; || true

if [[ "${UID}" -gt "0" ]]; then
${SUDOIF} chown "${UID}:${GROUPS}" -R "${PWD}"
elif [[ -n "${SUDO_UID:-}" ]]; then
chown "${SUDO_UID}":"${SUDO_GID}" -R "${PWD}"
fi

# Remove cache_ostree
${SUDOIF} ${PODMAN} volume rm cache_ostree
--privileged \
-v "/var/lib/containers:/var/lib/containers" \
--entrypoint /usr/bin/rpm-ostree \
"${base_image_org}/${base_image_name}:${fedora_version}" \
compose build-chunked-oci \
--max-layers 96 \
--format-version=2 \
--bootc \
--from "localhost/"${image_name}":"${tag}"" \
--output containers-storage:${CHUNKED_IMAGE}

echo "::endgroup::"

Expand All @@ -425,27 +334,6 @@ rechunk $image="aurora" $tag="latest" $flavor="main" ghcr="0" pipeline="0":
sudo -u "${SUDO_USER}" {{ just }} secureboot "${image}" "${tag}" "${flavor}"
fi

# Load OCI into Podman Store
[group('Image')]
load-rechunk image="aurora" tag="latest" flavor="main":
#!/usr/bin/bash
set -eou pipefail

# Validate
{{ just }} validate {{ image }} {{ tag }} {{ flavor }}

# Image Name
image_name=$({{ just }} image_name {{ image }} {{ tag }} {{ flavor }})

# Load Image
OUT_NAME="${image_name}_build"
IMAGE=$(${PODMAN} pull oci:"${PWD}"/"${OUT_NAME}")
${PODMAN} tag ${IMAGE} localhost/"${image_name}":{{ tag }}

# Cleanup
rm -rf "${OUT_NAME}*"
rm -f previous.manifest.json

# Run Container
[group('Image')]
run $image="aurora" $tag="latest" $flavor="main":
Expand Down Expand Up @@ -697,8 +585,6 @@ tag-images image_name="" default_tag="" tags="":
${PODMAN} tag $IMAGE {{ image_name }}:${tag}
done



# Show Images
${PODMAN} images

Expand Down
Loading
Loading