From d246a766790277592330e3caf7dc9e4ad8bdd785 Mon Sep 17 00:00:00 2001 From: Volodymyr Kolesnykov Date: Wed, 19 Feb 2025 18:01:06 +0200 Subject: [PATCH] chore: split images into base and normal --- .github/dependabot.yml | 12 +- .github/workflows/build-push.yml | 144 ++++++++++++++++-- .github/workflows/build.yml | 8 +- .github/workflows/features-global.yml | 2 +- .github/workflows/features-scenarios.yml | 2 +- .github/workflows/sanity-checks.yml | 2 +- .../src/alpine-base/.devcontainer.json | 0 .../src/alpine-base/.dockerignore | 0 .../src/alpine-base/Dockerfile | 0 .../alpine-base/rootfs/etc/conf.d/.gitkeep | 0 .../alpine-base/rootfs/etc/default/useradd | 0 .../src/alpine-base/rootfs/etc/runit/1 | 0 .../src/alpine-base/rootfs/etc/runit/2 | 0 .../src/alpine-base/rootfs/etc/runit/3 | 0 .../src/alpine-base/rootfs/etc/service/syslog | 0 .../rootfs/etc/skel.useradd/.bashrc | 0 .../rootfs/etc/skel.useradd/.profile | 0 .../src/alpine-base/rootfs/etc/sv/syslog/run | 0 .../rootfs/usr/local/bin/runit-wrapper | 0 .../src/ubuntu-base/.devcontainer-lock.json | 0 .../src/ubuntu-base/.devcontainer.json | 0 .../cleanup/devcontainer-feature.json | 0 .../local-features/cleanup/install.sh | 0 .../sudo/devcontainer-feature.json | 0 .../local-features/sudo/install.sh | 0 .../syslog/devcontainer-feature.json | 0 .../local-features/syslog/install.sh | 0 .../local-features/syslog/service-run | 0 .../src/ubuntu-base/Dockerfile | 0 29 files changed, 148 insertions(+), 22 deletions(-) rename {images => base-images}/src/alpine-base/.devcontainer.json (100%) rename {images => base-images}/src/alpine-base/.dockerignore (100%) rename {images => base-images}/src/alpine-base/Dockerfile (100%) rename {images => base-images}/src/alpine-base/rootfs/etc/conf.d/.gitkeep (100%) rename {images => base-images}/src/alpine-base/rootfs/etc/default/useradd (100%) rename {images => base-images}/src/alpine-base/rootfs/etc/runit/1 (100%) rename {images => base-images}/src/alpine-base/rootfs/etc/runit/2 (100%) rename {images => base-images}/src/alpine-base/rootfs/etc/runit/3 (100%) rename {images => base-images}/src/alpine-base/rootfs/etc/service/syslog (100%) rename {images => base-images}/src/alpine-base/rootfs/etc/skel.useradd/.bashrc (100%) rename {images => base-images}/src/alpine-base/rootfs/etc/skel.useradd/.profile (100%) rename {images => base-images}/src/alpine-base/rootfs/etc/sv/syslog/run (100%) rename {images => base-images}/src/alpine-base/rootfs/usr/local/bin/runit-wrapper (100%) rename {images => base-images}/src/ubuntu-base/.devcontainer-lock.json (100%) rename {images => base-images}/src/ubuntu-base/.devcontainer.json (100%) rename {images => base-images}/src/ubuntu-base/.devcontainer/local-features/cleanup/devcontainer-feature.json (100%) rename {images => base-images}/src/ubuntu-base/.devcontainer/local-features/cleanup/install.sh (100%) rename {images => base-images}/src/ubuntu-base/.devcontainer/local-features/sudo/devcontainer-feature.json (100%) rename {images => base-images}/src/ubuntu-base/.devcontainer/local-features/sudo/install.sh (100%) rename {images => base-images}/src/ubuntu-base/.devcontainer/local-features/syslog/devcontainer-feature.json (100%) rename {images => base-images}/src/ubuntu-base/.devcontainer/local-features/syslog/install.sh (100%) rename {images => base-images}/src/ubuntu-base/.devcontainer/local-features/syslog/service-run (100%) rename {images => base-images}/src/ubuntu-base/Dockerfile (100%) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index bcf06039..c5daf705 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,23 +10,23 @@ updates: patterns: - "docker/*" - - directory: images/src/alpine-base + - directory: base-images/src/alpine-base package-ecosystem: docker schedule: interval: daily - - directory: images/src/ubuntu-base + - directory: base-images/src/ubuntu-base package-ecosystem: docker schedule: interval: daily - - directory: images/src/wpvip-base - package-ecosystem: docker + - directory: base-images/src/ubuntu-base + package-ecosystem: devcontainers schedule: interval: daily - - directory: images/src/ubuntu-base - package-ecosystem: devcontainers + - directory: images/src/wpvip-base + package-ecosystem: docker schedule: interval: daily diff --git a/.github/workflows/build-push.yml b/.github/workflows/build-push.yml index fd6e0f97..2c9a96d4 100644 --- a/.github/workflows/build-push.yml +++ b/.github/workflows/build-push.yml @@ -1,4 +1,4 @@ -name: Build and Push Docker Image +name: Build and Push Base Image on: push: @@ -10,8 +10,21 @@ permissions: contents: read jobs: - prepare: - name: Prepare list of images to build + prepare-base: + name: Prepare list of base images to build + runs-on: ubuntu-latest + outputs: + images: ${{ steps.set-matrix.outputs.images }} + steps: + - name: Check out the source code + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + + - name: Set matrix + id: set-matrix + run: echo images="$(jq '."x-build"' base-images/src/*/.devcontainer.json | jq --slurp -c .)" >> "${GITHUB_OUTPUT}" + + prepare-others: + name: Prepare list of other images to build runs-on: ubuntu-latest outputs: images: ${{ steps.set-matrix.outputs.images }} @@ -23,8 +36,8 @@ jobs: id: set-matrix run: echo images="$(jq '."x-build"' images/src/*/.devcontainer.json | jq --slurp -c .)" >> "${GITHUB_OUTPUT}" - publish-images: - needs: prepare + publish-base-images: + needs: prepare-base name: 'Publish ${{ matrix.image.name }}' runs-on: ubuntu-latest permissions: @@ -33,7 +46,7 @@ jobs: strategy: fail-fast: false matrix: - image: ${{ fromJson(needs.prepare.outputs.images) }} + image: ${{ fromJson(needs.prepare-base.outputs.images) }} steps: - name: Check out the repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -49,7 +62,7 @@ jobs: else base="${{ github.event.before }}" head="${{ github.event.after }}" - image="images/src/${{ matrix.image.image-name }}" + image="base-images/src/${{ matrix.image.image-name }}" changes="$(git diff --name-only "${base}" "${head}" -- "${image}" | grep -Fv "${image}/README.md" || true)" if [ -n "${changes}" ]; then echo needs_build=true >> "${GITHUB_OUTPUT}" @@ -73,7 +86,7 @@ jobs: "containerd-snapshotter": true } } - + - name: Set up QEMU uses: docker/setup-qemu-action@4574d27a4764455b42196d70a065bc6853246a25 # v3.4.0 if: steps.changes.outputs.needs_build == 'true' @@ -118,7 +131,7 @@ jobs: - name: Build image run: | devcontainer build \ - --workspace-folder images/src/${{ matrix.image.image-name }} \ + --workspace-folder base-images/src/${{ matrix.image.image-name }} \ --platform linux/amd64,linux/arm64 \ --image-name=ghcr.io/${{ env.REPO }}/${{ matrix.image.image-name }}:${{ steps.set-versions.outputs.major }}.${{ steps.set-versions.outputs.minor }}.${{ steps.set-versions.outputs.patch }} \ --image-name=ghcr.io/${{ env.REPO }}/${{ matrix.image.image-name }}:${{ steps.set-versions.outputs.major }}.${{ steps.set-versions.outputs.minor }} \ @@ -222,3 +235,116 @@ jobs: - name: Publish templates run: devcontainer templates publish templates/src --namespace "${{ github.repository }}" if: steps.changes.outputs.needs_build == 'true' + + publish-other-images: + needs: + - prepare-others + - publish-base-images + - publish-features + name: 'Publish ${{ matrix.image.name }}' + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + image: ${{ fromJson(needs.prepare-others.outputs.images) }} + steps: + - name: Check out the repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + + - name: Check changed files + id: changes + run: | + if [ "${{ github.event_name }}" = "push" ]; then + if [ "${{ github.event.forced }}" = "true" ]; then + echo needs_build=true >> "${GITHUB_OUTPUT}" + else + base="${{ github.event.before }}" + head="${{ github.event.after }}" + image="images/src/${{ matrix.image.image-name }}" + changes="$(git diff --name-only "${base}" "${head}" -- "${image}" | grep -Fv "${image}/README.md" || true)" + if [ -n "${changes}" ]; then + echo needs_build=true >> "${GITHUB_OUTPUT}" + else + echo needs_build=false >> "${GITHUB_OUTPUT}" + fi + fi + else + echo needs_build=true >> "${GITHUB_OUTPUT}" + fi + + - name: Expose GitHub Runtime + uses: Automattic/vip-actions/expose-github-runtime@e1faabf165941008de4c0c1381df153e49d8ad2c # v0.6.0 + + - name: Set up Docker + uses: docker/setup-docker-action@370a7dad4b8ce8dbf00f9363e1652e5074dd6abe # v4.1.0 + with: + daemon-config: | + { + "features": { + "containerd-snapshotter": true + } + } + + - name: Set up QEMU + uses: docker/setup-qemu-action@4574d27a4764455b42196d70a065bc6853246a25 # v3.4.0 + if: steps.changes.outputs.needs_build == 'true' + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 + if: steps.changes.outputs.needs_build == 'true' + + - name: Log in to GitHub Docker Registry + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 + if: steps.changes.outputs.needs_build == 'true' + with: + registry: https://ghcr.io + username: ${{ github.actor }}} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Lowercase repository name + run: echo "REPO=$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]')" >> "${GITHUB_ENV}" + + - name: Set versions + if: steps.changes.outputs.needs_build == 'true' + id: set-versions + run: | + echo major="$(echo "${{ matrix.image.image-version }}" | cut -d. -f1)" >> "${GITHUB_OUTPUT}" + echo minor="$(echo "${{ matrix.image.image-version }}" | cut -d. -f2)" >> "${GITHUB_OUTPUT}" + echo patch="$(echo "${{ matrix.image.image-version }}" | cut -d. -f3)" >> "${GITHUB_OUTPUT}" + + - name: Check if image already exists + if: steps.changes.outputs.needs_build == 'true' + id: exists + run: | + if docker buildx imagetools inspect "ghcr.io/${{ env.REPO }}/${{ matrix.image.image-name }}:${{ steps.set-versions.outputs.major }}.${{ steps.set-versions.outputs.minor }}.${{ steps.set-versions.outputs.patch }}" > /dev/null 2>&1; then + echo exists=true >> "${GITHUB_OUTPUT}" + else + echo exists=false >> "${GITHUB_OUTPUT}" + fi + + - name: Install @devcontainers/cli + run: npm install -g @devcontainers/cli + if: ${{ steps.changes.outputs.needs_build == 'true' && steps.exists.outputs.exists != 'true' }} + + - name: Build image + run: | + devcontainer build \ + --workspace-folder images/src/${{ matrix.image.image-name }} \ + --platform linux/amd64,linux/arm64 \ + --image-name=ghcr.io/${{ env.REPO }}/${{ matrix.image.image-name }}:${{ steps.set-versions.outputs.major }}.${{ steps.set-versions.outputs.minor }}.${{ steps.set-versions.outputs.patch }} \ + --image-name=ghcr.io/${{ env.REPO }}/${{ matrix.image.image-name }}:${{ steps.set-versions.outputs.major }}.${{ steps.set-versions.outputs.minor }} \ + --image-name=ghcr.io/${{ env.REPO }}/${{ matrix.image.image-name }}:${{ steps.set-versions.outputs.major }} \ + --image-name=ghcr.io/${{ env.REPO }}/${{ matrix.image.image-name }}:latest \ + --output type=docker \ + --cache-from type=gha \ + --cache-to type=gha,mode=max + if: ${{ steps.changes.outputs.needs_build == 'true' && steps.exists.outputs.exists != 'true' }} + + - name: Publish image + run: docker push --all-tags ghcr.io/${{ env.REPO }}/${{ matrix.image.image-name }} + if: ${{ steps.changes.outputs.needs_build == 'true' && steps.exists.outputs.exists != 'true' }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d9062e2d..c6e28965 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: Build Docker Image +name: Build Base Image on: pull_request: @@ -22,7 +22,7 @@ jobs: - name: Set matrix id: set-matrix - run: echo images="$(jq '."x-build"' images/src/*/.devcontainer.json | jq --slurp -c .)" >> "${GITHUB_OUTPUT}" + run: echo images="$(jq '."x-build"' base-images/src/*/.devcontainer.json | jq --slurp -c .)" >> "${GITHUB_OUTPUT}" build: needs: prepare @@ -43,7 +43,7 @@ jobs: run: | base="${{ github.event.pull_request.base.sha }}" head="${{ github.event.pull_request.head.sha }}" - image="images/src/${{ matrix.image.image-name }}" + image="base-images/src/${{ matrix.image.image-name }}" changes="$(git diff --name-only "${base}" "${head}" -- "${image}" | grep -Fv "${image}/README.md" || true)" if [ -n "${changes}" ]; then echo needs_build=true >> "${GITHUB_OUTPUT}" @@ -70,7 +70,7 @@ jobs: - name: Build image run: | devcontainer build \ - --workspace-folder "images/src/${{ matrix.image.image-name }}" \ + --workspace-folder "base-images/src/${{ matrix.image.image-name }}" \ --platform linux/amd64,linux/arm64 \ --output type=image \ --cache-from type=gha \ diff --git a/.github/workflows/features-global.yml b/.github/workflows/features-global.yml index bee4cf19..1638b87a 100644 --- a/.github/workflows/features-global.yml +++ b/.github/workflows/features-global.yml @@ -50,7 +50,7 @@ jobs: IMAGE=ubuntu-base fi devcontainer build \ - --workspace-folder "images/src/${IMAGE}" \ + --workspace-folder "base-images/src/${IMAGE}" \ --image-name="ghcr.io/${REPO}/${IMAGE}:latest" \ --cache-from type=gha diff --git a/.github/workflows/features-scenarios.yml b/.github/workflows/features-scenarios.yml index 08c41f64..8c8baee2 100644 --- a/.github/workflows/features-scenarios.yml +++ b/.github/workflows/features-scenarios.yml @@ -71,7 +71,7 @@ jobs: REPO="$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]')" for image in alpine-base ubuntu-base; do devcontainer build \ - --workspace-folder images/src/${image} \ + --workspace-folder base-images/src/${image} \ --image-name="ghcr.io/${REPO}/${image}:latest" \ --cache-from type=gha done diff --git a/.github/workflows/sanity-checks.yml b/.github/workflows/sanity-checks.yml index 0fe41ef0..1756681a 100644 --- a/.github/workflows/sanity-checks.yml +++ b/.github/workflows/sanity-checks.yml @@ -20,7 +20,7 @@ jobs: run: | base="${{ github.event.pull_request.base.sha }}" head="${{ github.event.pull_request.head.sha }}" - for image in images/src/*; do + for image in base-images/src/*; do changes="$(git diff --merge-base --name-only "${base}" "${head}" -- "${image}" | grep -Fv "${image}/README.md" || true)" if [ -n "${changes}" ]; then if ! echo "${changes}" | grep -q "${image}/.devcontainer.json"; then diff --git a/images/src/alpine-base/.devcontainer.json b/base-images/src/alpine-base/.devcontainer.json similarity index 100% rename from images/src/alpine-base/.devcontainer.json rename to base-images/src/alpine-base/.devcontainer.json diff --git a/images/src/alpine-base/.dockerignore b/base-images/src/alpine-base/.dockerignore similarity index 100% rename from images/src/alpine-base/.dockerignore rename to base-images/src/alpine-base/.dockerignore diff --git a/images/src/alpine-base/Dockerfile b/base-images/src/alpine-base/Dockerfile similarity index 100% rename from images/src/alpine-base/Dockerfile rename to base-images/src/alpine-base/Dockerfile diff --git a/images/src/alpine-base/rootfs/etc/conf.d/.gitkeep b/base-images/src/alpine-base/rootfs/etc/conf.d/.gitkeep similarity index 100% rename from images/src/alpine-base/rootfs/etc/conf.d/.gitkeep rename to base-images/src/alpine-base/rootfs/etc/conf.d/.gitkeep diff --git a/images/src/alpine-base/rootfs/etc/default/useradd b/base-images/src/alpine-base/rootfs/etc/default/useradd similarity index 100% rename from images/src/alpine-base/rootfs/etc/default/useradd rename to base-images/src/alpine-base/rootfs/etc/default/useradd diff --git a/images/src/alpine-base/rootfs/etc/runit/1 b/base-images/src/alpine-base/rootfs/etc/runit/1 similarity index 100% rename from images/src/alpine-base/rootfs/etc/runit/1 rename to base-images/src/alpine-base/rootfs/etc/runit/1 diff --git a/images/src/alpine-base/rootfs/etc/runit/2 b/base-images/src/alpine-base/rootfs/etc/runit/2 similarity index 100% rename from images/src/alpine-base/rootfs/etc/runit/2 rename to base-images/src/alpine-base/rootfs/etc/runit/2 diff --git a/images/src/alpine-base/rootfs/etc/runit/3 b/base-images/src/alpine-base/rootfs/etc/runit/3 similarity index 100% rename from images/src/alpine-base/rootfs/etc/runit/3 rename to base-images/src/alpine-base/rootfs/etc/runit/3 diff --git a/images/src/alpine-base/rootfs/etc/service/syslog b/base-images/src/alpine-base/rootfs/etc/service/syslog similarity index 100% rename from images/src/alpine-base/rootfs/etc/service/syslog rename to base-images/src/alpine-base/rootfs/etc/service/syslog diff --git a/images/src/alpine-base/rootfs/etc/skel.useradd/.bashrc b/base-images/src/alpine-base/rootfs/etc/skel.useradd/.bashrc similarity index 100% rename from images/src/alpine-base/rootfs/etc/skel.useradd/.bashrc rename to base-images/src/alpine-base/rootfs/etc/skel.useradd/.bashrc diff --git a/images/src/alpine-base/rootfs/etc/skel.useradd/.profile b/base-images/src/alpine-base/rootfs/etc/skel.useradd/.profile similarity index 100% rename from images/src/alpine-base/rootfs/etc/skel.useradd/.profile rename to base-images/src/alpine-base/rootfs/etc/skel.useradd/.profile diff --git a/images/src/alpine-base/rootfs/etc/sv/syslog/run b/base-images/src/alpine-base/rootfs/etc/sv/syslog/run similarity index 100% rename from images/src/alpine-base/rootfs/etc/sv/syslog/run rename to base-images/src/alpine-base/rootfs/etc/sv/syslog/run diff --git a/images/src/alpine-base/rootfs/usr/local/bin/runit-wrapper b/base-images/src/alpine-base/rootfs/usr/local/bin/runit-wrapper similarity index 100% rename from images/src/alpine-base/rootfs/usr/local/bin/runit-wrapper rename to base-images/src/alpine-base/rootfs/usr/local/bin/runit-wrapper diff --git a/images/src/ubuntu-base/.devcontainer-lock.json b/base-images/src/ubuntu-base/.devcontainer-lock.json similarity index 100% rename from images/src/ubuntu-base/.devcontainer-lock.json rename to base-images/src/ubuntu-base/.devcontainer-lock.json diff --git a/images/src/ubuntu-base/.devcontainer.json b/base-images/src/ubuntu-base/.devcontainer.json similarity index 100% rename from images/src/ubuntu-base/.devcontainer.json rename to base-images/src/ubuntu-base/.devcontainer.json diff --git a/images/src/ubuntu-base/.devcontainer/local-features/cleanup/devcontainer-feature.json b/base-images/src/ubuntu-base/.devcontainer/local-features/cleanup/devcontainer-feature.json similarity index 100% rename from images/src/ubuntu-base/.devcontainer/local-features/cleanup/devcontainer-feature.json rename to base-images/src/ubuntu-base/.devcontainer/local-features/cleanup/devcontainer-feature.json diff --git a/images/src/ubuntu-base/.devcontainer/local-features/cleanup/install.sh b/base-images/src/ubuntu-base/.devcontainer/local-features/cleanup/install.sh similarity index 100% rename from images/src/ubuntu-base/.devcontainer/local-features/cleanup/install.sh rename to base-images/src/ubuntu-base/.devcontainer/local-features/cleanup/install.sh diff --git a/images/src/ubuntu-base/.devcontainer/local-features/sudo/devcontainer-feature.json b/base-images/src/ubuntu-base/.devcontainer/local-features/sudo/devcontainer-feature.json similarity index 100% rename from images/src/ubuntu-base/.devcontainer/local-features/sudo/devcontainer-feature.json rename to base-images/src/ubuntu-base/.devcontainer/local-features/sudo/devcontainer-feature.json diff --git a/images/src/ubuntu-base/.devcontainer/local-features/sudo/install.sh b/base-images/src/ubuntu-base/.devcontainer/local-features/sudo/install.sh similarity index 100% rename from images/src/ubuntu-base/.devcontainer/local-features/sudo/install.sh rename to base-images/src/ubuntu-base/.devcontainer/local-features/sudo/install.sh diff --git a/images/src/ubuntu-base/.devcontainer/local-features/syslog/devcontainer-feature.json b/base-images/src/ubuntu-base/.devcontainer/local-features/syslog/devcontainer-feature.json similarity index 100% rename from images/src/ubuntu-base/.devcontainer/local-features/syslog/devcontainer-feature.json rename to base-images/src/ubuntu-base/.devcontainer/local-features/syslog/devcontainer-feature.json diff --git a/images/src/ubuntu-base/.devcontainer/local-features/syslog/install.sh b/base-images/src/ubuntu-base/.devcontainer/local-features/syslog/install.sh similarity index 100% rename from images/src/ubuntu-base/.devcontainer/local-features/syslog/install.sh rename to base-images/src/ubuntu-base/.devcontainer/local-features/syslog/install.sh diff --git a/images/src/ubuntu-base/.devcontainer/local-features/syslog/service-run b/base-images/src/ubuntu-base/.devcontainer/local-features/syslog/service-run similarity index 100% rename from images/src/ubuntu-base/.devcontainer/local-features/syslog/service-run rename to base-images/src/ubuntu-base/.devcontainer/local-features/syslog/service-run diff --git a/images/src/ubuntu-base/Dockerfile b/base-images/src/ubuntu-base/Dockerfile similarity index 100% rename from images/src/ubuntu-base/Dockerfile rename to base-images/src/ubuntu-base/Dockerfile