From ef6cf5ea91cf66566262498c87fe087d4f4d9916 Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:27:00 +1100 Subject: [PATCH 01/13] Add github action to publish docker iamges --- .github/workflows/docker-publish.yml | 87 ++++++++++++++++++++++++++++ manifest.yaml | 1 + 2 files changed, 88 insertions(+) create mode 100644 .github/workflows/docker-publish.yml diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 0000000..fc92db3 --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,87 @@ +name: Build & Publish Docker Images + +on: + push: + branches: ["master"] + +jobs: + discover-dockerfiles: + runs-on: ubuntu-latest + outputs: + dockerfiles: ${{ steps.set-output.outputs.dockerfiles }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Generate matrix from manifest.yaml + id: extract + run: | + files=() + + # Iterate all root keys + roots=$(yq e -r 'keys | .[]' manifest.yaml) + for root in $roots; do + # Iterate versions using process substitution to avoid subshell issues + while read -r version; do + echo "Found ${root} | ${version}" + dockerfile="./${root}/${version}/Dockerfile" + # Read image_name + image_name=$(yq e -r ".${root}.versions.\"${version}\".image_name" manifest.yaml) + echo "Image name: ${image_name}" + if [ -n "$image_name" ] && [ "$image_name" != "null" ]; then + files+=("$dockerfile|$image_name") + fi + done < <(yq e -r ".${root}.versions | keys | .[]" manifest.yaml) + done + + # Convert array to JSON for GitHub Actions matrix + json=$(printf '%s\n' "${files[@]}" | jq -R . | jq -s .) + echo "dockerfiles=$json" >> $GITHUB_OUTPUT + + - name: Set output + id: set-output + run: echo "dockerfiles=${{ steps.extract.outputs.dockerfiles }}" >> $GITHUB_OUTPUT + + build-and-push: + needs: discover-dockerfiles + runs-on: ubuntu-latest + strategy: + matrix: + entry: ${{ fromJson(needs.discover-dockerfiles.outputs.dockerfiles) }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Debug matrix + run: | + echo "Matrix entries:" + echo "${{ matrix.entry }}" + + - name: Parse Dockerfile and image + id: metadata + run: | + dockerfile="${{ matrix.entry%%|* }}" + image="${{ matrix.entry##*| }}" + dir=$(dirname "$dockerfile") + echo "directory=$dir" >> $GITHUB_OUTPUT + echo "image=$image" >> $GITHUB_OUTPUT + + - name: Build and push image + uses: docker/build-push-action@v6 + with: + context: ${{ steps.metadata.outputs.directory }} + file: ${{ steps.metadata.outputs.directory }}/Dockerfile + push: false + tags: | + ${{ steps.metadata.outputs.image }}:latest + ${{ steps.metadata.outputs.image }}:${{ github.sha::7 }} diff --git a/manifest.yaml b/manifest.yaml index f6030bb..b3af510 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -1,6 +1,7 @@ dotnet: versions: '8.0/aspnet': + image_name: clickview/dotnet-core-aspnet:8.0 data: image_repo: mcr.microsoft.com/dotnet/aspnet image_version: 8.0.19 From a2280500c526501b5534ed480ca225c8a7e7aca9 Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:28:46 +1100 Subject: [PATCH 02/13] Fixes --- .github/workflows/docker-publish.yml | 32 ++++++++++++---------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index fc92db3..7eca322 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -8,7 +8,7 @@ jobs: discover-dockerfiles: runs-on: ubuntu-latest outputs: - dockerfiles: ${{ steps.set-output.outputs.dockerfiles }} + dockerfiles: ${{ steps.extract.outputs.dockerfiles }} steps: - name: Checkout repository uses: actions/checkout@v4 @@ -21,27 +21,22 @@ jobs: # Iterate all root keys roots=$(yq e -r 'keys | .[]' manifest.yaml) for root in $roots; do - # Iterate versions using process substitution to avoid subshell issues while read -r version; do echo "Found ${root} | ${version}" dockerfile="./${root}/${version}/Dockerfile" - # Read image_name + # Read image_name safely image_name=$(yq e -r ".${root}.versions.\"${version}\".image_name" manifest.yaml) - echo "Image name: ${image_name}" + echo "Image name: $image_name" if [ -n "$image_name" ] && [ "$image_name" != "null" ]; then files+=("$dockerfile|$image_name") fi done < <(yq e -r ".${root}.versions | keys | .[]" manifest.yaml) done - # Convert array to JSON for GitHub Actions matrix + # Convert array to JSON for matrix json=$(printf '%s\n' "${files[@]}" | jq -R . | jq -s .) echo "dockerfiles=$json" >> $GITHUB_OUTPUT - - name: Set output - id: set-output - run: echo "dockerfiles=${{ steps.extract.outputs.dockerfiles }}" >> $GITHUB_OUTPUT - build-and-push: needs: discover-dockerfiles runs-on: ubuntu-latest @@ -62,26 +57,27 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Debug matrix - run: | - echo "Matrix entries:" - echo "${{ matrix.entry }}" - - name: Parse Dockerfile and image id: metadata run: | - dockerfile="${{ matrix.entry%%|* }}" - image="${{ matrix.entry##*| }}" + # Split matrix.entry into Dockerfile and image + dockerfile="${{ matrix.entry }}" + dockerfile="${dockerfile%%|*}" + image="${{ matrix.entry }}" + image="${image##*|}" dir=$(dirname "$dockerfile") + short_sha="${GITHUB_SHA:0:7}" + echo "directory=$dir" >> $GITHUB_OUTPUT echo "image=$image" >> $GITHUB_OUTPUT + echo "short_sha=$short_sha" >> $GITHUB_OUTPUT - name: Build and push image uses: docker/build-push-action@v6 with: context: ${{ steps.metadata.outputs.directory }} file: ${{ steps.metadata.outputs.directory }}/Dockerfile - push: false + push: true tags: | ${{ steps.metadata.outputs.image }}:latest - ${{ steps.metadata.outputs.image }}:${{ github.sha::7 }} + ${{ steps.metadata.outputs.image }}:${{ steps.metadata.outputs.short_sha }} From ee90913b16afaaec48eab40ffca1f07a61c040c6 Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:33:55 +1100 Subject: [PATCH 03/13] Add workflow_dispatch --- .github/workflows/docker-publish.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 7eca322..560c11b 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -2,7 +2,9 @@ name: Build & Publish Docker Images on: push: - branches: ["master"] + branches: + - master + workflow_dispatch: jobs: discover-dockerfiles: From 41bb53d02b815fb36bb9f137243ce2bd72a505ab Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:38:36 +1100 Subject: [PATCH 04/13] test --- .github/workflows/docker-publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 560c11b..d358f79 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -83,3 +83,4 @@ jobs: tags: | ${{ steps.metadata.outputs.image }}:latest ${{ steps.metadata.outputs.image }}:${{ steps.metadata.outputs.short_sha }} + From 79c1289231aa52ffca28ca4675581f7d38c42a46 Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:38:58 +1100 Subject: [PATCH 05/13] test --- .github/workflows/docker-publish.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index d358f79..5e534e5 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -1,9 +1,6 @@ name: Build & Publish Docker Images on: - push: - branches: - - master workflow_dispatch: jobs: From 4e55a360058ff85ab49ed9a6e69de8ccb9e20f48 Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:40:26 +1100 Subject: [PATCH 06/13] test --- .github/workflows/docker-publish.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 5e534e5..298da2e 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -1,6 +1,10 @@ name: Build & Publish Docker Images on: + push: + branches: + - master + pull_request: workflow_dispatch: jobs: @@ -80,4 +84,3 @@ jobs: tags: | ${{ steps.metadata.outputs.image }}:latest ${{ steps.metadata.outputs.image }}:${{ steps.metadata.outputs.short_sha }} - From f9c431cc23a660c72e74702aec7df8ace9078299 Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:41:52 +1100 Subject: [PATCH 07/13] fix --- .github/workflows/docker-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 298da2e..787f686 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -37,7 +37,7 @@ jobs: done # Convert array to JSON for matrix - json=$(printf '%s\n' "${files[@]}" | jq -R . | jq -s .) + json=$(printf '%s\n' "${files[@]}" | jq -R -c . | jq -c -s .) echo "dockerfiles=$json" >> $GITHUB_OUTPUT build-and-push: From da776801ee9d93dd3f46c96c4f5e5374ad0864a1 Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:42:53 +1100 Subject: [PATCH 08/13] dont push --- .github/workflows/docker-publish.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 787f686..98b5eb7 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -54,12 +54,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Log in to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Parse Dockerfile and image id: metadata run: | @@ -80,7 +74,7 @@ jobs: with: context: ${{ steps.metadata.outputs.directory }} file: ${{ steps.metadata.outputs.directory }}/Dockerfile - push: true + push: false tags: | ${{ steps.metadata.outputs.image }}:latest ${{ steps.metadata.outputs.image }}:${{ steps.metadata.outputs.short_sha }} From a6f5b12473a55b0467e5ed40a10fefaee06a22e7 Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:44:42 +1100 Subject: [PATCH 09/13] the image name already contains the tag --- .github/workflows/docker-publish.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 98b5eb7..ec4a410 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -76,5 +76,4 @@ jobs: file: ${{ steps.metadata.outputs.directory }}/Dockerfile push: false tags: | - ${{ steps.metadata.outputs.image }}:latest - ${{ steps.metadata.outputs.image }}:${{ steps.metadata.outputs.short_sha }} + ${{ steps.metadata.outputs.image }} From d3c1751f7883876116297bb5c795ab98afb3277e Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:49:01 +1100 Subject: [PATCH 10/13] update --- .github/workflows/docker-publish.yml | 29 +++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index ec4a410..6229203 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -6,6 +6,11 @@ on: - master pull_request: workflow_dispatch: + inputs: + dry_run: + description: 'Build images only, do not push' + required: false + default: 'true' jobs: discover-dockerfiles: @@ -20,23 +25,19 @@ jobs: id: extract run: | files=() - - # Iterate all root keys roots=$(yq e -r 'keys | .[]' manifest.yaml) for root in $roots; do while read -r version; do - echo "Found ${root} | ${version}" dockerfile="./${root}/${version}/Dockerfile" - # Read image_name safely + # Read image_name including tag image_name=$(yq e -r ".${root}.versions.\"${version}\".image_name" manifest.yaml) - echo "Image name: $image_name" if [ -n "$image_name" ] && [ "$image_name" != "null" ]; then files+=("$dockerfile|$image_name") fi done < <(yq e -r ".${root}.versions | keys | .[]" manifest.yaml) done - # Convert array to JSON for matrix + # Convert array to compact JSON for GitHub Actions matrix json=$(printf '%s\n' "${files[@]}" | jq -R -c . | jq -c -s .) echo "dockerfiles=$json" >> $GITHUB_OUTPUT @@ -47,6 +48,9 @@ jobs: matrix: entry: ${{ fromJson(needs.discover-dockerfiles.outputs.dockerfiles) }} + env: + DRY_RUN: ${{ github.event.inputs.dry_run }} + steps: - name: Checkout repository uses: actions/checkout@v4 @@ -54,14 +58,20 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Log in to Docker Hub + if: ${{ env.DRY_RUN != 'true' }} + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Parse Dockerfile and image id: metadata run: | - # Split matrix.entry into Dockerfile and image dockerfile="${{ matrix.entry }}" dockerfile="${dockerfile%%|*}" image="${{ matrix.entry }}" - image="${image##*|}" + image="${image##*|}" # Already includes tag from manifest dir=$(dirname "$dockerfile") short_sha="${GITHUB_SHA:0:7}" @@ -74,6 +84,7 @@ jobs: with: context: ${{ steps.metadata.outputs.directory }} file: ${{ steps.metadata.outputs.directory }}/Dockerfile - push: false + push: ${{ env.DRY_RUN != 'true' }} tags: | ${{ steps.metadata.outputs.image }} + ${{ steps.metadata.outputs.image }}-sha:${{ steps.metadata.outputs.short_sha }} From 7b23c24408233fa8c201f3b0fecdfe8c7f7142d9 Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:49:53 +1100 Subject: [PATCH 11/13] no login yet --- .github/workflows/docker-publish.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 6229203..80542c6 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -58,12 +58,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Log in to Docker Hub - if: ${{ env.DRY_RUN != 'true' }} - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Parse Dockerfile and image id: metadata From 51f7bf2592bdae71e52cff16c850190d0c33a78a Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:50:53 +1100 Subject: [PATCH 12/13] Re-add login --- .github/workflows/docker-publish.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 80542c6..fb0cb9d 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -4,7 +4,6 @@ on: push: branches: - master - pull_request: workflow_dispatch: inputs: dry_run: @@ -58,6 +57,12 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Log in to Docker Hub + if: ${{ env.DRY_RUN != 'true' }} + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Parse Dockerfile and image id: metadata @@ -81,4 +86,3 @@ jobs: push: ${{ env.DRY_RUN != 'true' }} tags: | ${{ steps.metadata.outputs.image }} - ${{ steps.metadata.outputs.image }}-sha:${{ steps.metadata.outputs.short_sha }} From 0ceb324b2d03dd2d4971d9e0f0157fadc249f18b Mon Sep 17 00:00:00 2001 From: MrSmoke <709976+MrSmoke@users.noreply.github.com> Date: Fri, 28 Nov 2025 11:53:50 +1100 Subject: [PATCH 13/13] add all docker image names/tags --- manifest.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/manifest.yaml b/manifest.yaml index b3af510..0938668 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -8,18 +8,21 @@ dotnet: image_type: bookworm-slim env_version_key: ASPNETCORE_VERSION '8.0/runtime': + image_name: clickview/dotnet-core-runtime:8.0 data: image_repo: mcr.microsoft.com/dotnet/runtime image_version: 8.0.19 image_type: bookworm-slim env_version_key: DOTNET_VERSION '9.0/aspnet': + image_name: clickview/dotnet-core-aspnet:9.0 data: image_repo: mcr.microsoft.com/dotnet/aspnet image_version: 9.0.8 image_type: bookworm-slim env_version_key: ASPNETCORE_VERSION '9.0/runtime': + image_name: clickview/dotnet-core-runtime:9.0 data: image_repo: mcr.microsoft.com/dotnet/runtime image_version: 9.0.8 @@ -29,8 +32,10 @@ dotnet: dotnet-sdk: versions: '8.0': + image_name: clickview/dotnet-core-sdk:8.0 data: image_version: 8.0.413-bookworm-slim '9.0': + image_name: clickview/dotnet-core-sdk:9.0 data: image_version: 9.0.304-bookworm-slim