Skip to content

Commit d461932

Browse files
authored
Merge pull request #55 from tuna-os/copilot/update-bluefin-lts-alignment
Align with bluefin-lts: adopt common/brew OCI images, HWE support, and pre-built akmods
2 parents 4b04ee1 + 6b8d336 commit d461932

File tree

11 files changed

+287
-91
lines changed

11 files changed

+287
-91
lines changed

.github/workflows/promote-to-testing.yml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434
// For each combination, find the latest successful run of build-next.yml
3535
// Note: This is a simplification. In reality, build-next runs for all of them at once usually.
3636
// We need to find the latest successful run of the 'Build Next Image' workflow.
37-
37+
3838
const runs = await github.rest.actions.listWorkflowRuns({
3939
owner: context.repo.owner,
4040
repo: context.repo.repo,
@@ -45,38 +45,38 @@ jobs:
4545
4646
if (runs.data.workflow_runs.length === 0) {
4747
console.log("No successful runs found for build-next.yml");
48-
return;
48+
return;
4949
}
5050
5151
const latestRun = runs.data.workflow_runs[0];
5252
console.log(`Latest successful run: ${latestRun.id} (${latestRun.created_at})`);
5353
const sha = latestRun.head_sha;
5454
55-
// We assume that a successful run produced all variants/flavors.
55+
// We assume that a successful run produced all variants/flavors.
5656
// If we wanted to be more granular, we'd check artifacts or job status, but that's complex.
5757
// For now, we assume the latest successful workflow run produced valid 'next' tags for all.
5858
// However, 'next' is a moving tag. We should try to resolve 'next' to the specific digest from that run if possible,
5959
// or just trust that 'next' currently points to what we want if we haven't run it since.
60-
// A safer bet is to use the SHA of the commit to construct a tag if we tagged it that way,
60+
// A safer bet is to use the SHA of the commit to construct a tag if we tagged it that way,
6161
// but build-next.yml tags with 'next'.
62-
63-
// Let's proceed with assuming 'next' tag is what we want to promote,
64-
// but we verify it corresponds to the SHA of the latest run?
65-
// Actually, build-next.yml builds and pushes 'next'.
62+
63+
// Let's proceed with assuming 'next' tag is what we want to promote,
64+
// but we verify it corresponds to the SHA of the latest run?
65+
// Actually, build-next.yml builds and pushes 'next'.
6666
// So we will just pick up 'next'.
67-
67+
6868
for (const variant of variants) {
6969
for (const flavor of flavors) {
7070
// Skip invalid combinations if any (currently all seem valid based on build-next logic)
7171
// build-next logic:
7272
// yellowfin: base, dx, gdx
7373
// albacore: base, dx, gdx
74-
74+
7575
let imageName = variant;
7676
if (flavor !== 'base') {
7777
imageName = `${variant}-${flavor}`;
7878
}
79-
79+
8080
matrix.include.push({
8181
variant: variant,
8282
flavor: flavor,
@@ -85,7 +85,7 @@ jobs:
8585
});
8686
}
8787
}
88-
88+
8989
core.setOutput('matrix', JSON.stringify(matrix));
9090
9191
qa_and_promote:

.github/workflows/release-stable.yml

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -92,21 +92,20 @@ jobs:
9292
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
9393
aws-region: us-east-1
9494

95-
- name: Upload to S3
96-
run: |
97-
aws s3 cp output/qcow2/disk.qcow2 s3://${{ secrets.S3_BUCKET }}/tunaos-${{ github.ref_name }}.qcow2
98-
echo "IMAGE_URL=https://${{ secrets.S3_BUCKET }}.s3.amazonaws.com/tunaos-${{ github.ref_name }}.qcow2" >> $GITHUB_ENV
95+
- name: Upload to S3
96+
run: |
97+
aws s3 cp output/qcow2/disk.qcow2 s3://${{ secrets.S3_BUCKET }}/tunaos-${{ github.ref_name }}.qcow2
98+
echo "IMAGE_URL=https://${{ secrets.S3_BUCKET }}.s3.amazonaws.com/tunaos-${{ github.ref_name }}.qcow2" >> $GITHUB_ENV
9999
100-
- name: Promote to Stable
101-
if: success()
102-
run: |
103-
VERSION=${{ github.ref_name }}
104-
IMAGE_NAME="${{ steps.image.outputs.name }}"
105-
skopeo copy \
106-
docker://${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${IMAGE_NAME}:testing \
107-
docker://${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${IMAGE_NAME}:stable
108-
skopeo copy \
109-
docker://${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${IMAGE_NAME}:testing \
110-
docker://${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${IMAGE_NAME}:${VERSION}
100+
- name: Promote to Stable
101+
if: success()
102+
run: |
103+
VERSION=${{ github.ref_name }}
104+
IMAGE_NAME="${{ steps.image.outputs.name }}"
105+
skopeo copy \
106+
docker://${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${IMAGE_NAME}:testing \
107+
docker://${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${IMAGE_NAME}:stable
108+
skopeo copy \
109+
docker://${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${IMAGE_NAME}:testing \
110+
docker://${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${IMAGE_NAME}:${VERSION}
111111
112-

.github/workflows/reusable-build-image.yml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -255,16 +255,16 @@ jobs:
255255
# We'll try to pull it, if it fails, we skip diff.
256256
BASE_IMAGE="${IMAGE_REGISTRY}/${IMAGE_NAME}:next"
257257
TARGET_IMAGE="${IMAGE_REGISTRY}/${IMAGE_NAME}:${DEFAULT_TAG}-${SAFE_PLATFORM}"
258-
258+
259259
echo "Pulling base image $BASE_IMAGE..."
260260
if ! podman pull "$BASE_IMAGE"; then
261261
echo "Failed to pull $BASE_IMAGE. Skipping diff."
262262
exit 0
263263
fi
264-
264+
265265
echo "Running diff..."
266266
./scripts/diff-images.sh "$BASE_IMAGE" "$TARGET_IMAGE" "diff_report.md"
267-
267+
268268
# Add a header to the report
269269
sed -i '1s/^/## 🔍 Image Diff Report\n\n/' diff_report.md
270270
@@ -461,7 +461,7 @@ jobs:
461461
IMAGE_VARIANT: "${{ inputs.image-variant }}"
462462
run: |
463463
set -e
464-
464+
465465
# Determine default platforms based on variant (same logic as build.yml)
466466
case "${IMAGE_VARIANT}" in
467467
yellowfin)
@@ -484,28 +484,28 @@ jobs:
484484
DEFAULT_PLATFORMS="linux/arm64,linux/amd64"
485485
;;
486486
esac
487-
487+
488488
echo "Variant: ${IMAGE_VARIANT}"
489489
echo "Default platforms for this variant: ${DEFAULT_PLATFORMS}"
490-
490+
491491
# Parse expected platforms (use default platforms, not input platforms)
492492
expected_platforms=()
493493
IFS=',' read -r -a expected_platforms <<< "${DEFAULT_PLATFORMS}"
494-
494+
495495
# Check if all expected platforms have digests
496496
all_platforms_built="true"
497497
for platform_original in "${expected_platforms[@]}"; do
498498
platform_key="${platform_original//\//-}"
499499
digest="$(echo "${DIGESTS_JSON}" | jq -r --arg key "${platform_key}" '.[$key]')"
500-
500+
501501
if [ "$digest" == "null" ] || [ -z "$digest" ]; then
502502
echo "Missing platform: ${platform_original} (key: ${platform_key})"
503503
all_platforms_built="false"
504504
else
505505
echo "Found platform: ${platform_original} (key: ${platform_key})"
506506
fi
507507
done
508-
508+
509509
echo "All default platforms built: ${all_platforms_built}"
510510
echo "all_platforms_built=${all_platforms_built}" >> "${GITHUB_OUTPUT}"
511511
@@ -641,10 +641,10 @@ jobs:
641641
run: |
642642
set -ex
643643
SOURCE_IMAGE="${IMAGE_REGISTRY}/${IMAGE_NAME}:${DEFAULT_TAG}"
644-
644+
645645
# Always copy to sha-based tag
646646
skopeo copy --all "docker://${SOURCE_IMAGE}" "docker://${IMAGE_REGISTRY}/${IMAGE_NAME}:${REFS}"
647-
647+
648648
# Only tag as 'latest' if all default platforms for this variant were built
649649
if [ "${ALL_PLATFORMS_BUILT}" = "true" ]; then
650650
echo "All default platforms for this variant built successfully - tagging as latest"
@@ -654,4 +654,4 @@ jobs:
654654
else
655655
echo "Not all default platforms for this variant built - skipping latest tag"
656656
echo "tag=${IMAGE_REGISTRY}/${IMAGE_NAME}:${REFS}" >> $GITHUB_OUTPUT
657-
fi
657+
fi

Containerfile

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
11
ARG BASE_IMAGE
2+
ARG ENABLE_HWE="${ENABLE_HWE:-0}"
3+
ARG ENABLE_GDX="${ENABLE_GDX:-0}"
4+
ARG AKMODS_VERSION="${AKMODS_VERSION:-centos-10}"
5+
ARG COMMON_IMAGE_REF
6+
ARG BREW_IMAGE_REF
7+
8+
# Upstream mounts akmods-zfs and akmods-nvidia-open; select their tag via AKMODS_VERSION
9+
FROM ghcr.io/ublue-os/akmods-zfs:${AKMODS_VERSION} AS akmods_zfs
10+
FROM ghcr.io/ublue-os/akmods-nvidia-open:${AKMODS_VERSION} AS akmods_nvidia_open
11+
FROM ${COMMON_IMAGE_REF} AS common
12+
FROM ${BREW_IMAGE_REF} AS brew
213

314
FROM scratch as context
415
COPY system_files /files
16+
COPY --from=brew /system_files /files
17+
COPY --from=common /system_files/shared /files
518
COPY system_files_overrides /overrides
619
COPY build_scripts /build_scripts
720

@@ -11,54 +24,85 @@ ARG IMAGE_NAME
1124
ARG IMAGE_VENDOR
1225
ARG SHA_HEAD_SHORT="${SHA_HEAD_SHORT:-deadbeef}"
1326
ARG BASE_IMAGE
27+
ARG ENABLE_HWE="${ENABLE_HWE:-0}"
28+
ARG ENABLE_GDX="${ENABLE_GDX:-0}"
1429
ENV BASE_IMAGE=${BASE_IMAGE}
1530
ENV IMAGE_NAME=${IMAGE_NAME}
1631
ENV IMAGE_VENDOR=${IMAGE_VENDOR}
1732
ENV SHA_HEAD_SHORT=${SHA_HEAD_SHORT}
33+
ENV ENABLE_HWE=${ENABLE_HWE}
34+
ENV ENABLE_GDX=${ENABLE_GDX}
1835

1936
# We pass in BASE_IMAGE as an env var to set it in os-release so that we know what we are building on
2037
RUN --mount=type=tmpfs,dst=/opt --mount=type=tmpfs,dst=/tmp \
2138
--mount=type=tmpfs,dst=/var --mount=type=tmpfs,dst=/boot \
39+
--mount=type=bind,from=akmods_zfs,src=/rpms,dst=/tmp/akmods-zfs-rpms \
40+
--mount=type=bind,from=akmods_zfs,src=/kernel-rpms,dst=/tmp/kernel-rpms \
41+
--mount=type=bind,from=akmods_nvidia_open,src=/rpms,dst=/tmp/akmods-nvidia-open-rpms \
2242
--mount=type=bind,from=context,source=/,target=/run/context \
2343
/run/context/build_scripts/copy-files.sh
2444

2545
RUN --mount=type=tmpfs,dst=/opt --mount=type=tmpfs,dst=/tmp \
2646
--mount=type=tmpfs,dst=/var --mount=type=tmpfs,dst=/boot \
47+
--mount=type=bind,from=akmods_zfs,src=/rpms,dst=/tmp/akmods-zfs-rpms \
48+
--mount=type=bind,from=akmods_zfs,src=/kernel-rpms,dst=/tmp/kernel-rpms \
49+
--mount=type=bind,from=akmods_nvidia_open,src=/rpms,dst=/tmp/akmods-nvidia-open-rpms \
2750
--mount=type=bind,from=context,source=/,target=/run/context \
2851
/run/context/build_scripts/00-workarounds.sh
2952

3053
RUN --mount=type=tmpfs,dst=/opt --mount=type=tmpfs,dst=/tmp \
3154
--mount=type=tmpfs,dst=/var --mount=type=tmpfs,dst=/boot \
55+
--mount=type=bind,from=akmods_zfs,src=/rpms,dst=/tmp/akmods-zfs-rpms \
56+
--mount=type=bind,from=akmods_zfs,src=/kernel-rpms,dst=/tmp/kernel-rpms \
57+
--mount=type=bind,from=akmods_nvidia_open,src=/rpms,dst=/tmp/akmods-nvidia-open-rpms \
3258
--mount=type=bind,from=context,source=/,target=/run/context \
3359
/run/context/build_scripts/10-base-packages.sh
3460

3561
RUN --mount=type=tmpfs,dst=/opt --mount=type=tmpfs,dst=/tmp \
3662
--mount=type=tmpfs,dst=/var --mount=type=tmpfs,dst=/boot \
63+
--mount=type=bind,from=akmods_zfs,src=/rpms,dst=/tmp/akmods-zfs-rpms \
64+
--mount=type=bind,from=akmods_zfs,src=/kernel-rpms,dst=/tmp/kernel-rpms \
65+
--mount=type=bind,from=akmods_nvidia_open,src=/rpms,dst=/tmp/akmods-nvidia-open-rpms \
3766
--mount=type=bind,from=context,source=/,target=/run/context \
3867
/run/context/build_scripts/20-packages.sh
3968

4069
RUN --mount=type=tmpfs,dst=/opt --mount=type=tmpfs,dst=/tmp \
4170
--mount=type=tmpfs,dst=/var --mount=type=tmpfs,dst=/boot \
71+
--mount=type=bind,from=akmods_zfs,src=/rpms,dst=/tmp/akmods-zfs-rpms \
72+
--mount=type=bind,from=akmods_zfs,src=/kernel-rpms,dst=/tmp/kernel-rpms \
73+
--mount=type=bind,from=akmods_nvidia_open,src=/rpms,dst=/tmp/akmods-nvidia-open-rpms \
4274
--mount=type=bind,from=context,source=/,target=/run/context \
4375
/run/context/build_scripts/26-packages-post.sh
4476

4577
RUN --mount=type=tmpfs,dst=/opt --mount=type=tmpfs,dst=/tmp \
4678
--mount=type=tmpfs,dst=/var --mount=type=tmpfs,dst=/boot \
79+
--mount=type=bind,from=akmods_zfs,src=/rpms,dst=/tmp/akmods-zfs-rpms \
80+
--mount=type=bind,from=akmods_zfs,src=/kernel-rpms,dst=/tmp/kernel-rpms \
81+
--mount=type=bind,from=akmods_nvidia_open,src=/rpms,dst=/tmp/akmods-nvidia-open-rpms \
4782
--mount=type=bind,from=context,source=/,target=/run/context \
4883
/run/context/build_scripts/40-services.sh
4984

5085
RUN --mount=type=tmpfs,dst=/opt --mount=type=tmpfs,dst=/tmp \
5186
--mount=type=tmpfs,dst=/var --mount=type=tmpfs,dst=/boot \
87+
--mount=type=bind,from=akmods_zfs,src=/rpms,dst=/tmp/akmods-zfs-rpms \
88+
--mount=type=bind,from=akmods_zfs,src=/kernel-rpms,dst=/tmp/kernel-rpms \
89+
--mount=type=bind,from=akmods_nvidia_open,src=/rpms,dst=/tmp/akmods-nvidia-open-rpms \
5290
--mount=type=bind,from=context,source=/,target=/run/context \
5391
/run/context/build_scripts/90-image-info.sh
5492

5593
RUN --mount=type=tmpfs,dst=/opt --mount=type=tmpfs,dst=/tmp \
5694
--mount=type=tmpfs,dst=/var --mount=type=tmpfs,dst=/boot \
95+
--mount=type=bind,from=akmods_zfs,src=/rpms,dst=/tmp/akmods-zfs-rpms \
96+
--mount=type=bind,from=akmods_zfs,src=/kernel-rpms,dst=/tmp/kernel-rpms \
97+
--mount=type=bind,from=akmods_nvidia_open,src=/rpms,dst=/tmp/akmods-nvidia-open-rpms \
5798
--mount=type=bind,from=context,source=/,target=/run/context \
5899
/run/context/build_scripts/arch-customizations.sh
59100

60101
RUN --mount=type=tmpfs,dst=/opt --mount=type=tmpfs,dst=/tmp \
61102
--mount=type=tmpfs,dst=/var --mount=type=tmpfs,dst=/boot \
103+
--mount=type=bind,from=akmods_zfs,src=/rpms,dst=/tmp/akmods-zfs-rpms \
104+
--mount=type=bind,from=akmods_zfs,src=/kernel-rpms,dst=/tmp/kernel-rpms \
105+
--mount=type=bind,from=akmods_nvidia_open,src=/rpms,dst=/tmp/akmods-nvidia-open-rpms \
62106
--mount=type=bind,from=context,source=/,target=/run/context \
63107
/run/context/build_scripts/cleanup.sh
64108

Containerfile.dx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,21 @@ ARG BASE_IMAGE
22
ARG IMAGE_NAME
33
ARG IMAGE_VENDOR
44
ARG SHA_HEAD_SHORT
5+
ARG ENABLE_HWE="${ENABLE_HWE:-0}"
6+
ARG ENABLE_GDX="${ENABLE_GDX:-0}"
7+
ARG AKMODS_VERSION="${AKMODS_VERSION:-centos-10}"
8+
ARG COMMON_IMAGE_REF
9+
ARG BREW_IMAGE_REF
10+
11+
FROM ghcr.io/ublue-os/akmods-zfs:${AKMODS_VERSION} AS akmods_zfs
12+
FROM ghcr.io/ublue-os/akmods-nvidia-open:${AKMODS_VERSION} AS akmods_nvidia_open
13+
FROM ${COMMON_IMAGE_REF} AS common
14+
FROM ${BREW_IMAGE_REF} AS brew
515

616
FROM scratch as context
717
COPY system_files /files
18+
COPY --from=brew /system_files /files
19+
COPY --from=common /system_files/shared /files
820
COPY system_files_overrides /overrides
921
COPY build_scripts /build_scripts
1022

@@ -17,6 +29,9 @@ RUN \
1729
--mount=type=tmpfs,dst=/tmp \
1830
--mount=type=tmpfs,dst=/var \
1931
--mount=type=tmpfs,dst=/boot \
32+
--mount=type=bind,from=akmods_zfs,src=/rpms,dst=/tmp/akmods-zfs-rpms \
33+
--mount=type=bind,from=akmods_zfs,src=/kernel-rpms,dst=/tmp/kernel-rpms \
34+
--mount=type=bind,from=akmods_nvidia_open,src=/rpms,dst=/tmp/akmods-nvidia-open-rpms \
2035
--mount=type=bind,from=context,source=/,target=/run/context \
2136
/run/context/build_scripts/DX.sh;
2237

Containerfile.gdx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,21 @@ ARG BASE_IMAGE
22
ARG IMAGE_NAME
33
ARG IMAGE_VENDOR
44
ARG SHA_HEAD_SHORT
5+
ARG ENABLE_HWE="${ENABLE_HWE:-0}"
6+
ARG ENABLE_GDX="${ENABLE_GDX:-0}"
7+
ARG AKMODS_VERSION="${AKMODS_VERSION:-centos-10}"
8+
ARG COMMON_IMAGE_REF
9+
ARG BREW_IMAGE_REF
10+
11+
FROM ghcr.io/ublue-os/akmods-zfs:${AKMODS_VERSION} AS akmods_zfs
12+
FROM ghcr.io/ublue-os/akmods-nvidia-open:${AKMODS_VERSION} AS akmods_nvidia_open
13+
FROM ${COMMON_IMAGE_REF} AS common
14+
FROM ${BREW_IMAGE_REF} AS brew
515

616
FROM scratch as context
717
COPY system_files /files
18+
COPY --from=brew /system_files /files
19+
COPY --from=common /system_files/shared /files
820
COPY system_files_overrides /overrides
921
COPY build_scripts /build_scripts
1022

@@ -17,6 +29,9 @@ RUN \
1729
--mount=type=tmpfs,dst=/tmp \
1830
--mount=type=tmpfs,dst=/var \
1931
--mount=type=tmpfs,dst=/boot \
32+
--mount=type=bind,from=akmods_zfs,src=/rpms,dst=/tmp/akmods-zfs-rpms \
33+
--mount=type=bind,from=akmods_zfs,src=/kernel-rpms,dst=/tmp/kernel-rpms \
34+
--mount=type=bind,from=akmods_nvidia_open,src=/rpms,dst=/tmp/akmods-nvidia-open-rpms \
2035
--mount=type=bind,from=context,source=/,target=/run/context \
2136
/run/context/build_scripts/GDX.sh
2237

0 commit comments

Comments
 (0)