From b2b5dc5779bf836f46789e913dc006c5699adef6 Mon Sep 17 00:00:00 2001 From: Scott Wittenburg Date: Wed, 13 Sep 2023 16:29:20 -0600 Subject: [PATCH] Only rebuild, tag, and push the images that actually changed. --- .github/workflows/custom_docker_builds.yml | 23 +++++++++++++++++ scripts/get-changed-files.sh | 29 ++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100755 scripts/get-changed-files.sh diff --git a/.github/workflows/custom_docker_builds.yml b/.github/workflows/custom_docker_builds.yml index cee5f9219..b41acc659 100644 --- a/.github/workflows/custom_docker_builds.yml +++ b/.github/workflows/custom_docker_builds.yml @@ -6,8 +6,22 @@ on: - main paths: - images/** + - .github/workflows/custom_docker_builds.yml + - scripts/get-changed-files.sh jobs: + getchanges: + runs-on: ubuntu-latest + outputs: + changelist: ${{ steps.changes.outputs.diff }} + steps: + - name: Checkout + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + fetch-depth: 0 + - name: Get changed files + id: changes + run: ./scripts/get-changed-files.sh publish: runs-on: ubuntu-latest strategy: @@ -50,11 +64,18 @@ jobs: - name: Checkout uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Matrix element to relative path + run: | + REL_PATH=$(realpath --relative-to $(git rev-parse --show-toplevel) ${{ matrix.docker-image }}) + echo "REL_PATH=$REL_PATH" >> $GITHUB_ENV + - name: Set up QEMU uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 + if: contains(needs.getchanges.outputs.changelist, env.REL_PATH) - name: Log in to the Container registry uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 + if: contains(needs.getchanges.outputs.changelist, env.REL_PATH) with: registry: ghcr.io username: ${{ github.actor }} @@ -63,6 +84,7 @@ jobs: - name: Build and push ${{ matrix.docker-image }} id: docker-build-push uses: docker/build-push-action@2eb1c1961a95fc15694676618e422e8ba1d63825 # v4.1.1 + if: contains(needs.getchanges.outputs.changelist, env.REL_PATH) with: context: ${{ matrix.docker-image }} file: ${{ matrix.docker-image }}/Dockerfile @@ -71,4 +93,5 @@ jobs: platforms: linux/amd64,linux/arm64 - name: Image digest + if: contains(needs.getchanges.outputs.changelist, env.REL_PATH) run: echo ${{ steps.docker-build-push.outputs.digest }} diff --git a/scripts/get-changed-files.sh b/scripts/get-changed-files.sh new file mode 100755 index 000000000..25473e6c3 --- /dev/null +++ b/scripts/get-changed-files.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +case "${GITHUB_EVENT_NAME}" +in + pull_request) + BASE_SHA=$(jq -r .pull_request.base.sha ${GITHUB_EVENT_PATH}) + HEAD_SHA=$(jq -r .pull_request.head.sha ${GITHUB_EVENT_PATH}) + ;; + push) + BASE_SHA=$(jq -r .before ${GITHUB_EVENT_PATH}) + HEAD_SHA=$(jq -r .after ${GITHUB_EVENT_PATH}) + ;; + *) + echo "Unable to get changed files from '${GITHUB_EVENT_NAME}' event" + exit 1 +esac + +echo "Event: ${GITHUB_EVENT_NAME}" +echo "Base: ${BASE_SHA}" +echo "Head: ${HEAD_SHA}" +echo "" + +git fetch origin ${BASE_SHA} +git fetch origin ${HEAD_SHA} + +echo "" +echo "::group::All changed files" +git diff --name-only ${BASE_SHA}...${HEAD_SHA} | xargs +echo "diff=$(git diff --name-only ${BASE_SHA}...${HEAD_SHA} | xargs dirname | xargs)" >> $GITHUB_OUTPUT