From 299ec6eb56d050b15a702ec61766abc54b1090c3 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 10 Sep 2026 13:34:36 +0000 Subject: [PATCH 01/78] reduce log level for settings.ini check --- src/cpp/fs/ArgumentParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/fs/ArgumentParser.cpp b/src/cpp/fs/ArgumentParser.cpp index 1dce936e87..f0f10cbf39 100644 --- a/src/cpp/fs/ArgumentParser.cpp +++ b/src/cpp/fs/ArgumentParser.cpp @@ -318,7 +318,7 @@ ArgumentParser::ArgumentParser( } // FIX: doing this here means we always see the settings if we haven't adjusted log level // if there is a settings.ini in the output directory then use that - logging::note("Checking for {:s}", output_directory + "settings.ini"); + logging::debug("Checking for {:s}", output_directory + "settings.ini"); Settings::setRoot(binary_directory_, output_directory); logging::check_fatal(nullptr != PARSER, "Parser initialized multiple times"); PARSER = this; From c9a8be7a86dcf619caa639d198dc4b0da95736eb Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 10 Sep 2026 15:14:22 +0000 Subject: [PATCH 02/78] don't write to .env if already correct --- cmake/Version.cmake | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cmake/Version.cmake b/cmake/Version.cmake index 0c063a43e9..ee0d12801d 100644 --- a/cmake/Version.cmake +++ b/cmake/Version.cmake @@ -10,9 +10,15 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git") execute_process(COMMAND git describe --tags --abbrev=0 --match "v*" OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE VERSION_TAG) set(VERSION ${VERSION_TAG}) list(TRANSFORM VERSION REPLACE "v(.*)" "\\1") - message("VERSION_TAG=${VERSION}") + set(VERSION_OUT "VERSION=${VERSION}") + message("${VERSION_OUT}") # always generate from git tag initially - file(WRITE ${FILE_ENV} "VERSION=${VERSION}\n") + file(READ ${FILE_ENV} ENV_VALUE) + if ("${ENV_VALUE}" STREQUAL "${VERSION_OUT}\n") + message("VERSION is already set properly") + else() + file(WRITE ${FILE_ENV} "${VERSION_OUT}\n") + endif() endif() # read from config From e94ba7055064a8666086ab80e755986a0ce95c9f Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Tue, 15 Sep 2026 17:07:58 +0000 Subject: [PATCH 03/78] amd64 only for testing --- .github/workflows/build-docker-image.yml | 25 +++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 91aae9c0d8..32c1f4de25 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -10,17 +10,12 @@ on: image: required: true type: string - cache-from: - required: false - type: string - cache-to: - required: false - type: string suffix: required: false type: string env: + CONTAINER_REGISTRY: ghcr.io BUILDX_NO_DEFAULT_ATTESTATIONS: 1 jobs: @@ -37,7 +32,7 @@ jobs: # no point in more than base image supports # ignore 32-bit - 386, arm/v5, arm/v7 # arm64 == arm64/v8 - platform: [amd64, arm64, ppc64le, riscv64, s390x] + platform: [amd64] steps: - uses: actions/checkout@v6 with: @@ -49,6 +44,9 @@ jobs: run: | platform=${{ matrix.platform }} echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV + echo "GITHUB_REPOSITORY_LOWER=${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV + + - run: echo "CONTAINER_TARGET=${CONTAINER_REGISTRY}/${GITHUB_REPOSITORY_LOWER}/cache:${PLATFORM_PAIR}" >> $GITHUB_ENV - name: Docker meta id: meta @@ -56,10 +54,10 @@ jobs: with: images: ${{ inputs.registry-image }} - - name: Login to GHCR + - name: Login to container registry uses: docker/login-action@v4 with: - registry: ghcr.io + registry: ${{ env.CONTAINER_REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} @@ -81,6 +79,11 @@ jobs: tags: ${{ inputs.registry-image }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true # ${{ github.repository }} isn't lowercase so manually specify + cache-from: | + type=registry,ref=${{ env.CONTAINER_TARGET }} + cache-to: | + type=registry,mode=max,ref=${{ env.CONTAINER_TARGET }} + cache-from: ${{ inputs.cache-from }}${{ case ( '' != inputs.cache-from, env.PLATFORM_PAIR, '' ) }} cache-to: ${{ inputs.cache-to }}${{ case ( '' != inputs.cache-to, env.PLATFORM_PAIR, '' ) }} @@ -118,10 +121,10 @@ jobs: pattern: digests-${{ inputs.image }}-* merge-multiple: true - - name: Login to GHCR + - name: Login to container registry uses: docker/login-action@v4 with: - registry: ghcr.io + registry: ${{ env.CONTAINER_REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} From e9792485431907c0aaea2594e418440abe48fcb9 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Tue, 15 Sep 2026 18:11:19 +0000 Subject: [PATCH 04/78] make docker use repo to determine registry to use --- .github/workflows/build-docker-image.yml | 60 ++++++++++++------------ .github/workflows/build-docker.yml | 12 +---- 2 files changed, 31 insertions(+), 41 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 32c1f4de25..7a21160ddf 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -3,13 +3,6 @@ name: build-docker-image on: workflow_call: inputs: - # everything goes in same package but suffix applies to tags - registry-image: - required: true - type: string - image: - required: true - type: string suffix: required: false type: string @@ -45,14 +38,24 @@ jobs: platform=${{ matrix.platform }} echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV echo "GITHUB_REPOSITORY_LOWER=${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV + echo "PUBLISH=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 1, 0) }}" >> $GITHUB_ENV + - - run: echo "CONTAINER_TARGET=${CONTAINER_REGISTRY}/${GITHUB_REPOSITORY_LOWER}/cache:${PLATFORM_PAIR}" >> $GITHUB_ENV + - run: | + echo "REGISTRY=${CONTAINER_REGISTRY}/${GITHUB_REPOSITORY_LOWER}" >> $GITHUB_ENV + echo "SUFFIX_ONLY=${{ env.SUFFIX }}" >> $GITHUB_ENV + echo "SUFFIX=${{ case ( '' != env.SUFFIX, '-', '' ) }}${{ env.SUFFIX }}" >> $GITHUB_ENV + + - run: | + echo "TARGET_CACHE=${REGISTRY}/cache" >> $GITHUB_ENV + echo "TARGET=${REGISTRY}/${{ case( env.PUBLISH, 'firestarr', 'cache' ) }}" >> $GITHUB_ENV + echo "IMAGE=firestarr${{ env.SUFFIX }}" >> $GITHUB_ENV - name: Docker meta id: meta uses: docker/metadata-action@v6 with: - images: ${{ inputs.registry-image }} + images: ${{ env.TARGET }} - name: Login to container registry uses: docker/login-action@v4 @@ -76,16 +79,13 @@ jobs: target: ${{ inputs.image }} platforms: linux/${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} - tags: ${{ inputs.registry-image }} + tags: ${{ env.TARGET }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true # ${{ github.repository }} isn't lowercase so manually specify cache-from: | - type=registry,ref=${{ env.CONTAINER_TARGET }} + type=registry,ref=${{ env.TARGET_CACHE }} cache-to: | - type=registry,mode=max,ref=${{ env.CONTAINER_TARGET }} - - cache-from: ${{ inputs.cache-from }}${{ case ( '' != inputs.cache-from, env.PLATFORM_PAIR, '' ) }} - cache-to: ${{ inputs.cache-to }}${{ case ( '' != inputs.cache-to, env.PLATFORM_PAIR, '' ) }} + type=registry,mode=max,ref=${{ env.TARGET_CACHE }} - name: Export digest run: | @@ -135,30 +135,30 @@ jobs: id: meta uses: docker/metadata-action@v6 with: - images: ${{ inputs.registry-image }} + images: ${{ env.TARGET }} flavor: | - latest=${{ case ( '' == inputs.suffix, 'auto', 'false' ) }} + latest=${{ case ( '' == env.SUFFIX && startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} prefix= - suffix=${{ case ( '' == inputs.suffix, '', '-' ) }}${{ inputs.suffix }} + suffix=${{ env.SUFFIX }} tags: | type=ref,event=pr - type=ref,prefix=,suffix=,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' == inputs.suffix }} - type=ref,prefix=,suffix=-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' == inputs.suffix }} - type=ref,prefix=,suffix=-${{ inputs.suffix }},event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' != inputs.suffix }} - type=ref,prefix=,suffix=-${{ inputs.suffix }}-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' != inputs.suffix }} - type=semver,pattern={{version}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' == inputs.suffix }} - type=semver,pattern={{version}},prefix=,suffix=-${{ inputs.suffix }},enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != inputs.suffix }} - type=semver,pattern={{major}}.{{minor}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' == inputs.suffix }} - type=semver,pattern={{major}}.{{minor}},prefix=,suffix=-${{ inputs.suffix }},enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != inputs.suffix }} - type=raw,value=${{ inputs.suffix }},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != inputs.suffix }} - type=raw,value=${{ inputs.suffix }}-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != inputs.suffix }} + type=ref,prefix=,suffix=,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} + type=ref,prefix=,suffix=-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} + type=ref,prefix=,suffix=${{ env.SUFFIX }},event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} + type=ref,prefix=,suffix=${{ env.SUFFIX }}-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} + type=semver,pattern={{version}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} + type=semver,pattern={{version}},prefix=,suffix=${{ env.SUFFIX }},enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} + type=semver,pattern={{major}}.{{minor}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} + type=semver,pattern={{major}}.{{minor}},prefix=,suffix=${{ env.SUFFIX }},enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} + type=raw,value=${{ env.SUFFIX_ONLY }},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} + type=raw,value=${{ env.SUFFIX_ONLY }}-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - name: Create manifest list and push working-directory: ${{ runner.temp }}/digests run: | docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ inputs.registry-image }}@sha256:%s ' *) + $(printf '${{ env.TARGET }}@sha256:%s ' *) - name: Inspect image run: | - docker buildx imagetools inspect ${{ inputs.registry-image }}:${{ steps.meta.outputs.version }} + docker buildx imagetools inspect ${{ env.TARGET }}:${{ steps.meta.outputs.version }} diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 30b3a3f93a..03cf07ba49 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -15,19 +15,9 @@ on: jobs: build-docker-normal: uses: ./.github/workflows/build-docker-image.yml - with: - # use cache instead of main package if just testing build - registry-image: ghcr.io/cwfmf/firestarr-cpp/${{ case ( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - image: firestarr - cache-from: "type=registry,ref=ghcr.io/cwfmf/firestarr-cpp/cache:" - cache-to: "type=registry,mode=max,ref=ghcr.io/cwfmf/firestarr-cpp/cache:" build-docker-minimal: - if: ${{ startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name) }} needs: [build-docker-normal] uses: ./.github/workflows/build-docker-image.yml with: - registry-image: ghcr.io/cwfmf/firestarr-cpp/firestarr - image: firestarr-minimal - cache-from: "type=registry,ref=ghcr.io/cwfmf/firestarr-cpp/cache:" - suffix: "minimal" + suffix: minimal From 5f212d91cbb40891d3dc29fc497ba23e660938a3 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Tue, 15 Sep 2026 14:17:59 -0400 Subject: [PATCH 05/78] change env.PUBLISH to use bool --- .github/workflows/build-docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 7a21160ddf..6bc00b0733 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -38,7 +38,7 @@ jobs: platform=${{ matrix.platform }} echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV echo "GITHUB_REPOSITORY_LOWER=${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV - echo "PUBLISH=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 1, 0) }}" >> $GITHUB_ENV + echo "PUBLISH=${{ startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name) }}" >> $GITHUB_ENV - run: | From b8623631cb042b77069853e5ff9942ad876e975d Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Tue, 15 Sep 2026 14:38:30 -0400 Subject: [PATCH 06/78] remove PUBLISH --- .github/workflows/build-docker-image.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 6bc00b0733..07d23a5dc6 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -38,7 +38,7 @@ jobs: platform=${{ matrix.platform }} echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV echo "GITHUB_REPOSITORY_LOWER=${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV - echo "PUBLISH=${{ startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name) }}" >> $GITHUB_ENV + echo "TARGET_ROOT=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }}" >> $GITHUB_ENV - run: | @@ -48,7 +48,7 @@ jobs: - run: | echo "TARGET_CACHE=${REGISTRY}/cache" >> $GITHUB_ENV - echo "TARGET=${REGISTRY}/${{ case( env.PUBLISH, 'firestarr', 'cache' ) }}" >> $GITHUB_ENV + echo "TARGET=${REGISTRY}/${TARGET_ROOT}" >> $GITHUB_ENV echo "IMAGE=firestarr${{ env.SUFFIX }}" >> $GITHUB_ENV - name: Docker meta From 726d65cfaaa805df28077c5db0b054250b6107b8 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Tue, 15 Sep 2026 15:02:13 -0400 Subject: [PATCH 07/78] fix environment variables --- .github/workflows/build-docker-image.yml | 34 +++++++++++++++--------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 07d23a5dc6..65272ab03b 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -33,23 +33,18 @@ jobs: fetch-tags: true submodules: true - - name: Prepare + - name: Prepare environment run: | platform=${{ matrix.platform }} + suffix=${{ case ( '' != inputs.suffix, '-', '' ) }}${{ inputs.suffix }} + registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV - echo "GITHUB_REPOSITORY_LOWER=${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV echo "TARGET_ROOT=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }}" >> $GITHUB_ENV - - - - run: | - echo "REGISTRY=${CONTAINER_REGISTRY}/${GITHUB_REPOSITORY_LOWER}" >> $GITHUB_ENV - echo "SUFFIX_ONLY=${{ env.SUFFIX }}" >> $GITHUB_ENV - echo "SUFFIX=${{ case ( '' != env.SUFFIX, '-', '' ) }}${{ env.SUFFIX }}" >> $GITHUB_ENV - - - run: | - echo "TARGET_CACHE=${REGISTRY}/cache" >> $GITHUB_ENV - echo "TARGET=${REGISTRY}/${TARGET_ROOT}" >> $GITHUB_ENV - echo "IMAGE=firestarr${{ env.SUFFIX }}" >> $GITHUB_ENV + echo "SUFFIX_ONLY=${{ inputs.suffix }}" >> $GITHUB_ENV + echo "SUFFIX=${suffix}" >> $GITHUB_ENV + echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV + echo "TARGET=${registry}/${TARGET_ROOT}" >> $GITHUB_ENV + echo "IMAGE=firestarr${suffix}" >> $GITHUB_ENV - name: Docker meta id: meta @@ -114,6 +109,19 @@ jobs: fetch-tags: true submodules: true + - name: Prepare environment + run: | + platform=${{ matrix.platform }} + suffix=${{ case ( '' != inputs.suffix, '-', '' ) }}${{ inputs.suffix }} + registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} + echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV + echo "TARGET_ROOT=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }}" >> $GITHUB_ENV + echo "SUFFIX_ONLY=${{ inputs.suffix }}" >> $GITHUB_ENV + echo "SUFFIX=${suffix}" >> $GITHUB_ENV + echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV + echo "TARGET=${registry}/${TARGET_ROOT}" >> $GITHUB_ENV + echo "IMAGE=firestarr${suffix}" >> $GITHUB_ENV + - name: Download digests uses: actions/download-artifact@v8 with: From 4ee2c3c772e879092405da72b2279fe056620180 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Tue, 15 Sep 2026 15:08:20 -0400 Subject: [PATCH 08/78] fix TARGET --- .github/workflows/build-docker-image.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 65272ab03b..38dc34feab 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -38,12 +38,12 @@ jobs: platform=${{ matrix.platform }} suffix=${{ case ( '' != inputs.suffix, '-', '' ) }}${{ inputs.suffix }} registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} + image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV - echo "TARGET_ROOT=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }}" >> $GITHUB_ENV echo "SUFFIX_ONLY=${{ inputs.suffix }}" >> $GITHUB_ENV echo "SUFFIX=${suffix}" >> $GITHUB_ENV echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV - echo "TARGET=${registry}/${TARGET_ROOT}" >> $GITHUB_ENV + echo "TARGET=${registry}/${image}" >> $GITHUB_ENV echo "IMAGE=firestarr${suffix}" >> $GITHUB_ENV - name: Docker meta @@ -114,12 +114,12 @@ jobs: platform=${{ matrix.platform }} suffix=${{ case ( '' != inputs.suffix, '-', '' ) }}${{ inputs.suffix }} registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} + image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV - echo "TARGET_ROOT=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }}" >> $GITHUB_ENV echo "SUFFIX_ONLY=${{ inputs.suffix }}" >> $GITHUB_ENV echo "SUFFIX=${suffix}" >> $GITHUB_ENV echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV - echo "TARGET=${registry}/${TARGET_ROOT}" >> $GITHUB_ENV + echo "TARGET=${registry}/${image}" >> $GITHUB_ENV echo "IMAGE=firestarr${suffix}" >> $GITHUB_ENV - name: Download digests From a78e41f95a62f247f74beb72de304f7682d2f7a5 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Tue, 15 Sep 2026 15:15:01 -0400 Subject: [PATCH 09/78] refactor Dockerfile --- .docker/Dockerfile | 80 +++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/.docker/Dockerfile b/.docker/Dockerfile index cbd4b4da32..8cacd25651 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -4,6 +4,30 @@ ARG BASE_DISTROLESS=gcr.io/distroless/static-debian13 # armv/v5, 386, riscv64, i686 ARG BASE_SLIM=debian:trixie-slim +FROM --platform=linux/amd64 ${BASE_DISTROLESS} AS distroless-amd64 + +# seems like we can just delete everything and then copy distroless into any platform? +FROM ${BASE_SLIM} AS base-minimal +WORKDIR /appl/firestarr +RUN mkdir -p /appl/firestarr/grid +# HACK: mkdir doesn't exist when copied into scratch but COPY should work +WORKDIR / +RUN rm -rf $(ls -1 / | grep -vE "appl|dev|etc|proc|sys") +COPY --from=distroless-amd64 / / + +# make a layer with scratch to clear out old layers +FROM ${BASE_SLIM} AS base-cleaned +WORKDIR /appl/firestarr +RUN mkdir -p /appl/firestarr/grid +RUN apt-get clean \ + && rm -rf \ + /tmp/* \ + /usr/share/doc/* \ + /var/cache/* \ + /var/lib/apt/lists/* \ + /var/lib/dpkg/* \ + /var/tmp/* + # basic image to start from FROM debian:trixie-slim AS gcc-cmake ARG TARGETARCH @@ -41,16 +65,17 @@ RUN git clone -v https://github.com/microsoft/vcpkg.git \ # install packages so they stay if nothing changes with vcpkg*.json FROM vcpkg-bootstrap AS vcpkg-installed WORKDIR /appl/firestarr -COPY ./vcpkg.json . -RUN vcpkg/vcpkg install +RUN --mount=type=bind,source=./vcpkg.json,target=./vcpkg.json \ + vcpkg/vcpkg install # build and test FROM vcpkg-installed AS firestarr-build WORKDIR /appl/firestarr -# HACK: copy .env here since cmake needs to write to it in github workflow -COPY .env ./.env +# NOTE: .env needs to be rw here since cmake needs to write to it in github workflow # mount instead of copy to minimize layers -RUN --mount=type=bind,source=./cmake,target=./cmake \ +RUN --mount=type=bind,source=./vcpkg.json,target=./vcpkg.json \ + --mount=type=bind,source=./.env,target=./.env \ + --mount=type=bind,source=./cmake,target=./cmake \ --mount=type=bind,source=./CMakeLists.txt,target=./CMakeLists.txt \ --mount=type=bind,source=./CMakePresets.json,target=./CMakePresets.json \ --mount=type=bind,source=./.clang-format,target=./.clang-format \ @@ -68,47 +93,22 @@ RUN --mount=type=bind,source=./cmake,target=./cmake \ && cmake --build --parallel --preset Release \ && ctest --preset Release -FROM --platform=linux/amd64 ${BASE_DISTROLESS} AS distroless-amd64 - -# seems like we can just delete everything and then copy distroless into any platform? -FROM ${BASE_SLIM} AS firestarr-base-minimal -# HACK: mkdir doesn't exist when copied into scratch but COPY should work -RUN mkdir -p /appl/firestarr/grid -WORKDIR / -RUN rm -rf $(ls -1 / | grep -vE "appl|dev|etc|proc|sys") -COPY --from=distroless-amd64 / / - # make a layer with scratch to clear out old layers FROM scratch AS firestarr-minimal -COPY --from=firestarr-base-minimal / / +COPY --from=base-minimal / / WORKDIR /appl/firestarr -COPY ./fuel.lut /appl/firestarr/ -COPY ./settings.ini /appl/firestarr/ -COPY --from=firestarr-build /appl/firestarr/firestarr /appl/firestarr/ -COPY --from=firestarr-build /appl/firestarr/proj.db /appl/firestarr/proj.db +COPY --from=firestarr-build /appl/firestarr/firestarr . +COPY --from=firestarr-build /appl/firestarr/proj.db ./proj.db +COPY ./fuel.lut . +COPY ./settings.ini . ENTRYPOINT [ "/appl/firestarr/firestarr" ] -# make a layer with scratch to clear out old layers -FROM ${BASE_SLIM} AS base-cleaned -RUN apt-get clean \ - && rm -rf \ - /tmp/* \ - /usr/share/doc/* \ - /var/cache/* \ - /var/lib/apt/lists/* \ - /var/lib/dpkg/* \ - /var/tmp/* - -# use --from=firestarr-minimal to create a dependency so cache hopefully includes both -FROM base-cleaned AS firestarr-base-cleaned -COPY ./fuel.lut /appl/firestarr/ -COPY ./settings.ini /appl/firestarr/ -COPY --from=firestarr-minimal /appl/firestarr/firestarr /appl/firestarr/ -COPY --from=firestarr-minimal /appl/firestarr/proj.db /appl/firestarr/proj.db - # derive final image from base so updates to binary are small layers FROM scratch AS firestarr -COPY --from=firestarr-base-cleaned / / -RUN mkdir -p /appl/firestarr/grid +COPY --from=base-cleaned / / WORKDIR /appl/firestarr +COPY --from=firestarr-minimal /appl/firestarr/firestarr . +COPY --from=firestarr-minimal /appl/firestarr/proj.db ./proj.db +COPY ./fuel.lut . +COPY ./settings.ini . ENTRYPOINT [ "/appl/firestarr/firestarr" ] From b6dbc19f042e53b1230220483578e7220e4581ce Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Tue, 15 Sep 2026 15:19:23 -0400 Subject: [PATCH 10/78] use single step --- .github/workflows/build-docker-image.yml | 96 +++++------------------- 1 file changed, 17 insertions(+), 79 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 38dc34feab..b22c956248 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -46,11 +46,28 @@ jobs: echo "TARGET=${registry}/${image}" >> $GITHUB_ENV echo "IMAGE=firestarr${suffix}" >> $GITHUB_ENV + - name: Docker meta id: meta uses: docker/metadata-action@v6 with: images: ${{ env.TARGET }} + flavor: | + latest=${{ case ( '' == env.SUFFIX && startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} + prefix= + suffix=${{ env.SUFFIX }} + tags: | + type=ref,event=pr + type=ref,prefix=,suffix=,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} + type=ref,prefix=,suffix=-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} + type=ref,prefix=,suffix=${{ env.SUFFIX }},event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} + type=ref,prefix=,suffix=${{ env.SUFFIX }}-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} + type=semver,pattern={{version}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} + type=semver,pattern={{version}},prefix=,suffix=${{ env.SUFFIX }},enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} + type=semver,pattern={{major}}.{{minor}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} + type=semver,pattern={{major}}.{{minor}},prefix=,suffix=${{ env.SUFFIX }},enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} + type=raw,value=${{ env.SUFFIX_ONLY }},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} + type=raw,value=${{ env.SUFFIX_ONLY }}-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - name: Login to container registry uses: docker/login-action@v4 @@ -82,85 +99,6 @@ jobs: cache-to: | type=registry,mode=max,ref=${{ env.TARGET_CACHE }} - - name: Export digest - run: | - mkdir -p ${{ runner.temp }}/digests - digest="${{ steps.build.outputs.digest }}" - touch "${{ runner.temp }}/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@v7 - with: - name: digests-${{ inputs.image }}-${{ env.PLATFORM_PAIR }} - path: ${{ runner.temp }}/digests/* - if-no-files-found: error - retention-days: 1 - - merge: - runs-on: ubuntu-24.04 - permissions: - contents: read - packages: write - needs: [ build-docker-image ] - steps: - - uses: actions/checkout@v6 - with: - fetch-depth: 0 - fetch-tags: true - submodules: true - - - name: Prepare environment - run: | - platform=${{ matrix.platform }} - suffix=${{ case ( '' != inputs.suffix, '-', '' ) }}${{ inputs.suffix }} - registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} - image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV - echo "SUFFIX_ONLY=${{ inputs.suffix }}" >> $GITHUB_ENV - echo "SUFFIX=${suffix}" >> $GITHUB_ENV - echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV - echo "TARGET=${registry}/${image}" >> $GITHUB_ENV - echo "IMAGE=firestarr${suffix}" >> $GITHUB_ENV - - - name: Download digests - uses: actions/download-artifact@v8 - with: - path: ${{ runner.temp }}/digests - pattern: digests-${{ inputs.image }}-* - merge-multiple: true - - - name: Login to container registry - uses: docker/login-action@v4 - with: - registry: ${{ env.CONTAINER_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v4 - - - name: Docker meta - id: meta - uses: docker/metadata-action@v6 - with: - images: ${{ env.TARGET }} - flavor: | - latest=${{ case ( '' == env.SUFFIX && startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} - prefix= - suffix=${{ env.SUFFIX }} - tags: | - type=ref,event=pr - type=ref,prefix=,suffix=,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} - type=ref,prefix=,suffix=-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} - type=ref,prefix=,suffix=${{ env.SUFFIX }},event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - type=ref,prefix=,suffix=${{ env.SUFFIX }}-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - type=semver,pattern={{version}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} - type=semver,pattern={{version}},prefix=,suffix=${{ env.SUFFIX }},enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - type=semver,pattern={{major}}.{{minor}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} - type=semver,pattern={{major}}.{{minor}},prefix=,suffix=${{ env.SUFFIX }},enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - type=raw,value=${{ env.SUFFIX_ONLY }},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - type=raw,value=${{ env.SUFFIX_ONLY }}-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - - name: Create manifest list and push working-directory: ${{ runner.temp }}/digests run: | From caf8dd6ca00f77e0a1b7ea4e2cfbb3868870b2ef Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Tue, 15 Sep 2026 15:29:07 -0400 Subject: [PATCH 11/78] mount .env rw --- .docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 8cacd25651..ad277f4d63 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -74,7 +74,7 @@ WORKDIR /appl/firestarr # NOTE: .env needs to be rw here since cmake needs to write to it in github workflow # mount instead of copy to minimize layers RUN --mount=type=bind,source=./vcpkg.json,target=./vcpkg.json \ - --mount=type=bind,source=./.env,target=./.env \ + --mount=type=bind,rw=true,source=./.env,target=./.env \ --mount=type=bind,source=./cmake,target=./cmake \ --mount=type=bind,source=./CMakeLists.txt,target=./CMakeLists.txt \ --mount=type=bind,source=./CMakePresets.json,target=./CMakePresets.json \ From eec0327e0368aae2cbfb4b5616fe865b00726099 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Tue, 15 Sep 2026 15:40:42 -0400 Subject: [PATCH 12/78] export digest --- .github/workflows/build-docker-image.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index b22c956248..1b10d5deb4 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -99,6 +99,12 @@ jobs: cache-to: | type=registry,mode=max,ref=${{ env.TARGET_CACHE }} + - name: Export digest + run: | + mkdir -p ${{ runner.temp }}/digests + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + - name: Create manifest list and push working-directory: ${{ runner.temp }}/digests run: | From e131b02a354395716a66222ec3230c35c1cf9108 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Tue, 15 Sep 2026 15:49:05 -0400 Subject: [PATCH 13/78] use platforms: --- .github/workflows/build-docker-image.yml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 1b10d5deb4..4f8a53899a 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -19,13 +19,6 @@ jobs: packages: write attestations: write id-token: write - strategy: - fail-fast: false - matrix: - # no point in more than base image supports - # ignore 32-bit - 386, arm/v5, arm/v7 - # arm64 == arm64/v8 - platform: [amd64] steps: - uses: actions/checkout@v6 with: @@ -35,11 +28,9 @@ jobs: - name: Prepare environment run: | - platform=${{ matrix.platform }} suffix=${{ case ( '' != inputs.suffix, '-', '' ) }}${{ inputs.suffix }} registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV echo "SUFFIX_ONLY=${{ inputs.suffix }}" >> $GITHUB_ENV echo "SUFFIX=${suffix}" >> $GITHUB_ENV echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV @@ -89,7 +80,10 @@ jobs: context: . file: .docker/Dockerfile target: ${{ inputs.image }} - platforms: linux/${{ matrix.platform }} + # no point in more than base image supports + # ignore 32-bit - 386, arm/v5, arm/v7 + # arm64 == arm64/v8 + platforms: linux/amd64,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x labels: ${{ steps.meta.outputs.labels }} tags: ${{ env.TARGET }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true From ebf92be2ac9e39139da48e7063ec0de2a13447b8 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Tue, 15 Sep 2026 16:40:56 -0400 Subject: [PATCH 14/78] always build docker --- .github/workflows/build-docker-image.yml | 110 --------------------- .github/workflows/build-docker.yml | 119 ++++++++++++++++++++--- 2 files changed, 107 insertions(+), 122 deletions(-) delete mode 100644 .github/workflows/build-docker-image.yml diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml deleted file mode 100644 index 4f8a53899a..0000000000 --- a/.github/workflows/build-docker-image.yml +++ /dev/null @@ -1,110 +0,0 @@ -name: build-docker-image - -on: - workflow_call: - inputs: - suffix: - required: false - type: string - -env: - CONTAINER_REGISTRY: ghcr.io - BUILDX_NO_DEFAULT_ATTESTATIONS: 1 - -jobs: - build-docker-image: - runs-on: ubuntu-24.04 - permissions: - contents: read - packages: write - attestations: write - id-token: write - steps: - - uses: actions/checkout@v6 - with: - fetch-depth: 0 - fetch-tags: true - submodules: true - - - name: Prepare environment - run: | - suffix=${{ case ( '' != inputs.suffix, '-', '' ) }}${{ inputs.suffix }} - registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} - image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "SUFFIX_ONLY=${{ inputs.suffix }}" >> $GITHUB_ENV - echo "SUFFIX=${suffix}" >> $GITHUB_ENV - echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV - echo "TARGET=${registry}/${image}" >> $GITHUB_ENV - echo "IMAGE=firestarr${suffix}" >> $GITHUB_ENV - - - - name: Docker meta - id: meta - uses: docker/metadata-action@v6 - with: - images: ${{ env.TARGET }} - flavor: | - latest=${{ case ( '' == env.SUFFIX && startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} - prefix= - suffix=${{ env.SUFFIX }} - tags: | - type=ref,event=pr - type=ref,prefix=,suffix=,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} - type=ref,prefix=,suffix=-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} - type=ref,prefix=,suffix=${{ env.SUFFIX }},event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - type=ref,prefix=,suffix=${{ env.SUFFIX }}-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - type=semver,pattern={{version}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} - type=semver,pattern={{version}},prefix=,suffix=${{ env.SUFFIX }},enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - type=semver,pattern={{major}}.{{minor}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' == env.SUFFIX }} - type=semver,pattern={{major}}.{{minor}},prefix=,suffix=${{ env.SUFFIX }},enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - type=raw,value=${{ env.SUFFIX_ONLY }},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - type=raw,value=${{ env.SUFFIX_ONLY }}-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') && '' != env.SUFFIX }} - - - name: Login to container registry - uses: docker/login-action@v4 - with: - registry: ${{ env.CONTAINER_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v4 - - - name: Build and push by digest - id: build - uses: docker/build-push-action@v7 - with: - context: . - file: .docker/Dockerfile - target: ${{ inputs.image }} - # no point in more than base image supports - # ignore 32-bit - 386, arm/v5, arm/v7 - # arm64 == arm64/v8 - platforms: linux/amd64,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x - labels: ${{ steps.meta.outputs.labels }} - tags: ${{ env.TARGET }} - outputs: type=image,push-by-digest=true,name-canonical=true,push=true - # ${{ github.repository }} isn't lowercase so manually specify - cache-from: | - type=registry,ref=${{ env.TARGET_CACHE }} - cache-to: | - type=registry,mode=max,ref=${{ env.TARGET_CACHE }} - - - name: Export digest - run: | - mkdir -p ${{ runner.temp }}/digests - digest="${{ steps.build.outputs.digest }}" - touch "${{ runner.temp }}/digests/${digest#sha256:}" - - - name: Create manifest list and push - working-directory: ${{ runner.temp }}/digests - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.TARGET }}@sha256:%s ' *) - - - name: Inspect image - run: | - docker buildx imagetools inspect ${{ env.TARGET }}:${{ steps.meta.outputs.version }} diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 03cf07ba49..5aea44e695 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -2,22 +2,117 @@ name: build-docker on: push: - branches: - - main - - dev - - unstable paths-ignore: - '.github/workflows/cmake-test.yml' - '.github/workflows/docker-cleanup.yml' workflow_dispatch: +env: + CONTAINER_REGISTRY: ghcr.io + BUILDX_NO_DEFAULT_ATTESTATIONS: 1 + # no point in more than base image supports + # ignore 32-bit - 386, arm/v5, arm/v7 + # arm64 == arm64/v8 + PLATFORMS: linux/amd64,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x + jobs: - build-docker-normal: - uses: ./.github/workflows/build-docker-image.yml - - build-docker-minimal: - needs: [build-docker-normal] - uses: ./.github/workflows/build-docker-image.yml - with: - suffix: minimal + build-docker-image: + runs-on: ubuntu-24.04 + permissions: + contents: read + packages: write + attestations: write + id-token: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + fetch-tags: true + submodules: true + + - name: Prepare environment + run: | + registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} + image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} + echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV + echo "TARGET=${registry}/${image}" >> $GITHUB_ENV + + - name: Docker meta + id: meta + uses: docker/metadata-action@v6 + with: + images: | + firestarr + flavor: | + latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} + prefix= + suffix= + tags: | + type=ref,event=pr + type=ref,prefix=,suffix=,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + type=ref,prefix=,suffix=-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{version}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{major}}.{{minor}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + + - name: Docker meta + id: meta-minimal + uses: docker/metadata-action@v6 + with: + images: | + firestarr-minimal + flavor: | + latest=false + prefix= + suffix=-minimal + tags: | + type=ref,event=pr + type=ref,prefix=,suffix=-minimal,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + type=ref,prefix=,suffix=-minimal-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{version}},prefix=,suffix=-minimal,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{major}}.{{minor}},prefix=,suffix=-minimal,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=raw,value=minimal,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=raw,value=minimal-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + + - name: Login to container registry + uses: docker/login-action@v4 + with: + registry: ${{ env.CONTAINER_REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4 + + - name: Build and push by digest + id: build-normal + uses: docker/build-push-action@v7 + with: + context: . + file: .docker/Dockerfile + platforms: ${{ env.PLATFORMS }} + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: | + type=registry,ref=${{ env.TARGET_CACHE }} + cache-to: | + type=registry,mode=max,ref=${{ env.TARGET_CACHE }} + + - name: Build and push by digest + id: build-minimal + uses: docker/build-push-action@v7 + with: + context: . + file: .docker/Dockerfile + platforms: ${{ env.PLATFORMS }} + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-minimal.outputs.tags }} + labels: ${{ steps.meta-minimal.outputs.labels }} + cache-from: | + type=registry,ref=${{ env.TARGET_CACHE }} + cache-to: | + type=registry,mode=max,ref=${{ env.TARGET_CACHE }} From 89177af1159c101e7125e61b87ceff523f70a607 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Wed, 16 Sep 2026 05:56:38 -0400 Subject: [PATCH 15/78] use matrix for platforms --- .github/workflows/build-docker.yml | 177 ++++++++++++++++++++++++----- 1 file changed, 146 insertions(+), 31 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 5aea44e695..82eb0e940b 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -11,12 +11,9 @@ on: env: CONTAINER_REGISTRY: ghcr.io BUILDX_NO_DEFAULT_ATTESTATIONS: 1 - # no point in more than base image supports - # ignore 32-bit - 386, arm/v5, arm/v7 - # arm64 == arm64/v8 - PLATFORMS: linux/amd64,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x jobs: + # split this way so hopefully the cache is there between normal and minimal build-docker-image: runs-on: ubuntu-24.04 permissions: @@ -24,6 +21,14 @@ jobs: packages: write attestations: write id-token: write + strategy: + fail-fast: false + matrix: + # no point in more than base image supports + # ignore 32-bit - 386, arm/v5, arm/v7 + # arm64 == arm64/v8 + # platform: [amd64, arm64, ppc64le, riscv64, s390x] + platform: [amd64] steps: - uses: actions/checkout@v6 with: @@ -33,27 +38,19 @@ jobs: - name: Prepare environment run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV echo "TARGET=${registry}/${image}" >> $GITHUB_ENV - name: Docker meta - id: meta + id: meta-normal uses: docker/metadata-action@v6 with: images: | firestarr - flavor: | - latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} - prefix= - suffix= - tags: | - type=ref,event=pr - type=ref,prefix=,suffix=,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} - type=ref,prefix=,suffix=-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} - type=semver,pattern={{version}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - type=semver,pattern={{major}}.{{minor}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - name: Docker meta id: meta-minimal @@ -61,18 +58,6 @@ jobs: with: images: | firestarr-minimal - flavor: | - latest=false - prefix= - suffix=-minimal - tags: | - type=ref,event=pr - type=ref,prefix=,suffix=-minimal,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} - type=ref,prefix=,suffix=-minimal-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} - type=semver,pattern={{version}},prefix=,suffix=-minimal,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - type=semver,pattern={{major}}.{{minor}},prefix=,suffix=-minimal,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - type=raw,value=minimal,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - type=raw,value=minimal-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - name: Login to container registry uses: docker/login-action@v4 @@ -93,22 +78,36 @@ jobs: with: context: . file: .docker/Dockerfile - platforms: ${{ env.PLATFORMS }} + platforms: linux/${{ matrix.platform }} push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + tags: ${{ steps.meta-normal.outputs.tags }} + labels: ${{ steps.meta-normal.outputs.labels }} cache-from: | type=registry,ref=${{ env.TARGET_CACHE }} cache-to: | type=registry,mode=max,ref=${{ env.TARGET_CACHE }} + - name: Export digest + run: | + mkdir -p ${{ runner.temp }}/digests-normal + digest="${{ steps.build-normal.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v7 + with: + name: digests-firestarr-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests-normal/* + if-no-files-found: error + retention-days: 1 + - name: Build and push by digest id: build-minimal uses: docker/build-push-action@v7 with: context: . file: .docker/Dockerfile - platforms: ${{ env.PLATFORMS }} + platforms: linux/${{ matrix.platform }} push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta-minimal.outputs.tags }} labels: ${{ steps.meta-minimal.outputs.labels }} @@ -116,3 +115,119 @@ jobs: type=registry,ref=${{ env.TARGET_CACHE }} cache-to: | type=registry,mode=max,ref=${{ env.TARGET_CACHE }} + + - name: Export digest + run: | + mkdir -p ${{ runner.temp }}/digests-minimal + digest="${{ steps.build-minimal.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v7 + with: + name: digests-firestarr-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests-minimal/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-24.04 + permissions: + contents: read + packages: write + needs: [ build-docker-image ] + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + fetch-tags: true + submodules: true + + - name: Prepare environment + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV + registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} + image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} + echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV + echo "TARGET=${registry}/${image}" >> $GITHUB_ENV + + - name: Download digests + uses: actions/download-artifact@v8 + with: + path: ${{ runner.temp }}/digests-normal + pattern: digests-firestarr-* + merge-multiple: true + + - name: Download digests + uses: actions/download-artifact@v8 + with: + path: ${{ runner.temp }}/digests-minimal + pattern: digests-firestarr-minimal-* + merge-multiple: true + + - name: Login to GHCR + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4 + + - name: Docker meta + id: metameta-normal + uses: docker/metadata-action@v6 + with: + images: | + firestarr + flavor: | + latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} + prefix= + suffix= + tags: | + type=ref,event=pr + type=ref,prefix=,suffix=,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + type=ref,prefix=,suffix=-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{version}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{major}}.{{minor}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests-normal + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.TARGET }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.TARGET }}:${{ steps.meta-normal.outputs.version }} + + - name: Docker meta + id: meta-minimal + uses: docker/metadata-action@v6 + with: + images: | + firestarr-minimal + flavor: | + latest=false + prefix= + suffix=-minimal + tags: | + type=ref,event=pr + type=ref,prefix=,suffix=-minimal,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + type=ref,prefix=,suffix=-minimal-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{version}},prefix=,suffix=-minimal,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{major}}.{{minor}},prefix=,suffix=-minimal,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=raw,value=minimal,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=raw,value=minimal-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests-minimal + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.TARGET }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.TARGET }}:${{ steps.meta-minimal.outputs.version }} From bf022fa464c5b6280638939154057efe755e69c7 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Wed, 16 Sep 2026 06:06:21 -0400 Subject: [PATCH 16/78] fix target --- .github/workflows/build-docker.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 82eb0e940b..5d5283d9fa 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -49,15 +49,13 @@ jobs: id: meta-normal uses: docker/metadata-action@v6 with: - images: | - firestarr + images: ${TARGET} - name: Docker meta id: meta-minimal uses: docker/metadata-action@v6 with: - images: | - firestarr-minimal + images: ${TARGET} - name: Login to container registry uses: docker/login-action@v4 @@ -78,10 +76,12 @@ jobs: with: context: . file: .docker/Dockerfile + target: firestarr platforms: linux/${{ matrix.platform }} - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-normal.outputs.tags }} labels: ${{ steps.meta-normal.outputs.labels }} + tags: ${{ steps.meta-normal.outputs.tags }} + push: ${{ github.event_name != 'pull_request' }} + outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | type=registry,ref=${{ env.TARGET_CACHE }} cache-to: | @@ -107,10 +107,12 @@ jobs: with: context: . file: .docker/Dockerfile + target: firestarr-minimal platforms: linux/${{ matrix.platform }} push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta-minimal.outputs.tags }} labels: ${{ steps.meta-minimal.outputs.labels }} + outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | type=registry,ref=${{ env.TARGET_CACHE }} cache-to: | From 12aa2b0c502d47528ae55540e46cd568722e8851 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Wed, 16 Sep 2026 06:09:57 -0400 Subject: [PATCH 17/78] fix target again --- .github/workflows/build-docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 5d5283d9fa..d486cee431 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -79,7 +79,7 @@ jobs: target: firestarr platforms: linux/${{ matrix.platform }} labels: ${{ steps.meta-normal.outputs.labels }} - tags: ${{ steps.meta-normal.outputs.tags }} + tags: ${{ env.TARGET }} push: ${{ github.event_name != 'pull_request' }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | @@ -110,7 +110,7 @@ jobs: target: firestarr-minimal platforms: linux/${{ matrix.platform }} push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-minimal.outputs.tags }} + tags: ${{ env.TARGET }} labels: ${{ steps.meta-minimal.outputs.labels }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | From 1119bc6f32f971df934b18af4a050541224de440 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Wed, 16 Sep 2026 06:15:04 -0400 Subject: [PATCH 18/78] fix digest --- .github/workflows/build-docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index d486cee431..b286778b8d 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -91,7 +91,7 @@ jobs: run: | mkdir -p ${{ runner.temp }}/digests-normal digest="${{ steps.build-normal.outputs.digest }}" - touch "${{ runner.temp }}/digests/${digest#sha256:}" + touch "${{ runner.temp }}/digests-normal/${digest#sha256:}" - name: Upload digest uses: actions/upload-artifact@v7 @@ -122,7 +122,7 @@ jobs: run: | mkdir -p ${{ runner.temp }}/digests-minimal digest="${{ steps.build-minimal.outputs.digest }}" - touch "${{ runner.temp }}/digests/${digest#sha256:}" + touch "${{ runner.temp }}/digests-minimal/${digest#sha256:}" - name: Upload digest uses: actions/upload-artifact@v7 From bff74b9e59b3d212edda936d6df67b4c2d2255c0 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Wed, 16 Sep 2026 06:22:55 -0400 Subject: [PATCH 19/78] fix artifact name --- .github/workflows/build-docker.yml | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index b286778b8d..328de8e98b 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -44,6 +44,7 @@ jobs: image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV echo "TARGET=${registry}/${image}" >> $GITHUB_ENV + echo "IMAGE=firestarr" >> $GITHUB_ENV - name: Docker meta id: meta-normal @@ -76,7 +77,7 @@ jobs: with: context: . file: .docker/Dockerfile - target: firestarr + target: ${{ env.IMAGE }} platforms: linux/${{ matrix.platform }} labels: ${{ steps.meta-normal.outputs.labels }} tags: ${{ env.TARGET }} @@ -89,25 +90,29 @@ jobs: - name: Export digest run: | - mkdir -p ${{ runner.temp }}/digests-normal + mkdir -p ${{ runner.temp }}/digests-${{ env.IMAGE }} digest="${{ steps.build-normal.outputs.digest }}" - touch "${{ runner.temp }}/digests-normal/${digest#sha256:}" + touch "${{ runner.temp }}/digests-${{ env.IMAGE }}/${digest#sha256:}" - name: Upload digest uses: actions/upload-artifact@v7 with: name: digests-firestarr-${{ env.PLATFORM_PAIR }} - path: ${{ runner.temp }}/digests-normal/* + path: ${{ runner.temp }}/digests-${{ env.IMAGE }}/* if-no-files-found: error retention-days: 1 + - name: Change target image + run: | + echo "IMAGE=firestarr-minimal" >> $GITHUB_ENV + - name: Build and push by digest id: build-minimal uses: docker/build-push-action@v7 with: context: . file: .docker/Dockerfile - target: firestarr-minimal + target: ${{ env.IMAGE }} platforms: linux/${{ matrix.platform }} push: ${{ github.event_name != 'pull_request' }} tags: ${{ env.TARGET }} @@ -120,15 +125,15 @@ jobs: - name: Export digest run: | - mkdir -p ${{ runner.temp }}/digests-minimal + mkdir -p ${{ runner.temp }}/digests-${{ env.IMAGE }} digest="${{ steps.build-minimal.outputs.digest }}" - touch "${{ runner.temp }}/digests-minimal/${digest#sha256:}" + touch "${{ runner.temp }}/digests-${{ env.IMAGE }}/${digest#sha256:}" - name: Upload digest uses: actions/upload-artifact@v7 with: - name: digests-firestarr-${{ env.PLATFORM_PAIR }} - path: ${{ runner.temp }}/digests-minimal/* + name: digests-${{ env.IMAGE }}-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests-${{ env.IMAGE }}/* if-no-files-found: error retention-days: 1 @@ -157,7 +162,7 @@ jobs: - name: Download digests uses: actions/download-artifact@v8 with: - path: ${{ runner.temp }}/digests-normal + path: ${{ runner.temp }}/digests-${{ env.IMAGE }} pattern: digests-firestarr-* merge-multiple: true From 0cf7be3dae8a8f863e4ed24d7d0343364672424d Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Wed, 16 Sep 2026 06:32:49 -0400 Subject: [PATCH 20/78] group and label steps --- .github/workflows/build-docker.yml | 91 ++++++++++++++++-------------- 1 file changed, 48 insertions(+), 43 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 328de8e98b..ce4789af0d 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -46,18 +46,6 @@ jobs: echo "TARGET=${registry}/${image}" >> $GITHUB_ENV echo "IMAGE=firestarr" >> $GITHUB_ENV - - name: Docker meta - id: meta-normal - uses: docker/metadata-action@v6 - with: - images: ${TARGET} - - - name: Docker meta - id: meta-minimal - uses: docker/metadata-action@v6 - with: - images: ${TARGET} - - name: Login to container registry uses: docker/login-action@v4 with: @@ -71,7 +59,13 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - - name: Build and push by digest + - name: ${{ env.IMAGE }} - Docker meta + id: meta-normal + uses: docker/metadata-action@v6 + with: + images: ${TARGET} + + - name: ${{ env.IMAGE }} - Build and push by digest id: build-normal uses: docker/build-push-action@v7 with: @@ -88,13 +82,13 @@ jobs: cache-to: | type=registry,mode=max,ref=${{ env.TARGET_CACHE }} - - name: Export digest + - name: ${{ env.IMAGE }} - Export digest run: | mkdir -p ${{ runner.temp }}/digests-${{ env.IMAGE }} digest="${{ steps.build-normal.outputs.digest }}" touch "${{ runner.temp }}/digests-${{ env.IMAGE }}/${digest#sha256:}" - - name: Upload digest + - name: ${{ env.IMAGE }} - Upload digest uses: actions/upload-artifact@v7 with: name: digests-firestarr-${{ env.PLATFORM_PAIR }} @@ -106,7 +100,13 @@ jobs: run: | echo "IMAGE=firestarr-minimal" >> $GITHUB_ENV - - name: Build and push by digest + - name: ${{ env.IMAGE }} - Docker meta + id: meta-minimal + uses: docker/metadata-action@v6 + with: + images: ${TARGET} + + - name: ${{ env.IMAGE }} - Build and push by digest id: build-minimal uses: docker/build-push-action@v7 with: @@ -123,13 +123,13 @@ jobs: cache-to: | type=registry,mode=max,ref=${{ env.TARGET_CACHE }} - - name: Export digest + - name: ${{ env.IMAGE }} - Export digest run: | mkdir -p ${{ runner.temp }}/digests-${{ env.IMAGE }} digest="${{ steps.build-minimal.outputs.digest }}" touch "${{ runner.temp }}/digests-${{ env.IMAGE }}/${digest#sha256:}" - - name: Upload digest + - name: ${{ env.IMAGE }} - Upload digest uses: actions/upload-artifact@v7 with: name: digests-${{ env.IMAGE }}-${{ env.PLATFORM_PAIR }} @@ -158,20 +158,7 @@ jobs: image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV echo "TARGET=${registry}/${image}" >> $GITHUB_ENV - - - name: Download digests - uses: actions/download-artifact@v8 - with: - path: ${{ runner.temp }}/digests-${{ env.IMAGE }} - pattern: digests-firestarr-* - merge-multiple: true - - - name: Download digests - uses: actions/download-artifact@v8 - with: - path: ${{ runner.temp }}/digests-minimal - pattern: digests-firestarr-minimal-* - merge-multiple: true + echo "IMAGE=firestarr" >> $GITHUB_ENV - name: Login to GHCR uses: docker/login-action@v4 @@ -183,12 +170,19 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - - name: Docker meta - id: metameta-normal + - name: ${{ env.IMAGE }} - Download digests + uses: actions/download-artifact@v8 + with: + path: ${{ runner.temp }}/digests-${{ env.IMAGE }} + pattern: digests-firestarr-* + merge-multiple: true + + - name: ${{ env.IMAGE }} - Docker meta + id: meta-normal uses: docker/metadata-action@v6 with: images: | - firestarr + ${{ env.IMAGE }} flavor: | latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} prefix= @@ -200,22 +194,26 @@ jobs: type=semver,pattern={{version}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} type=semver,pattern={{major}}.{{minor}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - - name: Create manifest list and push - working-directory: ${{ runner.temp }}/digests-normal + - name: ${{ env.IMAGE }} - Create manifest list and push + working-directory: ${{ runner.temp }}/digests-${{ env.IMAGE }} run: | docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ $(printf '${{ env.TARGET }}@sha256:%s ' *) - - name: Inspect image + - name: ${{ env.IMAGE }} - Inspect image run: | docker buildx imagetools inspect ${{ env.TARGET }}:${{ steps.meta-normal.outputs.version }} - - name: Docker meta + - name: Change target image + run: | + echo "IMAGE=firestarr-minimal" >> $GITHUB_ENV + + - name: ${{ env.IMAGE }} - Docker meta id: meta-minimal uses: docker/metadata-action@v6 with: images: | - firestarr-minimal + ${{ env.IMAGE }} flavor: | latest=false prefix= @@ -229,12 +227,19 @@ jobs: type=raw,value=minimal,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} type=raw,value=minimal-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - - name: Create manifest list and push - working-directory: ${{ runner.temp }}/digests-minimal + - name: ${{ env.IMAGE }} - Download digests + uses: actions/download-artifact@v8 + with: + path: ${{ runner.temp }}/digests-${{ env.IMAGE }} + pattern: digests-${{ env.IMAGE }}-* + merge-multiple: true + + - name: ${{ env.IMAGE }} - Create manifest list and push + working-directory: ${{ runner.temp }}/digests-${{ env.IMAGE }} run: | docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ $(printf '${{ env.TARGET }}@sha256:%s ' *) - - name: Inspect image + - name: ${{ env.IMAGE }} - Inspect image run: | docker buildx imagetools inspect ${{ env.TARGET }}:${{ steps.meta-minimal.outputs.version }} From a2121fb4e093cc870b40a9531ee13069a1d4d264 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Wed, 16 Sep 2026 06:39:20 -0400 Subject: [PATCH 21/78] fix merge --- .github/workflows/build-docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index ce4789af0d..0c5501e250 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -182,7 +182,7 @@ jobs: uses: docker/metadata-action@v6 with: images: | - ${{ env.IMAGE }} + ${{ env.TARGET }} flavor: | latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} prefix= @@ -213,7 +213,7 @@ jobs: uses: docker/metadata-action@v6 with: images: | - ${{ env.IMAGE }} + ${{ env.TARGET }} flavor: | latest=false prefix= From f6ca0a863d6bf715e015e5d346513ac750ebaf60 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Wed, 16 Sep 2026 07:18:14 -0400 Subject: [PATCH 22/78] build multiple platforms --- .github/workflows/build-docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 0c5501e250..11ef3d0ced 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -27,8 +27,8 @@ jobs: # no point in more than base image supports # ignore 32-bit - 386, arm/v5, arm/v7 # arm64 == arm64/v8 - # platform: [amd64, arm64, ppc64le, riscv64, s390x] - platform: [amd64] + platform: [amd64, arm64, ppc64le, riscv64, s390x] + # platform: [amd64] steps: - uses: actions/checkout@v6 with: From 8d35ec7d3b9bea0c2a011f582e6a6850bc7c7eb4 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 05:28:56 -0400 Subject: [PATCH 23/78] use platform cache --- .github/workflows/build-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 11ef3d0ced..5434dcf32e 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -42,7 +42,7 @@ jobs: echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV + echo "TARGET_CACHE=${registry}/cache:${platform//\//}" >> $GITHUB_ENV echo "TARGET=${registry}/${image}" >> $GITHUB_ENV echo "IMAGE=firestarr" >> $GITHUB_ENV From 00d29f42cdbf348f51431a975615aa204a988d81 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 06:21:02 -0400 Subject: [PATCH 24/78] split merge into two jobs --- .github/workflows/build-docker.yml | 47 ++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 5434dcf32e..de4e2adcbf 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -137,7 +137,7 @@ jobs: if-no-files-found: error retention-days: 1 - merge: + merge-normal: runs-on: ubuntu-24.04 permissions: contents: read @@ -204,10 +204,46 @@ jobs: run: | docker buildx imagetools inspect ${{ env.TARGET }}:${{ steps.meta-normal.outputs.version }} - - name: Change target image + merge-minimal: + runs-on: ubuntu-24.04 + permissions: + contents: read + packages: write + needs: [ build-docker-image ] + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + fetch-tags: true + submodules: true + + - name: Prepare environment run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV + registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} + image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} + echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV + echo "TARGET=${registry}/${image}" >> $GITHUB_ENV echo "IMAGE=firestarr-minimal" >> $GITHUB_ENV + - name: Login to GHCR + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4 + + - name: ${{ env.IMAGE }} - Download digests + uses: actions/download-artifact@v8 + with: + path: ${{ runner.temp }}/digests-${{ env.IMAGE }} + pattern: digests-${{ env.IMAGE }}-* + merge-multiple: true + - name: ${{ env.IMAGE }} - Docker meta id: meta-minimal uses: docker/metadata-action@v6 @@ -227,13 +263,6 @@ jobs: type=raw,value=minimal,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} type=raw,value=minimal-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - - name: ${{ env.IMAGE }} - Download digests - uses: actions/download-artifact@v8 - with: - path: ${{ runner.temp }}/digests-${{ env.IMAGE }} - pattern: digests-${{ env.IMAGE }}-* - merge-multiple: true - - name: ${{ env.IMAGE }} - Create manifest list and push working-directory: ${{ runner.temp }}/digests-${{ env.IMAGE }} run: | From d1ead416e23404bf7459bfde0ea90d38cfd19edf Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 06:31:11 -0400 Subject: [PATCH 25/78] rename variable --- .github/workflows/build-docker.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index de4e2adcbf..cce7e55932 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -42,7 +42,7 @@ jobs: echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "TARGET_CACHE=${registry}/cache:${platform//\//}" >> $GITHUB_ENV + echo "REGISTRY_CACHE=${registry}/cache:${platform//\//}" >> $GITHUB_ENV echo "TARGET=${registry}/${image}" >> $GITHUB_ENV echo "IMAGE=firestarr" >> $GITHUB_ENV @@ -78,9 +78,9 @@ jobs: push: ${{ github.event_name != 'pull_request' }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | - type=registry,ref=${{ env.TARGET_CACHE }} + type=registry,ref=${{ env.REGISTRY_CACHE }} cache-to: | - type=registry,mode=max,ref=${{ env.TARGET_CACHE }} + type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} - name: ${{ env.IMAGE }} - Export digest run: | @@ -119,9 +119,9 @@ jobs: labels: ${{ steps.meta-minimal.outputs.labels }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | - type=registry,ref=${{ env.TARGET_CACHE }} + type=registry,ref=${{ env.REGISTRY_CACHE }} cache-to: | - type=registry,mode=max,ref=${{ env.TARGET_CACHE }} + type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} - name: ${{ env.IMAGE }} - Export digest run: | @@ -156,7 +156,7 @@ jobs: echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV + echo "REGISTRY_CACHE=${registry}/cache" >> $GITHUB_ENV echo "TARGET=${registry}/${image}" >> $GITHUB_ENV echo "IMAGE=firestarr" >> $GITHUB_ENV @@ -223,7 +223,7 @@ jobs: echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "TARGET_CACHE=${registry}/cache" >> $GITHUB_ENV + echo "REGISTRY_CACHE=${registry}/cache" >> $GITHUB_ENV echo "TARGET=${registry}/${image}" >> $GITHUB_ENV echo "IMAGE=firestarr-minimal" >> $GITHUB_ENV From e4446cea53eb32b524383c8fb16ba716a4070314 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 06:35:12 -0400 Subject: [PATCH 26/78] fix variable use --- .github/workflows/build-docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index cce7e55932..fba813fef7 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -63,7 +63,7 @@ jobs: id: meta-normal uses: docker/metadata-action@v6 with: - images: ${TARGET} + images: ${{ env.TARGET }} - name: ${{ env.IMAGE }} - Build and push by digest id: build-normal @@ -104,7 +104,7 @@ jobs: id: meta-minimal uses: docker/metadata-action@v6 with: - images: ${TARGET} + images: ${{ env.TARGET }} - name: ${{ env.IMAGE }} - Build and push by digest id: build-minimal From 85c7bb4b9f91ddb622d33de266667175e0c0fc6d Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 06:41:31 -0400 Subject: [PATCH 27/78] rename variable --- .github/workflows/build-docker.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index fba813fef7..e5e4ae72b6 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -43,7 +43,7 @@ jobs: registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache:${platform//\//}" >> $GITHUB_ENV - echo "TARGET=${registry}/${image}" >> $GITHUB_ENV + echo "PACKAGE=${registry}/${image}" >> $GITHUB_ENV echo "IMAGE=firestarr" >> $GITHUB_ENV - name: Login to container registry @@ -63,7 +63,7 @@ jobs: id: meta-normal uses: docker/metadata-action@v6 with: - images: ${{ env.TARGET }} + images: ${{ env.PACKAGE }} - name: ${{ env.IMAGE }} - Build and push by digest id: build-normal @@ -74,7 +74,7 @@ jobs: target: ${{ env.IMAGE }} platforms: linux/${{ matrix.platform }} labels: ${{ steps.meta-normal.outputs.labels }} - tags: ${{ env.TARGET }} + tags: ${{ env.PACKAGE }} push: ${{ github.event_name != 'pull_request' }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | @@ -104,7 +104,7 @@ jobs: id: meta-minimal uses: docker/metadata-action@v6 with: - images: ${{ env.TARGET }} + images: ${{ env.PACKAGE }} - name: ${{ env.IMAGE }} - Build and push by digest id: build-minimal @@ -115,7 +115,7 @@ jobs: target: ${{ env.IMAGE }} platforms: linux/${{ matrix.platform }} push: ${{ github.event_name != 'pull_request' }} - tags: ${{ env.TARGET }} + tags: ${{ env.PACKAGE }} labels: ${{ steps.meta-minimal.outputs.labels }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | @@ -157,7 +157,7 @@ jobs: registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache" >> $GITHUB_ENV - echo "TARGET=${registry}/${image}" >> $GITHUB_ENV + echo "PACKAGE=${registry}/${image}" >> $GITHUB_ENV echo "IMAGE=firestarr" >> $GITHUB_ENV - name: Login to GHCR @@ -182,7 +182,7 @@ jobs: uses: docker/metadata-action@v6 with: images: | - ${{ env.TARGET }} + ${{ env.PACKAGE }} flavor: | latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} prefix= @@ -198,11 +198,11 @@ jobs: working-directory: ${{ runner.temp }}/digests-${{ env.IMAGE }} run: | docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.TARGET }}@sha256:%s ' *) + $(printf '${{ env.PACKAGE }}@sha256:%s ' *) - name: ${{ env.IMAGE }} - Inspect image run: | - docker buildx imagetools inspect ${{ env.TARGET }}:${{ steps.meta-normal.outputs.version }} + docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta-normal.outputs.version }} merge-minimal: runs-on: ubuntu-24.04 @@ -224,7 +224,7 @@ jobs: registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache" >> $GITHUB_ENV - echo "TARGET=${registry}/${image}" >> $GITHUB_ENV + echo "PACKAGE=${registry}/${image}" >> $GITHUB_ENV echo "IMAGE=firestarr-minimal" >> $GITHUB_ENV - name: Login to GHCR @@ -249,7 +249,7 @@ jobs: uses: docker/metadata-action@v6 with: images: | - ${{ env.TARGET }} + ${{ env.PACKAGE }} flavor: | latest=false prefix= @@ -267,8 +267,8 @@ jobs: working-directory: ${{ runner.temp }}/digests-${{ env.IMAGE }} run: | docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.TARGET }}@sha256:%s ' *) + $(printf '${{ env.PACKAGE }}@sha256:%s ' *) - name: ${{ env.IMAGE }} - Inspect image run: | - docker buildx imagetools inspect ${{ env.TARGET }}:${{ steps.meta-minimal.outputs.version }} + docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta-minimal.outputs.version }} From b7b09eac44a789017533d35ad3817ef78caf9ce4 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 06:42:51 -0400 Subject: [PATCH 28/78] rename variable --- .github/workflows/build-docker.yml | 68 +++++++++++++++--------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index e5e4ae72b6..87d08267a0 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -44,7 +44,7 @@ jobs: image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache:${platform//\//}" >> $GITHUB_ENV echo "PACKAGE=${registry}/${image}" >> $GITHUB_ENV - echo "IMAGE=firestarr" >> $GITHUB_ENV + echo "TARGET=firestarr" >> $GITHUB_ENV - name: Login to container registry uses: docker/login-action@v4 @@ -59,19 +59,19 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - - name: ${{ env.IMAGE }} - Docker meta + - name: ${{ env.TARGET }} - Docker meta id: meta-normal uses: docker/metadata-action@v6 with: images: ${{ env.PACKAGE }} - - name: ${{ env.IMAGE }} - Build and push by digest + - name: ${{ env.TARGET }} - Build and push by digest id: build-normal uses: docker/build-push-action@v7 with: context: . file: .docker/Dockerfile - target: ${{ env.IMAGE }} + target: ${{ env.TARGET }} platforms: linux/${{ matrix.platform }} labels: ${{ steps.meta-normal.outputs.labels }} tags: ${{ env.PACKAGE }} @@ -82,37 +82,37 @@ jobs: cache-to: | type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} - - name: ${{ env.IMAGE }} - Export digest + - name: ${{ env.TARGET }} - Export digest run: | - mkdir -p ${{ runner.temp }}/digests-${{ env.IMAGE }} + mkdir -p ${{ runner.temp }}/digests-${{ env.TARGET }} digest="${{ steps.build-normal.outputs.digest }}" - touch "${{ runner.temp }}/digests-${{ env.IMAGE }}/${digest#sha256:}" + touch "${{ runner.temp }}/digests-${{ env.TARGET }}/${digest#sha256:}" - - name: ${{ env.IMAGE }} - Upload digest + - name: ${{ env.TARGET }} - Upload digest uses: actions/upload-artifact@v7 with: name: digests-firestarr-${{ env.PLATFORM_PAIR }} - path: ${{ runner.temp }}/digests-${{ env.IMAGE }}/* + path: ${{ runner.temp }}/digests-${{ env.TARGET }}/* if-no-files-found: error retention-days: 1 - name: Change target image run: | - echo "IMAGE=firestarr-minimal" >> $GITHUB_ENV + echo "TARGET=firestarr-minimal" >> $GITHUB_ENV - - name: ${{ env.IMAGE }} - Docker meta + - name: ${{ env.TARGET }} - Docker meta id: meta-minimal uses: docker/metadata-action@v6 with: images: ${{ env.PACKAGE }} - - name: ${{ env.IMAGE }} - Build and push by digest + - name: ${{ env.TARGET }} - Build and push by digest id: build-minimal uses: docker/build-push-action@v7 with: context: . file: .docker/Dockerfile - target: ${{ env.IMAGE }} + target: ${{ env.TARGET }} platforms: linux/${{ matrix.platform }} push: ${{ github.event_name != 'pull_request' }} tags: ${{ env.PACKAGE }} @@ -123,17 +123,17 @@ jobs: cache-to: | type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} - - name: ${{ env.IMAGE }} - Export digest + - name: ${{ env.TARGET }} - Export digest run: | - mkdir -p ${{ runner.temp }}/digests-${{ env.IMAGE }} + mkdir -p ${{ runner.temp }}/digests-${{ env.TARGET }} digest="${{ steps.build-minimal.outputs.digest }}" - touch "${{ runner.temp }}/digests-${{ env.IMAGE }}/${digest#sha256:}" + touch "${{ runner.temp }}/digests-${{ env.TARGET }}/${digest#sha256:}" - - name: ${{ env.IMAGE }} - Upload digest + - name: ${{ env.TARGET }} - Upload digest uses: actions/upload-artifact@v7 with: - name: digests-${{ env.IMAGE }}-${{ env.PLATFORM_PAIR }} - path: ${{ runner.temp }}/digests-${{ env.IMAGE }}/* + name: digests-${{ env.TARGET }}-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests-${{ env.TARGET }}/* if-no-files-found: error retention-days: 1 @@ -158,7 +158,7 @@ jobs: image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache" >> $GITHUB_ENV echo "PACKAGE=${registry}/${image}" >> $GITHUB_ENV - echo "IMAGE=firestarr" >> $GITHUB_ENV + echo "TARGET=firestarr" >> $GITHUB_ENV - name: Login to GHCR uses: docker/login-action@v4 @@ -170,14 +170,14 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - - name: ${{ env.IMAGE }} - Download digests + - name: ${{ env.TARGET }} - Download digests uses: actions/download-artifact@v8 with: - path: ${{ runner.temp }}/digests-${{ env.IMAGE }} + path: ${{ runner.temp }}/digests-${{ env.TARGET }} pattern: digests-firestarr-* merge-multiple: true - - name: ${{ env.IMAGE }} - Docker meta + - name: ${{ env.TARGET }} - Docker meta id: meta-normal uses: docker/metadata-action@v6 with: @@ -194,13 +194,13 @@ jobs: type=semver,pattern={{version}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} type=semver,pattern={{major}}.{{minor}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - - name: ${{ env.IMAGE }} - Create manifest list and push - working-directory: ${{ runner.temp }}/digests-${{ env.IMAGE }} + - name: ${{ env.TARGET }} - Create manifest list and push + working-directory: ${{ runner.temp }}/digests-${{ env.TARGET }} run: | docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ $(printf '${{ env.PACKAGE }}@sha256:%s ' *) - - name: ${{ env.IMAGE }} - Inspect image + - name: ${{ env.TARGET }} - Inspect image run: | docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta-normal.outputs.version }} @@ -225,7 +225,7 @@ jobs: image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache" >> $GITHUB_ENV echo "PACKAGE=${registry}/${image}" >> $GITHUB_ENV - echo "IMAGE=firestarr-minimal" >> $GITHUB_ENV + echo "TARGET=firestarr-minimal" >> $GITHUB_ENV - name: Login to GHCR uses: docker/login-action@v4 @@ -237,14 +237,14 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - - name: ${{ env.IMAGE }} - Download digests + - name: ${{ env.TARGET }} - Download digests uses: actions/download-artifact@v8 with: - path: ${{ runner.temp }}/digests-${{ env.IMAGE }} - pattern: digests-${{ env.IMAGE }}-* + path: ${{ runner.temp }}/digests-${{ env.TARGET }} + pattern: digests-${{ env.TARGET }}-* merge-multiple: true - - name: ${{ env.IMAGE }} - Docker meta + - name: ${{ env.TARGET }} - Docker meta id: meta-minimal uses: docker/metadata-action@v6 with: @@ -263,12 +263,12 @@ jobs: type=raw,value=minimal,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} type=raw,value=minimal-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - - name: ${{ env.IMAGE }} - Create manifest list and push - working-directory: ${{ runner.temp }}/digests-${{ env.IMAGE }} + - name: ${{ env.TARGET }} - Create manifest list and push + working-directory: ${{ runner.temp }}/digests-${{ env.TARGET }} run: | docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ $(printf '${{ env.PACKAGE }}@sha256:%s ' *) - - name: ${{ env.IMAGE }} - Inspect image + - name: ${{ env.TARGET }} - Inspect image run: | docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta-minimal.outputs.version }} From f950c111acc36db35791f4518be71c23024ec995 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 06:56:33 -0400 Subject: [PATCH 29/78] remove unused variable --- .github/workflows/build-docker.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 87d08267a0..08f882e680 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -152,8 +152,6 @@ jobs: - name: Prepare environment run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache" >> $GITHUB_ENV @@ -219,8 +217,6 @@ jobs: - name: Prepare environment run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache" >> $GITHUB_ENV From fcf5dff069c415f96124395143678c03e8133bd9 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 06:57:18 -0400 Subject: [PATCH 30/78] rename variable --- .github/workflows/build-docker.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 08f882e680..12d2e33bfc 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -41,9 +41,9 @@ jobs: platform=${{ matrix.platform }} echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} - image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} + package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache:${platform//\//}" >> $GITHUB_ENV - echo "PACKAGE=${registry}/${image}" >> $GITHUB_ENV + echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr" >> $GITHUB_ENV - name: Login to container registry @@ -153,9 +153,9 @@ jobs: - name: Prepare environment run: | registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} - image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} + package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache" >> $GITHUB_ENV - echo "PACKAGE=${registry}/${image}" >> $GITHUB_ENV + echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr" >> $GITHUB_ENV - name: Login to GHCR @@ -218,9 +218,9 @@ jobs: - name: Prepare environment run: | registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} - image=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} + package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache" >> $GITHUB_ENV - echo "PACKAGE=${registry}/${image}" >> $GITHUB_ENV + echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr-minimal" >> $GITHUB_ENV - name: Login to GHCR From 2d59cf0414271cd16f1e653334a1db82788821f4 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 06:58:02 -0400 Subject: [PATCH 31/78] remove unused variable --- .github/workflows/build-docker.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 12d2e33bfc..793c314bf3 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -154,7 +154,6 @@ jobs: run: | registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "REGISTRY_CACHE=${registry}/cache" >> $GITHUB_ENV echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr" >> $GITHUB_ENV @@ -219,7 +218,6 @@ jobs: run: | registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "REGISTRY_CACHE=${registry}/cache" >> $GITHUB_ENV echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr-minimal" >> $GITHUB_ENV From d1f24a69d876ff4ca9bc53996c1af9534500d40d Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 07:04:18 -0400 Subject: [PATCH 32/78] derive registry from path --- .github/workflows/build-docker.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 793c314bf3..1e2b0c88a0 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -156,6 +156,7 @@ jobs: package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr" >> $GITHUB_ENV + echo "FOUND_REGISTRY=$(${registry#*\/} )" >> $GITHUB_ENV - name: Login to GHCR uses: docker/login-action@v4 From 3b463188aede7cb28657280c92b22dad5fc0d4fe Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 07:05:56 -0400 Subject: [PATCH 33/78] derive registry from package link --- .github/workflows/build-docker.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 1e2b0c88a0..e57af286bd 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -45,6 +45,7 @@ jobs: echo "REGISTRY_CACHE=${registry}/cache:${platform//\//}" >> $GITHUB_ENV echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr" >> $GITHUB_ENV + echo "FOUND_REGISTRY=$(${registry#*\/} )" >> $GITHUB_ENV - name: Login to container registry uses: docker/login-action@v4 From 28ca5b5233de3cc83ecc849a85b756c78ad8e53f Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 07:11:00 -0400 Subject: [PATCH 34/78] fix variable --- .github/workflows/build-docker.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index e57af286bd..1ea6637c8d 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -45,7 +45,7 @@ jobs: echo "REGISTRY_CACHE=${registry}/cache:${platform//\//}" >> $GITHUB_ENV echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr" >> $GITHUB_ENV - echo "FOUND_REGISTRY=$(${registry#*\/} )" >> $GITHUB_ENV + echo "FOUND_REGISTRY=${registry#*\/}" >> $GITHUB_ENV - name: Login to container registry uses: docker/login-action@v4 @@ -157,7 +157,7 @@ jobs: package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr" >> $GITHUB_ENV - echo "FOUND_REGISTRY=$(${registry#*\/} )" >> $GITHUB_ENV + echo "FOUND_REGISTRY=${registry#*\/}" >> $GITHUB_ENV - name: Login to GHCR uses: docker/login-action@v4 @@ -222,6 +222,7 @@ jobs: package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr-minimal" >> $GITHUB_ENV + echo "FOUND_REGISTRY=${registry#*\/}" >> $GITHUB_ENV - name: Login to GHCR uses: docker/login-action@v4 From 6227d0b8259c52163275f3825b029661e9fc1c0b Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 07:12:33 -0400 Subject: [PATCH 35/78] fix to use prefix --- .github/workflows/build-docker.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 1ea6637c8d..ff8b6838ef 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -45,7 +45,7 @@ jobs: echo "REGISTRY_CACHE=${registry}/cache:${platform//\//}" >> $GITHUB_ENV echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr" >> $GITHUB_ENV - echo "FOUND_REGISTRY=${registry#*\/}" >> $GITHUB_ENV + echo "FOUND_REGISTRY=${registry%\/*}" >> $GITHUB_ENV - name: Login to container registry uses: docker/login-action@v4 @@ -157,7 +157,7 @@ jobs: package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr" >> $GITHUB_ENV - echo "FOUND_REGISTRY=${registry#*\/}" >> $GITHUB_ENV + echo "FOUND_REGISTRY=${registry%\/*}" >> $GITHUB_ENV - name: Login to GHCR uses: docker/login-action@v4 @@ -222,7 +222,7 @@ jobs: package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr-minimal" >> $GITHUB_ENV - echo "FOUND_REGISTRY=${registry#*\/}" >> $GITHUB_ENV + echo "FOUND_REGISTRY=${registry%\/*}" >> $GITHUB_ENV - name: Login to GHCR uses: docker/login-action@v4 From a5b7ca5aa6adca93bb02c4e5e2f10996080006d2 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 07:46:34 -0400 Subject: [PATCH 36/78] extract CONTAINER_REGISTRY from package --- .github/workflows/build-docker.yml | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index ff8b6838ef..00b1410faf 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -9,7 +9,6 @@ on: workflow_dispatch: env: - CONTAINER_REGISTRY: ghcr.io BUILDX_NO_DEFAULT_ATTESTATIONS: 1 jobs: @@ -40,12 +39,16 @@ jobs: run: | platform=${{ matrix.platform }} echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV - registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} + registry=ghcr.io/${GITHUB_REPOSITORY@L} package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache:${platform//\//}" >> $GITHUB_ENV echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr" >> $GITHUB_ENV - echo "FOUND_REGISTRY=${registry%\/*}" >> $GITHUB_ENV + + - name: Find variables + echo "CONTAINER_REGISTRY=${PACKAGE%%\/*}" >> $GITHUB_ENV + echo "FOUND_REGISTRY=${PACKAGE%\/*}" >> $GITHUB_ENV + echo "FOUND_PACKAGE=${PACKAGE##*\/}" >> $GITHUB_ENV - name: Login to container registry uses: docker/login-action@v4 @@ -153,16 +156,21 @@ jobs: - name: Prepare environment run: | - registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} + registry=ghcr.io/${GITHUB_REPOSITORY@L} package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr" >> $GITHUB_ENV echo "FOUND_REGISTRY=${registry%\/*}" >> $GITHUB_ENV + - name: Find variables + echo "CONTAINER_REGISTRY=${PACKAGE%%\/*}" >> $GITHUB_ENV + echo "FOUND_REGISTRY=${PACKAGE%\/*}" >> $GITHUB_ENV + echo "FOUND_PACKAGE=${PACKAGE##*\/}" >> $GITHUB_ENV + - name: Login to GHCR uses: docker/login-action@v4 with: - registry: ghcr.io + registry: ${{ env.CONTAINER_REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} @@ -218,19 +226,25 @@ jobs: - name: Prepare environment run: | - registry=${{ env.CONTAINER_REGISTRY }}/${GITHUB_REPOSITORY@L} + registry=ghcr.io/${GITHUB_REPOSITORY@L} package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=firestarr-minimal" >> $GITHUB_ENV echo "FOUND_REGISTRY=${registry%\/*}" >> $GITHUB_ENV + - name: Find variables + echo "CONTAINER_REGISTRY=${PACKAGE%%\/*}" >> $GITHUB_ENV + echo "FOUND_REGISTRY=${PACKAGE%\/*}" >> $GITHUB_ENV + echo "FOUND_PACKAGE=${PACKAGE##*\/}" >> $GITHUB_ENV + - name: Login to GHCR uses: docker/login-action@v4 with: - registry: ghcr.io + registry: ${{ env.CONTAINER_REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 From fbd3c1188d4b31fd591cf6d0d99f53815d37f7c3 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 07:52:18 -0400 Subject: [PATCH 37/78] fix run --- .github/workflows/build-docker.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 00b1410faf..45010bdf61 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -46,6 +46,7 @@ jobs: echo "TARGET=firestarr" >> $GITHUB_ENV - name: Find variables + run: | echo "CONTAINER_REGISTRY=${PACKAGE%%\/*}" >> $GITHUB_ENV echo "FOUND_REGISTRY=${PACKAGE%\/*}" >> $GITHUB_ENV echo "FOUND_PACKAGE=${PACKAGE##*\/}" >> $GITHUB_ENV @@ -163,6 +164,7 @@ jobs: echo "FOUND_REGISTRY=${registry%\/*}" >> $GITHUB_ENV - name: Find variables + run: | echo "CONTAINER_REGISTRY=${PACKAGE%%\/*}" >> $GITHUB_ENV echo "FOUND_REGISTRY=${PACKAGE%\/*}" >> $GITHUB_ENV echo "FOUND_PACKAGE=${PACKAGE##*\/}" >> $GITHUB_ENV @@ -233,6 +235,7 @@ jobs: echo "FOUND_REGISTRY=${registry%\/*}" >> $GITHUB_ENV - name: Find variables + run: | echo "CONTAINER_REGISTRY=${PACKAGE%%\/*}" >> $GITHUB_ENV echo "FOUND_REGISTRY=${PACKAGE%\/*}" >> $GITHUB_ENV echo "FOUND_PACKAGE=${PACKAGE##*\/}" >> $GITHUB_ENV From 150886c2e05d3a8a08d63c59eb0040f2c56797e2 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 08:02:48 -0400 Subject: [PATCH 38/78] consistent naming --- .github/workflows/build-docker.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 45010bdf61..7c57a7ce4b 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -65,20 +65,20 @@ jobs: uses: docker/setup-buildx-action@v4 - name: ${{ env.TARGET }} - Docker meta - id: meta-normal + id: meta uses: docker/metadata-action@v6 with: images: ${{ env.PACKAGE }} - name: ${{ env.TARGET }} - Build and push by digest - id: build-normal + id: build uses: docker/build-push-action@v7 with: context: . file: .docker/Dockerfile target: ${{ env.TARGET }} platforms: linux/${{ matrix.platform }} - labels: ${{ steps.meta-normal.outputs.labels }} + labels: ${{ steps.meta.outputs.labels }} tags: ${{ env.PACKAGE }} push: ${{ github.event_name != 'pull_request' }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true @@ -90,13 +90,13 @@ jobs: - name: ${{ env.TARGET }} - Export digest run: | mkdir -p ${{ runner.temp }}/digests-${{ env.TARGET }} - digest="${{ steps.build-normal.outputs.digest }}" + digest="${{ steps.build.outputs.digest }}" touch "${{ runner.temp }}/digests-${{ env.TARGET }}/${digest#sha256:}" - name: ${{ env.TARGET }} - Upload digest uses: actions/upload-artifact@v7 with: - name: digests-firestarr-${{ env.PLATFORM_PAIR }} + name: digests-${{ env.TARGET }}-${{ env.PLATFORM_PAIR }} path: ${{ runner.temp }}/digests-${{ env.TARGET }}/* if-no-files-found: error retention-days: 1 @@ -142,7 +142,7 @@ jobs: if-no-files-found: error retention-days: 1 - merge-normal: + merge: runs-on: ubuntu-24.04 permissions: contents: read @@ -183,11 +183,11 @@ jobs: uses: actions/download-artifact@v8 with: path: ${{ runner.temp }}/digests-${{ env.TARGET }} - pattern: digests-firestarr-* + pattern: digests-${{ env.TARGET }}-* merge-multiple: true - name: ${{ env.TARGET }} - Docker meta - id: meta-normal + id: meta uses: docker/metadata-action@v6 with: images: | @@ -211,7 +211,7 @@ jobs: - name: ${{ env.TARGET }} - Inspect image run: | - docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta-normal.outputs.version }} + docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta.outputs.version }} merge-minimal: runs-on: ubuntu-24.04 @@ -259,7 +259,7 @@ jobs: merge-multiple: true - name: ${{ env.TARGET }} - Docker meta - id: meta-minimal + id: meta uses: docker/metadata-action@v6 with: images: | @@ -285,4 +285,4 @@ jobs: - name: ${{ env.TARGET }} - Inspect image run: | - docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta-minimal.outputs.version }} + docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta.outputs.version }} From 68d006808db3e09cdf16940dea6ba0f5fc6b3f0c Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 08:14:44 -0400 Subject: [PATCH 39/78] uses: ./.github/workflows/docker-merge-image.yml --- .github/workflows/build-docker.yml | 177 +++++------------------ .github/workflows/docker-merge-image.yml | 78 ++++++++++ 2 files changed, 111 insertions(+), 144 deletions(-) create mode 100644 .github/workflows/docker-merge-image.yml diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 7c57a7ce4b..1e4417ad32 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -142,147 +142,36 @@ jobs: if-no-files-found: error retention-days: 1 - merge: - runs-on: ubuntu-24.04 - permissions: - contents: read - packages: write - needs: [ build-docker-image ] - steps: - - uses: actions/checkout@v6 - with: - fetch-depth: 0 - fetch-tags: true - submodules: true - - - name: Prepare environment - run: | - registry=ghcr.io/${GITHUB_REPOSITORY@L} - package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV - echo "TARGET=firestarr" >> $GITHUB_ENV - echo "FOUND_REGISTRY=${registry%\/*}" >> $GITHUB_ENV - - - name: Find variables - run: | - echo "CONTAINER_REGISTRY=${PACKAGE%%\/*}" >> $GITHUB_ENV - echo "FOUND_REGISTRY=${PACKAGE%\/*}" >> $GITHUB_ENV - echo "FOUND_PACKAGE=${PACKAGE##*\/}" >> $GITHUB_ENV - - - name: Login to GHCR - uses: docker/login-action@v4 - with: - registry: ${{ env.CONTAINER_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v4 - - - name: ${{ env.TARGET }} - Download digests - uses: actions/download-artifact@v8 - with: - path: ${{ runner.temp }}/digests-${{ env.TARGET }} - pattern: digests-${{ env.TARGET }}-* - merge-multiple: true - - - name: ${{ env.TARGET }} - Docker meta - id: meta - uses: docker/metadata-action@v6 - with: - images: | - ${{ env.PACKAGE }} - flavor: | - latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} - prefix= - suffix= - tags: | - type=ref,event=pr - type=ref,prefix=,suffix=,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} - type=ref,prefix=,suffix=-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} - type=semver,pattern={{version}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - type=semver,pattern={{major}}.{{minor}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - - - name: ${{ env.TARGET }} - Create manifest list and push - working-directory: ${{ runner.temp }}/digests-${{ env.TARGET }} - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.PACKAGE }}@sha256:%s ' *) - - - name: ${{ env.TARGET }} - Inspect image - run: | - docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta.outputs.version }} - - merge-minimal: - runs-on: ubuntu-24.04 - permissions: - contents: read - packages: write - needs: [ build-docker-image ] - steps: - - uses: actions/checkout@v6 - with: - fetch-depth: 0 - fetch-tags: true - submodules: true - - - name: Prepare environment - run: | - registry=ghcr.io/${GITHUB_REPOSITORY@L} - package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV - echo "TARGET=firestarr-minimal" >> $GITHUB_ENV - echo "FOUND_REGISTRY=${registry%\/*}" >> $GITHUB_ENV - - - name: Find variables - run: | - echo "CONTAINER_REGISTRY=${PACKAGE%%\/*}" >> $GITHUB_ENV - echo "FOUND_REGISTRY=${PACKAGE%\/*}" >> $GITHUB_ENV - echo "FOUND_PACKAGE=${PACKAGE##*\/}" >> $GITHUB_ENV - - - name: Login to GHCR - uses: docker/login-action@v4 - with: - registry: ${{ env.CONTAINER_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v4 - - - name: ${{ env.TARGET }} - Download digests - uses: actions/download-artifact@v8 - with: - path: ${{ runner.temp }}/digests-${{ env.TARGET }} - pattern: digests-${{ env.TARGET }}-* - merge-multiple: true - - - name: ${{ env.TARGET }} - Docker meta - id: meta - uses: docker/metadata-action@v6 - with: - images: | - ${{ env.PACKAGE }} - flavor: | - latest=false - prefix= - suffix=-minimal - tags: | - type=ref,event=pr - type=ref,prefix=,suffix=-minimal,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} - type=ref,prefix=,suffix=-minimal-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} - type=semver,pattern={{version}},prefix=,suffix=-minimal,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - type=semver,pattern={{major}}.{{minor}},prefix=,suffix=-minimal,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - type=raw,value=minimal,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - type=raw,value=minimal-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - - - name: ${{ env.TARGET }} - Create manifest list and push - working-directory: ${{ runner.temp }}/digests-${{ env.TARGET }} - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.PACKAGE }}@sha256:%s ' *) - - - name: ${{ env.TARGET }} - Inspect image - run: | - docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta.outputs.version }} + merge-firestarr: + needs: [build-docker-image] + uses: ./.github/workflows/docker-merge-image.yml + with: + target: firestarr + flavor: | + latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} + prefix= + suffix= + tags: | + type=ref,event=pr + type=ref,prefix=,suffix=,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + type=ref,prefix=,suffix=-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{version}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{major}}.{{minor}},prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + + merge-firestarr-minimal: + needs: [build-docker-image] + uses: ./.github/workflows/docker-merge-image.yml + with: + target: firestarr-minimal + flavor: | + latest=false + prefix= + suffix=-minimal + tags: | + type=ref,event=pr + type=ref,prefix=,suffix=-minimal,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + type=ref,prefix=,suffix=-minimal-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{version}},prefix=,suffix=-minimal,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{major}}.{{minor}},prefix=,suffix=-minimal,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=raw,value=minimal,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=raw,value=minimal-latest,prefix=,suffix=,enable=${{ startsWith(github.ref, 'refs/tags/v') }} diff --git a/.github/workflows/docker-merge-image.yml b/.github/workflows/docker-merge-image.yml new file mode 100644 index 0000000000..61e9ef806f --- /dev/null +++ b/.github/workflows/docker-merge-image.yml @@ -0,0 +1,78 @@ +name: docker-merge-image + +on: + workflow_call: + inputs: + target: + required: true + type: string + flavor: + required: true + type: string + tags: + required: true + type: string + +env: + BUILDX_NO_DEFAULT_ATTESTATIONS: 1 + +jobs: + merge: + runs-on: ubuntu-24.04 + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + fetch-tags: true + submodules: true + + - name: Prepare environment + run: | + registry=ghcr.io/${GITHUB_REPOSITORY@L} + package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} + echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV + echo "TARGET=${{ inputs.target }}" >> $GITHUB_ENV + + - name: Find variables + run: | + echo "CONTAINER_REGISTRY=${PACKAGE%%\/*}" >> $GITHUB_ENV + echo "FOUND_REGISTRY=${PACKAGE%\/*}" >> $GITHUB_ENV + echo "FOUND_PACKAGE=${PACKAGE##*\/}" >> $GITHUB_ENV + + - name: Login to GHCR + uses: docker/login-action@v4 + with: + registry: ${{ env.CONTAINER_REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4 + + - name: ${{ env.TARGET }} - Download digests + uses: actions/download-artifact@v8 + with: + path: ${{ runner.temp }}/digests-${{ env.TARGET }} + pattern: digests-${{ env.TARGET }}-* + merge-multiple: true + + - name: ${{ env.TARGET }} - Docker meta + id: meta + uses: docker/metadata-action@v6 + with: + images: ${{ env.PACKAGE }} + flavor: ${{ inputs.flavor }} + tags: ${{ inputs.tags }} + + - name: ${{ env.TARGET }} - Create manifest list and push + working-directory: ${{ runner.temp }}/digests-${{ env.TARGET }} + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.PACKAGE }}@sha256:%s ' *) + + - name: ${{ env.TARGET }} - Inspect image + run: | + docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta.outputs.version }} From e5a47a50aebc9084b90741f305cd129953c6f772 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 12:36:27 +0000 Subject: [PATCH 40/78] use --parallel for ctest --- .docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.docker/Dockerfile b/.docker/Dockerfile index ad277f4d63..d512b3e83e 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -91,7 +91,7 @@ RUN --mount=type=bind,source=./vcpkg.json,target=./vcpkg.json \ --mount=type=bind,source=./LICENSE,target=./LICENSE \ cmake --preset Release \ && cmake --build --parallel --preset Release \ - && ctest --preset Release + && ctest --parallel --preset Release # make a layer with scratch to clear out old layers FROM scratch AS firestarr-minimal From e85cb21ea671e2103445bd026d17adbef785fe99 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 08:42:12 -0400 Subject: [PATCH 41/78] add cache-from: type=registry,ref=${{ env.PACKAGE }} --- .github/workflows/build-docker.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 1e4417ad32..edfda3130e 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -83,6 +83,7 @@ jobs: push: ${{ github.event_name != 'pull_request' }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | + type=registry,ref=${{ env.PACKAGE }} type=registry,ref=${{ env.REGISTRY_CACHE }} cache-to: | type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} @@ -124,6 +125,7 @@ jobs: labels: ${{ steps.meta-minimal.outputs.labels }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | + type=registry,ref=${{ env.PACKAGE }} type=registry,ref=${{ env.REGISTRY_CACHE }} cache-to: | type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} From c6baa4d662e871465918260a88d1a89110d03d18 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 09:52:11 -0400 Subject: [PATCH 42/78] Revert "add cache-from: type=registry,ref=${{ env.PACKAGE }}" This reverts commit cc9eafda0c214f66a2631c281221010d971abc31. --- .github/workflows/build-docker.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index edfda3130e..1e4417ad32 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -83,7 +83,6 @@ jobs: push: ${{ github.event_name != 'pull_request' }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | - type=registry,ref=${{ env.PACKAGE }} type=registry,ref=${{ env.REGISTRY_CACHE }} cache-to: | type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} @@ -125,7 +124,6 @@ jobs: labels: ${{ steps.meta-minimal.outputs.labels }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | - type=registry,ref=${{ env.PACKAGE }} type=registry,ref=${{ env.REGISTRY_CACHE }} cache-to: | type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} From 708d6131cf0bc1a429b5762aa05117352c078b5b Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 10:09:10 -0400 Subject: [PATCH 43/78] remove args: VERSION --- docker-compose.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 60e2bf7edd..c9f2e05fcf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,8 +5,6 @@ services: context: . target: firestarr dockerfile: .docker/Dockerfile - args: - VERSION: ${VERSION} tags: - firestarr:${VERSION} volumes: @@ -25,8 +23,6 @@ services: context: . target: firestarr-minimal dockerfile: .docker/Dockerfile - args: - VERSION: ${VERSION} tags: - firestarr-minimal:${VERSION} volumes: @@ -45,8 +41,6 @@ services: context: . target: firestarr-dev dockerfile: .docker/Dockerfile.dev - args: - VERSION: ${VERSION} tags: - firestarr-dev:${VERSION} entrypoint: tail -f /dev/null From 179a55d73dcaf5d0128227503a7f1781c4f1934e Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 13:41:48 +0000 Subject: [PATCH 44/78] fix missing newline in generated version.cpp --- cmake/Version.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/Version.cmake b/cmake/Version.cmake index ee0d12801d..f389899b8b 100644 --- a/cmake/Version.cmake +++ b/cmake/Version.cmake @@ -144,6 +144,8 @@ message("${SPECIFIC_REVISION}") set(VERSION_CODE "extern \"C\" const char* const SPECIFIC_REVISION{\"${SPECIFIC_REVISION}\"}\;") list(APPEND VERSION_CODE "extern \"C\" const char* const FULL_HASH{\"${FULL_HASH}\"}\;") list(APPEND VERSION_CODE "extern \"C\" const char* const COMPILED_ON{\"${COMPILED_ON}\"}\;") +# HACK: add empty line to get trailing newline +list(APPEND VERSION_CODE "") list(JOIN VERSION_CODE "\n" VERSION_CODE) if(EXISTS FILE_VERSION_CPP) file(STRINGS ${FILE_VERSION_CPP} VERSION_CODE_OLD) From 0190cca375c11300870b10e9b156ef0328d18e69 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 10:46:28 -0400 Subject: [PATCH 45/78] use composite action --- .github/actions/docker-build-image/action.yml | 75 ++++++++++++++++ .github/workflows/build-docker.yml | 87 +++---------------- 2 files changed, 85 insertions(+), 77 deletions(-) create mode 100644 .github/actions/docker-build-image/action.yml diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml new file mode 100644 index 0000000000..413ed121ec --- /dev/null +++ b/.github/actions/docker-build-image/action.yml @@ -0,0 +1,75 @@ +# requires docker setup elsewhere +name: docker-build-image +description: 'Build docker image for specific platform' + +inputs: + target: + required: true + type: string + platform: + required: true + type: string + +env: + BUILDX_NO_DEFAULT_ATTESTATIONS: 1 + +runs: + using: "composite" + steps: + - name: Prepare environment + run: | + registry=ghcr.io/${GITHUB_REPOSITORY@L} + package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} + echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV + echo "TARGET=${{ inputs.target }}" >> $GITHUB_ENV + echo "PLATFORM=${{ inputs.platform }}" >> $GITHUB_ENV + + - name: Find variables + run: | + PLATFORM_PAIR=${PLATFORM//\//}] + CONTAINER_REGISTRY=${PACKAGE%%\/*} + FOUND_REGISTRY=${PACKAGE%\/*} + FOUND_PACKAGE=${PACKAGE##*\/} + echo "PLATFORM_PAIR=${PLATFORM_PAIR}" >> $GITHUB_ENV + echo "CONTAINER_REGISTRY=${CONTAINER_REGISTRY}" >> $GITHUB_ENV + echo "FOUND_REGISTRY=${FOUND_REGISTRY}" >> $GITHUB_ENV + echo "FOUND_PACKAGE=${FOUND_PACKAGE}" >> $GITHUB_ENV + echo "REGISTRY_CACHE=${FOUND_REGISTRY}/cache:${PLATFORM_PAIR}" >> $GITHUB_ENV + + - name: ${{ env.TARGET }} - Docker meta + id: meta + uses: docker/metadata-action@v6 + with: + images: ${{ env.PACKAGE }} + + - name: ${{ env.TARGET }} - Build and push by digest + id: build + uses: docker/build-push-action@v7 + with: + context: . + file: .docker/Dockerfile + target: ${{ env.TARGET }} + platforms: linux/${{ env.PLATFORM }} + labels: ${{ steps.meta.outputs.labels }} + tags: ${{ env.PACKAGE }} + push: ${{ github.event_name != 'pull_request' }} + outputs: type=image,push-by-digest=true,name-canonical=true,push=true + cache-from: | + type=registry,ref=${{ env.REGISTRY_CACHE }} + cache-to: | + type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} + + - name: ${{ env.TARGET }} - Export digest + shell: bash + run: | + mkdir -p ${{ runner.temp }}/digests-${{ env.TARGET }} + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests-${{ env.TARGET }}/${digest#sha256:}" + + - name: ${{ env.TARGET }} - Upload digest + uses: actions/upload-artifact@v7 + with: + name: digests-${{ env.TARGET }}-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests-${{ env.TARGET }}/* + if-no-files-found: error + retention-days: 1 diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 1e4417ad32..d76eca9739 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -37,12 +37,13 @@ jobs: - name: Prepare environment run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//}" >> $GITHUB_ENV + PLATFORM=${{ matrix.platform }} + echo "PLATFORM_PAIR=${PLATFORM//\//}" >> $GITHUB_ENV registry=ghcr.io/${GITHUB_REPOSITORY@L} package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "REGISTRY_CACHE=${registry}/cache:${platform//\//}" >> $GITHUB_ENV + echo "REGISTRY_CACHE=${registry}/cache:${PLATFORM//\//}" >> $GITHUB_ENV echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV + echo "PLATFORM=${PLATFORM}" echo "TARGET=firestarr" >> $GITHUB_ENV - name: Find variables @@ -64,83 +65,15 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - - name: ${{ env.TARGET }} - Docker meta - id: meta - uses: docker/metadata-action@v6 + - uses: ./.github/actions/docker-build-image with: - images: ${{ env.PACKAGE }} + target: firestarr + platform: ${{ env.PLATFORM }} - - name: ${{ env.TARGET }} - Build and push by digest - id: build - uses: docker/build-push-action@v7 + - uses: ./.github/actions/docker-build-image with: - context: . - file: .docker/Dockerfile - target: ${{ env.TARGET }} - platforms: linux/${{ matrix.platform }} - labels: ${{ steps.meta.outputs.labels }} - tags: ${{ env.PACKAGE }} - push: ${{ github.event_name != 'pull_request' }} - outputs: type=image,push-by-digest=true,name-canonical=true,push=true - cache-from: | - type=registry,ref=${{ env.REGISTRY_CACHE }} - cache-to: | - type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} - - - name: ${{ env.TARGET }} - Export digest - run: | - mkdir -p ${{ runner.temp }}/digests-${{ env.TARGET }} - digest="${{ steps.build.outputs.digest }}" - touch "${{ runner.temp }}/digests-${{ env.TARGET }}/${digest#sha256:}" - - - name: ${{ env.TARGET }} - Upload digest - uses: actions/upload-artifact@v7 - with: - name: digests-${{ env.TARGET }}-${{ env.PLATFORM_PAIR }} - path: ${{ runner.temp }}/digests-${{ env.TARGET }}/* - if-no-files-found: error - retention-days: 1 - - - name: Change target image - run: | - echo "TARGET=firestarr-minimal" >> $GITHUB_ENV - - - name: ${{ env.TARGET }} - Docker meta - id: meta-minimal - uses: docker/metadata-action@v6 - with: - images: ${{ env.PACKAGE }} - - - name: ${{ env.TARGET }} - Build and push by digest - id: build-minimal - uses: docker/build-push-action@v7 - with: - context: . - file: .docker/Dockerfile - target: ${{ env.TARGET }} - platforms: linux/${{ matrix.platform }} - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ env.PACKAGE }} - labels: ${{ steps.meta-minimal.outputs.labels }} - outputs: type=image,push-by-digest=true,name-canonical=true,push=true - cache-from: | - type=registry,ref=${{ env.REGISTRY_CACHE }} - cache-to: | - type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} - - - name: ${{ env.TARGET }} - Export digest - run: | - mkdir -p ${{ runner.temp }}/digests-${{ env.TARGET }} - digest="${{ steps.build-minimal.outputs.digest }}" - touch "${{ runner.temp }}/digests-${{ env.TARGET }}/${digest#sha256:}" - - - name: ${{ env.TARGET }} - Upload digest - uses: actions/upload-artifact@v7 - with: - name: digests-${{ env.TARGET }}-${{ env.PLATFORM_PAIR }} - path: ${{ runner.temp }}/digests-${{ env.TARGET }}/* - if-no-files-found: error - retention-days: 1 + target: firestarr-minimal + platform: ${{ env.PLATFORM }} merge-firestarr: needs: [build-docker-image] From 50ab451a70d53a63b7000715294a1f52d4472fe8 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 10:50:09 -0400 Subject: [PATCH 46/78] add missing shell --- .github/actions/docker-build-image/action.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 413ed121ec..a04a0e3900 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -17,6 +17,7 @@ runs: using: "composite" steps: - name: Prepare environment + shell: bash run: | registry=ghcr.io/${GITHUB_REPOSITORY@L} package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} @@ -25,6 +26,7 @@ runs: echo "PLATFORM=${{ inputs.platform }}" >> $GITHUB_ENV - name: Find variables + shell: bash run: | PLATFORM_PAIR=${PLATFORM//\//}] CONTAINER_REGISTRY=${PACKAGE%%\/*} From 599a83cc5ef01737dc7d28f116306388ad9c3ba7 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 10:52:40 -0400 Subject: [PATCH 47/78] change cmake-test.yml to not run when only docker workflow changed --- .github/workflows/cmake-test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/cmake-test.yml b/.github/workflows/cmake-test.yml index 111413f2e7..c4693a6a38 100644 --- a/.github/workflows/cmake-test.yml +++ b/.github/workflows/cmake-test.yml @@ -2,6 +2,8 @@ name: cmake-test on: push: + paths-ignore: + - '.github/**docker**' pull_request: workflow_dispatch: release: From 588f2915555f2d6688c1dce70136e314f1b39c2b Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 10:55:17 -0400 Subject: [PATCH 48/78] fix settings env.PLATFORM --- .github/workflows/build-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index d76eca9739..c748e2affa 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -43,7 +43,7 @@ jobs: package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "REGISTRY_CACHE=${registry}/cache:${PLATFORM//\//}" >> $GITHUB_ENV echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV - echo "PLATFORM=${PLATFORM}" + echo "PLATFORM=${PLATFORM}" >> $GITHUB_ENV echo "TARGET=firestarr" >> $GITHUB_ENV - name: Find variables From e44ef7385e03a5bda6aa659d258d11b0f91a12be Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 10:56:54 -0400 Subject: [PATCH 49/78] fix typo --- .github/actions/docker-build-image/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index a04a0e3900..2e548e0297 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -28,7 +28,7 @@ runs: - name: Find variables shell: bash run: | - PLATFORM_PAIR=${PLATFORM//\//}] + PLATFORM_PAIR=${PLATFORM//\//} CONTAINER_REGISTRY=${PACKAGE%%\/*} FOUND_REGISTRY=${PACKAGE%\/*} FOUND_PACKAGE=${PACKAGE##*\/} From ea3b950aa77774cf356dd029b5e6879c1af41f0a Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 11:07:55 -0400 Subject: [PATCH 50/78] add registry to inputs --- .github/actions/docker-build-image/action.yml | 6 +++++- .github/workflows/build-docker.yml | 20 +++---------------- .github/workflows/docker-merge-image.yml | 6 +++++- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 2e548e0297..c00304d33d 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -9,6 +9,10 @@ inputs: platform: required: true type: string + registry: + required: false + type: string + default: 'ghcr.io' env: BUILDX_NO_DEFAULT_ATTESTATIONS: 1 @@ -19,7 +23,7 @@ runs: - name: Prepare environment shell: bash run: | - registry=ghcr.io/${GITHUB_REPOSITORY@L} + registry=${{ inputs.registry }}/${GITHUB_REPOSITORY@L} package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=${{ inputs.target }}" >> $GITHUB_ENV diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index c748e2affa..6d80588270 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -9,6 +9,7 @@ on: workflow_dispatch: env: + CONTAINER_REGISTRY: ghcr.io BUILDX_NO_DEFAULT_ATTESTATIONS: 1 jobs: @@ -35,23 +36,6 @@ jobs: fetch-tags: true submodules: true - - name: Prepare environment - run: | - PLATFORM=${{ matrix.platform }} - echo "PLATFORM_PAIR=${PLATFORM//\//}" >> $GITHUB_ENV - registry=ghcr.io/${GITHUB_REPOSITORY@L} - package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "REGISTRY_CACHE=${registry}/cache:${PLATFORM//\//}" >> $GITHUB_ENV - echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV - echo "PLATFORM=${PLATFORM}" >> $GITHUB_ENV - echo "TARGET=firestarr" >> $GITHUB_ENV - - - name: Find variables - run: | - echo "CONTAINER_REGISTRY=${PACKAGE%%\/*}" >> $GITHUB_ENV - echo "FOUND_REGISTRY=${PACKAGE%\/*}" >> $GITHUB_ENV - echo "FOUND_PACKAGE=${PACKAGE##*\/}" >> $GITHUB_ENV - - name: Login to container registry uses: docker/login-action@v4 with: @@ -79,6 +63,7 @@ jobs: needs: [build-docker-image] uses: ./.github/workflows/docker-merge-image.yml with: + registry: ${{ env.CONTAINER_REGISTRY }} target: firestarr flavor: | latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} @@ -95,6 +80,7 @@ jobs: needs: [build-docker-image] uses: ./.github/workflows/docker-merge-image.yml with: + registry: ${{ env.CONTAINER_REGISTRY }} target: firestarr-minimal flavor: | latest=false diff --git a/.github/workflows/docker-merge-image.yml b/.github/workflows/docker-merge-image.yml index 61e9ef806f..7f12003263 100644 --- a/.github/workflows/docker-merge-image.yml +++ b/.github/workflows/docker-merge-image.yml @@ -12,6 +12,10 @@ on: tags: required: true type: string + registry: + required: false + type: string + default: 'ghcr.io' env: BUILDX_NO_DEFAULT_ATTESTATIONS: 1 @@ -31,7 +35,7 @@ jobs: - name: Prepare environment run: | - registry=ghcr.io/${GITHUB_REPOSITORY@L} + registry=${{ inputs.registry }}/${GITHUB_REPOSITORY@L} package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV echo "TARGET=${{ inputs.target }}" >> $GITHUB_ENV From d00295e697e416984f11748ff5899550c41f4bad Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 11:14:24 -0400 Subject: [PATCH 51/78] pass input registry to merge --- .github/workflows/build-docker.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 6d80588270..b0c4308828 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -9,7 +9,6 @@ on: workflow_dispatch: env: - CONTAINER_REGISTRY: ghcr.io BUILDX_NO_DEFAULT_ATTESTATIONS: 1 jobs: @@ -37,12 +36,16 @@ jobs: submodules: true - name: Login to container registry + id: login uses: docker/login-action@v4 with: - registry: ${{ env.CONTAINER_REGISTRY }} + registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - run: | + echo "registry=${{ steps.id.inputs.registry }}" >> $GITHUB_OUTPUT + - name: Set up QEMU uses: docker/setup-qemu-action@v4 @@ -63,7 +66,7 @@ jobs: needs: [build-docker-image] uses: ./.github/workflows/docker-merge-image.yml with: - registry: ${{ env.CONTAINER_REGISTRY }} + registry: ${{ needs.build-docker-image.outputs.registry }} target: firestarr flavor: | latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} @@ -80,7 +83,7 @@ jobs: needs: [build-docker-image] uses: ./.github/workflows/docker-merge-image.yml with: - registry: ${{ env.CONTAINER_REGISTRY }} + registry: ${{ needs.build-docker-image.outputs.registry }} target: firestarr-minimal flavor: | latest=false From 2491c8b8d737c0347ed816479c59dfa3e62c81f8 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 11:17:22 -0400 Subject: [PATCH 52/78] fix matrix.platform --- .github/workflows/build-docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index b0c4308828..5e83f7b297 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -55,12 +55,12 @@ jobs: - uses: ./.github/actions/docker-build-image with: target: firestarr - platform: ${{ env.PLATFORM }} + platform: ${{ matrix.platform }} - uses: ./.github/actions/docker-build-image with: target: firestarr-minimal - platform: ${{ env.PLATFORM }} + platform: ${{ matrix.platform }} merge-firestarr: needs: [build-docker-image] From a7ed05d7e3a1e31182da1e586197dc7c03cb644a Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 11:25:28 -0400 Subject: [PATCH 53/78] determine package once and pass to other steps --- .github/actions/docker-build-image/action.yml | 6 ++++-- .github/workflows/build-docker.yml | 14 +++++++++++--- .github/workflows/docker-merge-image.yml | 6 ++++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index c00304d33d..39e4cb6eac 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -6,6 +6,9 @@ inputs: target: required: true type: string + package: + required: true + type: string platform: required: true type: string @@ -24,8 +27,7 @@ runs: shell: bash run: | registry=${{ inputs.registry }}/${GITHUB_REPOSITORY@L} - package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV + echo "PACKAGE=${registry}/${{ inputs.package }}" >> $GITHUB_ENV echo "TARGET=${{ inputs.target }}" >> $GITHUB_ENV echo "PLATFORM=${{ inputs.platform }}" >> $GITHUB_ENV diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 5e83f7b297..47407470f2 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -43,9 +43,6 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - run: | - echo "registry=${{ steps.id.inputs.registry }}" >> $GITHUB_OUTPUT - - name: Set up QEMU uses: docker/setup-qemu-action@v4 @@ -53,20 +50,30 @@ jobs: uses: docker/setup-buildx-action@v4 - uses: ./.github/actions/docker-build-image + id: build-firestarr with: target: firestarr + package: ${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} platform: ${{ matrix.platform }} - uses: ./.github/actions/docker-build-image + id: build-firestarr-minimal with: target: firestarr-minimal + package: ${{ steps.build-firestarr.inputs.package }} platform: ${{ matrix.platform }} + - name: Set outputs + run: | + echo "registry=${{ steps.id.inputs.registry }}" >> $GITHUB_OUTPUT + echo "package=${{ steps.build-firestarr.inputs.package }}" >> $GITHUB_OUTPUT + merge-firestarr: needs: [build-docker-image] uses: ./.github/workflows/docker-merge-image.yml with: registry: ${{ needs.build-docker-image.outputs.registry }} + package: ${{ needs.build-docker-image.outputs.package }} target: firestarr flavor: | latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} @@ -84,6 +91,7 @@ jobs: uses: ./.github/workflows/docker-merge-image.yml with: registry: ${{ needs.build-docker-image.outputs.registry }} + package: ${{ needs.build-docker-image.outputs.package }} target: firestarr-minimal flavor: | latest=false diff --git a/.github/workflows/docker-merge-image.yml b/.github/workflows/docker-merge-image.yml index 7f12003263..8e1c817a0b 100644 --- a/.github/workflows/docker-merge-image.yml +++ b/.github/workflows/docker-merge-image.yml @@ -6,6 +6,9 @@ on: target: required: true type: string + package: + required: true + type: string flavor: required: true type: string @@ -36,8 +39,7 @@ jobs: - name: Prepare environment run: | registry=${{ inputs.registry }}/${GITHUB_REPOSITORY@L} - package=${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} - echo "PACKAGE=${registry}/${package}" >> $GITHUB_ENV + echo "PACKAGE=${registry}/${{ inputs.package }}" >> $GITHUB_ENV echo "TARGET=${{ inputs.target }}" >> $GITHUB_ENV - name: Find variables From c3fb0ea3f7080832f21f2c5ad6ef93ca71e4c526 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 11:42:36 -0400 Subject: [PATCH 54/78] make registry required and fix chaining --- .github/actions/docker-build-image/action.yml | 3 +-- .github/workflows/build-docker.yml | 10 ++++++---- .github/workflows/docker-merge-image.yml | 3 +-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 39e4cb6eac..72e099d5e1 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -13,9 +13,8 @@ inputs: required: true type: string registry: - required: false + required: true type: string - default: 'ghcr.io' env: BUILDX_NO_DEFAULT_ATTESTATIONS: 1 diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 47407470f2..507491d9a8 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -53,6 +53,7 @@ jobs: id: build-firestarr with: target: firestarr + registry: ${{ steps.login.inputs.registry }} package: ${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} platform: ${{ matrix.platform }} @@ -60,21 +61,22 @@ jobs: id: build-firestarr-minimal with: target: firestarr-minimal + registry: ${{ steps.build-firestarr.inputs.registry }} package: ${{ steps.build-firestarr.inputs.package }} - platform: ${{ matrix.platform }} + platform: ${{ steps.build-firestarr.inputs.platform }} - name: Set outputs run: | - echo "registry=${{ steps.id.inputs.registry }}" >> $GITHUB_OUTPUT + echo "registry=${{ steps.login.inputs.registry }}" >> $GITHUB_OUTPUT echo "package=${{ steps.build-firestarr.inputs.package }}" >> $GITHUB_OUTPUT merge-firestarr: needs: [build-docker-image] uses: ./.github/workflows/docker-merge-image.yml with: + target: firestarr registry: ${{ needs.build-docker-image.outputs.registry }} package: ${{ needs.build-docker-image.outputs.package }} - target: firestarr flavor: | latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} prefix= @@ -90,9 +92,9 @@ jobs: needs: [build-docker-image] uses: ./.github/workflows/docker-merge-image.yml with: + target: firestarr-minimal registry: ${{ needs.build-docker-image.outputs.registry }} package: ${{ needs.build-docker-image.outputs.package }} - target: firestarr-minimal flavor: | latest=false prefix= diff --git a/.github/workflows/docker-merge-image.yml b/.github/workflows/docker-merge-image.yml index 8e1c817a0b..2a85752f66 100644 --- a/.github/workflows/docker-merge-image.yml +++ b/.github/workflows/docker-merge-image.yml @@ -16,9 +16,8 @@ on: required: true type: string registry: - required: false + required: true type: string - default: 'ghcr.io' env: BUILDX_NO_DEFAULT_ATTESTATIONS: 1 From 8f0f4e98eeee8174a62e956e585abd012c808ce7 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 11:47:08 -0400 Subject: [PATCH 55/78] add show values --- .github/actions/docker-build-image/action.yml | 2 -- .github/workflows/build-docker.yml | 12 ++++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 72e099d5e1..95699ddf46 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -36,11 +36,9 @@ runs: PLATFORM_PAIR=${PLATFORM//\//} CONTAINER_REGISTRY=${PACKAGE%%\/*} FOUND_REGISTRY=${PACKAGE%\/*} - FOUND_PACKAGE=${PACKAGE##*\/} echo "PLATFORM_PAIR=${PLATFORM_PAIR}" >> $GITHUB_ENV echo "CONTAINER_REGISTRY=${CONTAINER_REGISTRY}" >> $GITHUB_ENV echo "FOUND_REGISTRY=${FOUND_REGISTRY}" >> $GITHUB_ENV - echo "FOUND_PACKAGE=${FOUND_PACKAGE}" >> $GITHUB_ENV echo "REGISTRY_CACHE=${FOUND_REGISTRY}/cache:${PLATFORM_PAIR}" >> $GITHUB_ENV - name: ${{ env.TARGET }} - Docker meta diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 507491d9a8..6c3718186f 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -49,6 +49,12 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 + - name: Show values + run: | + echo "${{ steps.login.inputs.registry }}" + echo "${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }}" + echo "${{ matrix.platform }}" + - uses: ./.github/actions/docker-build-image id: build-firestarr with: @@ -57,6 +63,12 @@ jobs: package: ${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} platform: ${{ matrix.platform }} + - name: Show values + run: | + echo "${{ steps.build-firestarr.inputs.registry }}" + echo "${{ steps.build-firestarr.inputs.package }}" + echo "${{ steps.build-firestarr.inputs.platform }}" + - uses: ./.github/actions/docker-build-image id: build-firestarr-minimal with: From d418a422b59abfc86e50691b92a468cdf6fd8e63 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 11:57:03 -0400 Subject: [PATCH 56/78] remove inputs chaining --- .github/workflows/build-docker.yml | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 6c3718186f..28d14de260 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -28,6 +28,9 @@ jobs: # arm64 == arm64/v8 platform: [amd64, arm64, ppc64le, riscv64, s390x] # platform: [amd64] + env: + registry: 'ghcr.io' + package: ${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} steps: - uses: actions/checkout@v6 with: @@ -39,7 +42,7 @@ jobs: id: login uses: docker/login-action@v4 with: - registry: ghcr.io + registry: ${{ env.registry }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} @@ -51,36 +54,31 @@ jobs: - name: Show values run: | - echo "${{ steps.login.inputs.registry }}" - echo "${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }}" + echo "${{ env.registry }}" + echo "${{ env.package }}" echo "${{ matrix.platform }}" - uses: ./.github/actions/docker-build-image id: build-firestarr with: target: firestarr - registry: ${{ steps.login.inputs.registry }} - package: ${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} + registry: ${{ env.registry }} + package: ${{ env.package }} platform: ${{ matrix.platform }} - - name: Show values - run: | - echo "${{ steps.build-firestarr.inputs.registry }}" - echo "${{ steps.build-firestarr.inputs.package }}" - echo "${{ steps.build-firestarr.inputs.platform }}" - - uses: ./.github/actions/docker-build-image id: build-firestarr-minimal with: target: firestarr-minimal - registry: ${{ steps.build-firestarr.inputs.registry }} - package: ${{ steps.build-firestarr.inputs.package }} - platform: ${{ steps.build-firestarr.inputs.platform }} + registry: ${{ env.registry }} + package: ${{ env.package }} + platform: ${{ matrix.platform }} - name: Set outputs run: | - echo "registry=${{ steps.login.inputs.registry }}" >> $GITHUB_OUTPUT - echo "package=${{ steps.build-firestarr.inputs.package }}" >> $GITHUB_OUTPUT + echo "registry=${{ env.registry }}" >> $GITHUB_OUTPUT + echo "package=${{ env.package }}" >> $GITHUB_OUTPUT + echo "platform=${{ matrix.platform }}" >> $GITHUB_OUTPUT merge-firestarr: needs: [build-docker-image] From 3dcb73a80ae63b822b88957c8634a73ca9ac8788 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 12:07:28 -0400 Subject: [PATCH 57/78] add suffix for pr --- .github/workflows/build-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 28d14de260..cd1ace02d8 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -110,7 +110,7 @@ jobs: prefix= suffix=-minimal tags: | - type=ref,event=pr + type=ref,event=pr,prefix=,suffix=-minimal type=ref,prefix=,suffix=-minimal,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} type=ref,prefix=,suffix=-minimal-latest,event=branch,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} type=semver,pattern={{version}},prefix=,suffix=-minimal,enable=${{ startsWith(github.ref, 'refs/tags/v') }} From 9ff35086101e42d2ef581a81282400a932f89ee6 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 12:26:45 -0400 Subject: [PATCH 58/78] add inputs to outputs --- .github/actions/docker-build-image/action.yml | 7 +++++++ .github/workflows/docker-merge-image.yml | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 95699ddf46..698af0717d 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -78,3 +78,10 @@ runs: path: ${{ runner.temp }}/digests-${{ env.TARGET }}/* if-no-files-found: error retention-days: 1 + + - name: Set outputs + run: | + echo "target=${{ inputs.target }}" >> $GITHUB_OUTPUT + echo "registry=${{ inputs.registry }}" >> $GITHUB_OUTPUT + echo "package=${{ inputs.package }}" >> $GITHUB_OUTPUT + echo "platform=${{ inputs.platform }}" >> $GITHUB_OUTPUT diff --git a/.github/workflows/docker-merge-image.yml b/.github/workflows/docker-merge-image.yml index 2a85752f66..ffc50d5bb2 100644 --- a/.github/workflows/docker-merge-image.yml +++ b/.github/workflows/docker-merge-image.yml @@ -81,3 +81,9 @@ jobs: - name: ${{ env.TARGET }} - Inspect image run: | docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta.outputs.version }} + + - name: Set outputs + run: | + echo "target=${{ inputs.target }}" >> $GITHUB_OUTPUT + echo "registry=${{ inputs.registry }}" >> $GITHUB_OUTPUT + echo "package=${{ inputs.package }}" >> $GITHUB_OUTPUT From 7b96179bb618eaff6ad6e1ef468110b93112211b Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 12:35:31 -0400 Subject: [PATCH 59/78] rename variable to package-name --- .github/actions/docker-build-image/action.yml | 6 +++--- .github/workflows/build-docker.yml | 14 +++++++------- .github/workflows/docker-merge-image.yml | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 698af0717d..039482ca1c 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -6,7 +6,7 @@ inputs: target: required: true type: string - package: + package-name: required: true type: string platform: @@ -26,7 +26,7 @@ runs: shell: bash run: | registry=${{ inputs.registry }}/${GITHUB_REPOSITORY@L} - echo "PACKAGE=${registry}/${{ inputs.package }}" >> $GITHUB_ENV + echo "PACKAGE=${registry}/${{ inputs.package-name }}" >> $GITHUB_ENV echo "TARGET=${{ inputs.target }}" >> $GITHUB_ENV echo "PLATFORM=${{ inputs.platform }}" >> $GITHUB_ENV @@ -83,5 +83,5 @@ runs: run: | echo "target=${{ inputs.target }}" >> $GITHUB_OUTPUT echo "registry=${{ inputs.registry }}" >> $GITHUB_OUTPUT - echo "package=${{ inputs.package }}" >> $GITHUB_OUTPUT + echo "package-name=${{ inputs.package-name }}" >> $GITHUB_OUTPUT echo "platform=${{ inputs.platform }}" >> $GITHUB_OUTPUT diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index cd1ace02d8..ae7042e5c1 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -30,7 +30,7 @@ jobs: # platform: [amd64] env: registry: 'ghcr.io' - package: ${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} + package-name: ${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} steps: - uses: actions/checkout@v6 with: @@ -55,7 +55,7 @@ jobs: - name: Show values run: | echo "${{ env.registry }}" - echo "${{ env.package }}" + echo "${{ env.package-name }}" echo "${{ matrix.platform }}" - uses: ./.github/actions/docker-build-image @@ -63,7 +63,7 @@ jobs: with: target: firestarr registry: ${{ env.registry }} - package: ${{ env.package }} + package-name: ${{ env.package-name }} platform: ${{ matrix.platform }} - uses: ./.github/actions/docker-build-image @@ -71,13 +71,13 @@ jobs: with: target: firestarr-minimal registry: ${{ env.registry }} - package: ${{ env.package }} + package-name: ${{ env.package-name }} platform: ${{ matrix.platform }} - name: Set outputs run: | echo "registry=${{ env.registry }}" >> $GITHUB_OUTPUT - echo "package=${{ env.package }}" >> $GITHUB_OUTPUT + echo "package-name=${{ env.package-name }}" >> $GITHUB_OUTPUT echo "platform=${{ matrix.platform }}" >> $GITHUB_OUTPUT merge-firestarr: @@ -86,7 +86,7 @@ jobs: with: target: firestarr registry: ${{ needs.build-docker-image.outputs.registry }} - package: ${{ needs.build-docker-image.outputs.package }} + package-name: ${{ needs.build-docker-image.outputs.package-name }} flavor: | latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} prefix= @@ -104,7 +104,7 @@ jobs: with: target: firestarr-minimal registry: ${{ needs.build-docker-image.outputs.registry }} - package: ${{ needs.build-docker-image.outputs.package }} + package-name: ${{ needs.build-docker-image.outputs.package-name }} flavor: | latest=false prefix= diff --git a/.github/workflows/docker-merge-image.yml b/.github/workflows/docker-merge-image.yml index ffc50d5bb2..fa6ff1eb1e 100644 --- a/.github/workflows/docker-merge-image.yml +++ b/.github/workflows/docker-merge-image.yml @@ -6,7 +6,7 @@ on: target: required: true type: string - package: + package-name: required: true type: string flavor: @@ -38,7 +38,7 @@ jobs: - name: Prepare environment run: | registry=${{ inputs.registry }}/${GITHUB_REPOSITORY@L} - echo "PACKAGE=${registry}/${{ inputs.package }}" >> $GITHUB_ENV + echo "PACKAGE=${registry}/${{ inputs.package-name }}" >> $GITHUB_ENV echo "TARGET=${{ inputs.target }}" >> $GITHUB_ENV - name: Find variables @@ -86,4 +86,4 @@ jobs: run: | echo "target=${{ inputs.target }}" >> $GITHUB_OUTPUT echo "registry=${{ inputs.registry }}" >> $GITHUB_OUTPUT - echo "package=${{ inputs.package }}" >> $GITHUB_OUTPUT + echo "package-name=${{ inputs.package-name }}" >> $GITHUB_OUTPUT From cd02f9415f0502d92fa369c0e66751d958edf9f3 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 12:37:17 -0400 Subject: [PATCH 60/78] fix shell --- .github/actions/docker-build-image/action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 039482ca1c..202c55fb59 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -80,6 +80,7 @@ runs: retention-days: 1 - name: Set outputs + shell: bash run: | echo "target=${{ inputs.target }}" >> $GITHUB_OUTPUT echo "registry=${{ inputs.registry }}" >> $GITHUB_OUTPUT From 047f28118049c30526d9c0d12644ba032d54a450 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 13:11:48 -0400 Subject: [PATCH 61/78] amd64 only for testing --- .github/workflows/build-docker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index ae7042e5c1..35e037d5d0 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -26,8 +26,8 @@ jobs: # no point in more than base image supports # ignore 32-bit - 386, arm/v5, arm/v7 # arm64 == arm64/v8 - platform: [amd64, arm64, ppc64le, riscv64, s390x] - # platform: [amd64] + # platform: [amd64, arm64, ppc64le, riscv64, s390x] + platform: [amd64] env: registry: 'ghcr.io' package-name: ${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} From 55331392202f49bc154fcec712a8a693746437d3 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 13:11:56 -0400 Subject: [PATCH 62/78] assign outputs at job level --- .github/workflows/build-docker.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 35e037d5d0..6bee7d952e 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -75,11 +75,16 @@ jobs: platform: ${{ matrix.platform }} - name: Set outputs + id: output run: | echo "registry=${{ env.registry }}" >> $GITHUB_OUTPUT echo "package-name=${{ env.package-name }}" >> $GITHUB_OUTPUT echo "platform=${{ matrix.platform }}" >> $GITHUB_OUTPUT + outputs: + registry: ${{ steps.output.outputs.registry }} + package-name: ${{ steps.output.outputs.package-name }} + merge-firestarr: needs: [build-docker-image] uses: ./.github/workflows/docker-merge-image.yml From 24a4cfe29f39de54f7ec22df2c57a14e2038b6d7 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 13:18:41 -0400 Subject: [PATCH 63/78] export output directory from build step --- .github/workflows/build-docker.yml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 6bee7d952e..1316b530ef 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -74,16 +74,9 @@ jobs: package-name: ${{ env.package-name }} platform: ${{ matrix.platform }} - - name: Set outputs - id: output - run: | - echo "registry=${{ env.registry }}" >> $GITHUB_OUTPUT - echo "package-name=${{ env.package-name }}" >> $GITHUB_OUTPUT - echo "platform=${{ matrix.platform }}" >> $GITHUB_OUTPUT - outputs: - registry: ${{ steps.output.outputs.registry }} - package-name: ${{ steps.output.outputs.package-name }} + registry: ${{ steps.build-firestarr.outputs.registry }} + package-name: ${{ steps.build-firestarr.outputs.package-name }} merge-firestarr: needs: [build-docker-image] From a20c0e5d075b61bf3dd3c94c6e20829ea2ec08a5 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 13:25:52 -0400 Subject: [PATCH 64/78] use full package url for merge input --- .github/actions/docker-build-image/action.yml | 1 + .github/workflows/build-docker.yml | 6 ++---- .github/workflows/docker-merge-image.yml | 12 +++--------- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 202c55fb59..67d5dc7e72 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -86,3 +86,4 @@ runs: echo "registry=${{ inputs.registry }}" >> $GITHUB_OUTPUT echo "package-name=${{ inputs.package-name }}" >> $GITHUB_OUTPUT echo "platform=${{ inputs.platform }}" >> $GITHUB_OUTPUT + echo "package=${{ env.PACKAGE }}" >> $GITHUB_OUTPUT diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 1316b530ef..bed9956b31 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -83,8 +83,7 @@ jobs: uses: ./.github/workflows/docker-merge-image.yml with: target: firestarr - registry: ${{ needs.build-docker-image.outputs.registry }} - package-name: ${{ needs.build-docker-image.outputs.package-name }} + package: ${{ needs.build-docker-image.outputs.package }} flavor: | latest=${{ case ( startsWith(github.ref, 'refs/tags/v'), 'auto', 'false' ) }} prefix= @@ -101,8 +100,7 @@ jobs: uses: ./.github/workflows/docker-merge-image.yml with: target: firestarr-minimal - registry: ${{ needs.build-docker-image.outputs.registry }} - package-name: ${{ needs.build-docker-image.outputs.package-name }} + package: ${{ needs.build-docker-image.outputs.package }} flavor: | latest=false prefix= diff --git a/.github/workflows/docker-merge-image.yml b/.github/workflows/docker-merge-image.yml index fa6ff1eb1e..24abb43c22 100644 --- a/.github/workflows/docker-merge-image.yml +++ b/.github/workflows/docker-merge-image.yml @@ -6,7 +6,7 @@ on: target: required: true type: string - package-name: + package: required: true type: string flavor: @@ -15,9 +15,6 @@ on: tags: required: true type: string - registry: - required: true - type: string env: BUILDX_NO_DEFAULT_ATTESTATIONS: 1 @@ -37,14 +34,12 @@ jobs: - name: Prepare environment run: | - registry=${{ inputs.registry }}/${GITHUB_REPOSITORY@L} - echo "PACKAGE=${registry}/${{ inputs.package-name }}" >> $GITHUB_ENV + echo "PACKAGE=${{ inputs.package }}" >> $GITHUB_ENV echo "TARGET=${{ inputs.target }}" >> $GITHUB_ENV - name: Find variables run: | echo "CONTAINER_REGISTRY=${PACKAGE%%\/*}" >> $GITHUB_ENV - echo "FOUND_REGISTRY=${PACKAGE%\/*}" >> $GITHUB_ENV echo "FOUND_PACKAGE=${PACKAGE##*\/}" >> $GITHUB_ENV - name: Login to GHCR @@ -85,5 +80,4 @@ jobs: - name: Set outputs run: | echo "target=${{ inputs.target }}" >> $GITHUB_OUTPUT - echo "registry=${{ inputs.registry }}" >> $GITHUB_OUTPUT - echo "package-name=${{ inputs.package-name }}" >> $GITHUB_OUTPUT + echo "package=${{ inputs.package }}" >> $GITHUB_OUTPUT From d7163806a8508822e54ec5498e330b3faf49a783 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 13:27:32 -0400 Subject: [PATCH 65/78] fix missing output --- .github/workflows/build-docker.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index bed9956b31..fd7053bf95 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -77,6 +77,7 @@ jobs: outputs: registry: ${{ steps.build-firestarr.outputs.registry }} package-name: ${{ steps.build-firestarr.outputs.package-name }} + package: ${{ steps.build-firestarr.outputs.package }} merge-firestarr: needs: [build-docker-image] From 44f8ab910af54bc4df067b290e7f993026236747 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 13:36:12 -0400 Subject: [PATCH 66/78] Revert "export output directory from build step" This reverts commit d09a3edddc094b908cbd838752b2a6fbf2b8b515. --- .github/workflows/build-docker.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index fd7053bf95..8764fcdac8 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -74,10 +74,15 @@ jobs: package-name: ${{ env.package-name }} platform: ${{ matrix.platform }} + - name: Set outputs + id: output + run: | + echo "registry=${{ env.registry }}" >> $GITHUB_OUTPUT + echo "package=${{ steps.build-firestarr.package }}" >> $GITHUB_OUTPUT + outputs: - registry: ${{ steps.build-firestarr.outputs.registry }} - package-name: ${{ steps.build-firestarr.outputs.package-name }} - package: ${{ steps.build-firestarr.outputs.package }} + registry: ${{ steps.output.outputs.registry }} + package: ${{ steps.output.outputs.package }} merge-firestarr: needs: [build-docker-image] From c2e2844f53b169a037e338a543b2d7b3d92966a1 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 13:42:43 -0400 Subject: [PATCH 67/78] add outputs to action --- .github/actions/docker-build-image/action.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 67d5dc7e72..36823f9282 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -80,6 +80,7 @@ runs: retention-days: 1 - name: Set outputs + id: output shell: bash run: | echo "target=${{ inputs.target }}" >> $GITHUB_OUTPUT @@ -87,3 +88,10 @@ runs: echo "package-name=${{ inputs.package-name }}" >> $GITHUB_OUTPUT echo "platform=${{ inputs.platform }}" >> $GITHUB_OUTPUT echo "package=${{ env.PACKAGE }}" >> $GITHUB_OUTPUT + + outputs: + target: ${{ steps.output.outputs.target }} + registry: ${{ steps.output.outputs.registry }} + package-name: ${{ steps.output.outputs.package-name }} + platform: ${{ steps.output.outputs.platform }} + package: ${{ steps.output.outputs.package }} From bd6196adc2a391252ef8fde00f2733a60c71df1b Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 13:46:30 -0400 Subject: [PATCH 68/78] fix indent --- .github/actions/docker-build-image/action.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 36823f9282..204262c58b 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -89,9 +89,9 @@ runs: echo "platform=${{ inputs.platform }}" >> $GITHUB_OUTPUT echo "package=${{ env.PACKAGE }}" >> $GITHUB_OUTPUT - outputs: - target: ${{ steps.output.outputs.target }} - registry: ${{ steps.output.outputs.registry }} - package-name: ${{ steps.output.outputs.package-name }} - platform: ${{ steps.output.outputs.platform }} - package: ${{ steps.output.outputs.package }} +outputs: + target: ${{ steps.output.outputs.target }} + registry: ${{ steps.output.outputs.registry }} + package-name: ${{ steps.output.outputs.package-name }} + platform: ${{ steps.output.outputs.platform }} + package: ${{ steps.output.outputs.package }} From 0833b3535f477076718c1be26438b490a5a33a83 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 13:52:48 -0400 Subject: [PATCH 69/78] move outputs --- .github/actions/docker-build-image/action.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 204262c58b..9e36891082 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -19,6 +19,14 @@ inputs: env: BUILDX_NO_DEFAULT_ATTESTATIONS: 1 +outputs: + registry: + description: "Container registry" + value: ${{ steps.output.outputs.registry }} + package: + description: "Container package" + value: ${{ steps.output.outputs.package }} + runs: using: "composite" steps: @@ -88,10 +96,3 @@ runs: echo "package-name=${{ inputs.package-name }}" >> $GITHUB_OUTPUT echo "platform=${{ inputs.platform }}" >> $GITHUB_OUTPUT echo "package=${{ env.PACKAGE }}" >> $GITHUB_OUTPUT - -outputs: - target: ${{ steps.output.outputs.target }} - registry: ${{ steps.output.outputs.registry }} - package-name: ${{ steps.output.outputs.package-name }} - platform: ${{ steps.output.outputs.platform }} - package: ${{ steps.output.outputs.package }} From fdb31a6649c517852b57704143b0086367b57aa9 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 14:01:02 -0400 Subject: [PATCH 70/78] fix output --- .github/workflows/build-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 8764fcdac8..73639b68db 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -78,7 +78,7 @@ jobs: id: output run: | echo "registry=${{ env.registry }}" >> $GITHUB_OUTPUT - echo "package=${{ steps.build-firestarr.package }}" >> $GITHUB_OUTPUT + echo "package=${{ steps.build-firestarr.outputs.package }}" >> $GITHUB_OUTPUT outputs: registry: ${{ steps.output.outputs.registry }} From 7ffa64d38299f3062ffad7ec87053003de056e4b Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 14:11:18 -0400 Subject: [PATCH 71/78] remove env variables for inputs --- .github/workflows/docker-merge-image.yml | 29 ++++++++++-------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/.github/workflows/docker-merge-image.yml b/.github/workflows/docker-merge-image.yml index 24abb43c22..a087fd6ec7 100644 --- a/.github/workflows/docker-merge-image.yml +++ b/.github/workflows/docker-merge-image.yml @@ -34,13 +34,8 @@ jobs: - name: Prepare environment run: | - echo "PACKAGE=${{ inputs.package }}" >> $GITHUB_ENV - echo "TARGET=${{ inputs.target }}" >> $GITHUB_ENV - - - name: Find variables - run: | - echo "CONTAINER_REGISTRY=${PACKAGE%%\/*}" >> $GITHUB_ENV - echo "FOUND_PACKAGE=${PACKAGE##*\/}" >> $GITHUB_ENV + package=${{ inputs.package }} + echo "CONTAINER_REGISTRY=${package%%\/*}" >> $GITHUB_ENV - name: Login to GHCR uses: docker/login-action@v4 @@ -52,30 +47,30 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - - name: ${{ env.TARGET }} - Download digests + - name: ${{ inputs.target }} - Download digests uses: actions/download-artifact@v8 with: - path: ${{ runner.temp }}/digests-${{ env.TARGET }} - pattern: digests-${{ env.TARGET }}-* + path: ${{ runner.temp }}/digests-${{ inputs.target }} + pattern: digests-${{ inputs.target }}-* merge-multiple: true - - name: ${{ env.TARGET }} - Docker meta + - name: ${{ inputs.target }} - Docker meta id: meta uses: docker/metadata-action@v6 with: - images: ${{ env.PACKAGE }} + images: ${{ inputs.package }} flavor: ${{ inputs.flavor }} tags: ${{ inputs.tags }} - - name: ${{ env.TARGET }} - Create manifest list and push - working-directory: ${{ runner.temp }}/digests-${{ env.TARGET }} + - name: ${{ inputs.target }} - Create manifest list and push + working-directory: ${{ runner.temp }}/digests-${{ inputs.target }} run: | docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.PACKAGE }}@sha256:%s ' *) + $(printf '${{ inputs.package }}@sha256:%s ' *) - - name: ${{ env.TARGET }} - Inspect image + - name: ${{ inputs.target }} - Inspect image run: | - docker buildx imagetools inspect ${{ env.PACKAGE }}:${{ steps.meta.outputs.version }} + docker buildx imagetools inspect ${{ inputs.package }}:${{ steps.meta.outputs.version }} - name: Set outputs run: | From 84035b2fb618fd80dba1481742e5be0dbda04079 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 14:15:26 -0400 Subject: [PATCH 72/78] remove unused outputs --- .github/actions/docker-build-image/action.yml | 7 ------- .github/workflows/build-docker.yml | 2 -- 2 files changed, 9 deletions(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 9e36891082..39fec5e9ec 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -20,9 +20,6 @@ env: BUILDX_NO_DEFAULT_ATTESTATIONS: 1 outputs: - registry: - description: "Container registry" - value: ${{ steps.output.outputs.registry }} package: description: "Container package" value: ${{ steps.output.outputs.package }} @@ -91,8 +88,4 @@ runs: id: output shell: bash run: | - echo "target=${{ inputs.target }}" >> $GITHUB_OUTPUT - echo "registry=${{ inputs.registry }}" >> $GITHUB_OUTPUT - echo "package-name=${{ inputs.package-name }}" >> $GITHUB_OUTPUT - echo "platform=${{ inputs.platform }}" >> $GITHUB_OUTPUT echo "package=${{ env.PACKAGE }}" >> $GITHUB_OUTPUT diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 73639b68db..1af09e91b6 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -77,11 +77,9 @@ jobs: - name: Set outputs id: output run: | - echo "registry=${{ env.registry }}" >> $GITHUB_OUTPUT echo "package=${{ steps.build-firestarr.outputs.package }}" >> $GITHUB_OUTPUT outputs: - registry: ${{ steps.output.outputs.registry }} package: ${{ steps.output.outputs.package }} merge-firestarr: From 8ccc3c3315083ed8cb8bec2a91eee0b8f7413daf Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 14:23:07 -0400 Subject: [PATCH 73/78] simplify variables --- .github/actions/docker-build-image/action.yml | 41 ++++++++----------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 39fec5e9ec..4ca197b26c 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -30,36 +30,27 @@ runs: - name: Prepare environment shell: bash run: | - registry=${{ inputs.registry }}/${GITHUB_REPOSITORY@L} - echo "PACKAGE=${registry}/${{ inputs.package-name }}" >> $GITHUB_ENV - echo "TARGET=${{ inputs.target }}" >> $GITHUB_ENV - echo "PLATFORM=${{ inputs.platform }}" >> $GITHUB_ENV + platform=${{ inputs.platform }} + platform_pair=${platform//\//} + package=${{ inputs.registry }}/${GITHUB_REPOSITORY@L}/${{ inputs.package-name }} + echo "REGISTRY_CACHE=${package%\/*}/cache:${platform_pair}" >> $GITHUB_ENV + echo "PLATFORM_PAIR=${platform_pair}" >> $GITHUB_ENV + echo "PACKAGE=${package}" >> $GITHUB_ENV - - name: Find variables - shell: bash - run: | - PLATFORM_PAIR=${PLATFORM//\//} - CONTAINER_REGISTRY=${PACKAGE%%\/*} - FOUND_REGISTRY=${PACKAGE%\/*} - echo "PLATFORM_PAIR=${PLATFORM_PAIR}" >> $GITHUB_ENV - echo "CONTAINER_REGISTRY=${CONTAINER_REGISTRY}" >> $GITHUB_ENV - echo "FOUND_REGISTRY=${FOUND_REGISTRY}" >> $GITHUB_ENV - echo "REGISTRY_CACHE=${FOUND_REGISTRY}/cache:${PLATFORM_PAIR}" >> $GITHUB_ENV - - - name: ${{ env.TARGET }} - Docker meta + - name: ${{ inputs.target }} - Docker meta id: meta uses: docker/metadata-action@v6 with: images: ${{ env.PACKAGE }} - - name: ${{ env.TARGET }} - Build and push by digest + - name: ${{ inputs.target }} - Build and push by digest id: build uses: docker/build-push-action@v7 with: context: . file: .docker/Dockerfile - target: ${{ env.TARGET }} - platforms: linux/${{ env.PLATFORM }} + target: ${{ inputs.target }} + platforms: linux/${{ inputs.platform }} labels: ${{ steps.meta.outputs.labels }} tags: ${{ env.PACKAGE }} push: ${{ github.event_name != 'pull_request' }} @@ -69,18 +60,18 @@ runs: cache-to: | type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} - - name: ${{ env.TARGET }} - Export digest + - name: ${{ inputs.target }} - Export digest shell: bash run: | - mkdir -p ${{ runner.temp }}/digests-${{ env.TARGET }} + mkdir -p ${{ runner.temp }}/digests-${{ inputs.target }} digest="${{ steps.build.outputs.digest }}" - touch "${{ runner.temp }}/digests-${{ env.TARGET }}/${digest#sha256:}" + touch "${{ runner.temp }}/digests-${{ inputs.target }}/${digest#sha256:}" - - name: ${{ env.TARGET }} - Upload digest + - name: ${{ inputs.target }} - Upload digest uses: actions/upload-artifact@v7 with: - name: digests-${{ env.TARGET }}-${{ env.PLATFORM_PAIR }} - path: ${{ runner.temp }}/digests-${{ env.TARGET }}/* + name: digests-${{ inputs.target }}-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests-${{ inputs.target }}/* if-no-files-found: error retention-days: 1 From 11b767a40b6b79c6bb7290220335a6536f57fdb9 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 14:39:24 -0400 Subject: [PATCH 74/78] output directly from step --- .github/workflows/build-docker.yml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 1af09e91b6..b00808fd61 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -52,12 +52,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - - name: Show values - run: | - echo "${{ env.registry }}" - echo "${{ env.package-name }}" - echo "${{ matrix.platform }}" - - uses: ./.github/actions/docker-build-image id: build-firestarr with: @@ -74,13 +68,8 @@ jobs: package-name: ${{ env.package-name }} platform: ${{ matrix.platform }} - - name: Set outputs - id: output - run: | - echo "package=${{ steps.build-firestarr.outputs.package }}" >> $GITHUB_OUTPUT - outputs: - package: ${{ steps.output.outputs.package }} + package: ${{ steps.build-firestarr.outputs.package }} merge-firestarr: needs: [build-docker-image] From dd82a95def2182158fc92963ad7484e804dc975c Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 15:13:55 -0400 Subject: [PATCH 75/78] add other platforms --- .github/workflows/build-docker.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index b00808fd61..a2e2c6baf9 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -26,8 +26,7 @@ jobs: # no point in more than base image supports # ignore 32-bit - 386, arm/v5, arm/v7 # arm64 == arm64/v8 - # platform: [amd64, arm64, ppc64le, riscv64, s390x] - platform: [amd64] + platform: [amd64, arm64, ppc64le, riscv64, s390x] env: registry: 'ghcr.io' package-name: ${{ case( startsWith(github.ref, 'refs/tags/v') || contains('["main", "dev", "unstable"]', github.ref_name), 'firestarr', 'cache' ) }} From 40215d74a5f694ec6bf94a954900d07c78689008 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 15:39:57 -0400 Subject: [PATCH 76/78] multiple caches --- .github/actions/docker-build-image/action.yml | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index 4ca197b26c..d7b6be6bd5 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -30,12 +30,15 @@ runs: - name: Prepare environment shell: bash run: | - platform=${{ inputs.platform }} - platform_pair=${platform//\//} - package=${{ inputs.registry }}/${GITHUB_REPOSITORY@L}/${{ inputs.package-name }} - echo "REGISTRY_CACHE=${package%\/*}/cache:${platform_pair}" >> $GITHUB_ENV - echo "PLATFORM_PAIR=${platform_pair}" >> $GITHUB_ENV - echo "PACKAGE=${package}" >> $GITHUB_ENV + echo "PLATFORM=${{ inputs.platform }}" >> $GITHUB_ENV + echo "REPO=${{ inputs.registry }}/${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV + + - name: Set variables + shell: bash + run: | + echo "PLATFORM_PAIR=${PLATFORM//\//}" >> $GITHUB_ENV + echo "PACKAGE=${REPO}/${{ inputs.package-name }}" >> $GITHUB_ENV + echo "REGISTRY_CACHE=${REPO}/cache" >> $GITHUB_ENV - name: ${{ inputs.target }} - Docker meta id: meta @@ -56,9 +59,13 @@ runs: push: ${{ github.event_name != 'pull_request' }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | + type=registry,ref=${{ env.PACKAGE }} + type=registry,ref=${{ env.REGISTRY_CACHE }}:${{ env.PLATFORM_PAIR }}-${{ github.ref_name }} + type=registry,ref=${{ env.REGISTRY_CACHE }}:${{ env.PLATFORM_PAIR }} type=registry,ref=${{ env.REGISTRY_CACHE }} cache-to: | - type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }} + type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }}:${{ env.PLATFORM_PAIR }}-${{ github.ref_name }} + type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }}:${{ env.PLATFORM_PAIR }} - name: ${{ inputs.target }} - Export digest shell: bash From 9ecd72073d91350cd547c10054791066fc59a162 Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 16:08:32 -0400 Subject: [PATCH 77/78] remove slashes from cache ref --- .github/actions/docker-build-image/action.yml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/actions/docker-build-image/action.yml b/.github/actions/docker-build-image/action.yml index d7b6be6bd5..80f1e2b080 100644 --- a/.github/actions/docker-build-image/action.yml +++ b/.github/actions/docker-build-image/action.yml @@ -30,13 +30,11 @@ runs: - name: Prepare environment shell: bash run: | - echo "PLATFORM=${{ inputs.platform }}" >> $GITHUB_ENV - echo "REPO=${{ inputs.registry }}/${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV - - - name: Set variables - shell: bash - run: | + PLATFORM=${{ inputs.platform }} + REPO=${{ inputs.registry }}/${GITHUB_REPOSITORY@L} + REF_NAME=${{ github.ref_name }} echo "PLATFORM_PAIR=${PLATFORM//\//}" >> $GITHUB_ENV + echo "CACHE_REF=${REF_NAME//\//}" >> $GITHUB_ENV echo "PACKAGE=${REPO}/${{ inputs.package-name }}" >> $GITHUB_ENV echo "REGISTRY_CACHE=${REPO}/cache" >> $GITHUB_ENV @@ -60,11 +58,11 @@ runs: outputs: type=image,push-by-digest=true,name-canonical=true,push=true cache-from: | type=registry,ref=${{ env.PACKAGE }} - type=registry,ref=${{ env.REGISTRY_CACHE }}:${{ env.PLATFORM_PAIR }}-${{ github.ref_name }} + type=registry,ref=${{ env.REGISTRY_CACHE }}:${{ env.PLATFORM_PAIR }}-${{ env.CACHE_REF }} type=registry,ref=${{ env.REGISTRY_CACHE }}:${{ env.PLATFORM_PAIR }} type=registry,ref=${{ env.REGISTRY_CACHE }} cache-to: | - type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }}:${{ env.PLATFORM_PAIR }}-${{ github.ref_name }} + type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }}:${{ env.PLATFORM_PAIR }}-${{ env.CACHE_REF }} type=registry,mode=max,ref=${{ env.REGISTRY_CACHE }}:${{ env.PLATFORM_PAIR }} - name: ${{ inputs.target }} - Export digest From bf6809deb53ae7bc370bde22e2d6d597ec0fd39e Mon Sep 17 00:00:00 2001 From: Jordan Evens Date: Thu, 17 Sep 2026 18:09:18 -0400 Subject: [PATCH 78/78] v0.9.19 --- .env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env b/.env index 4869b3a43b..3b12fa72f9 100644 --- a/.env +++ b/.env @@ -1 +1 @@ -VERSION=0.9.16 +VERSION=0.9.19