From 9291a276782a06d011d2376f5e0f10c67af9175e Mon Sep 17 00:00:00 2001 From: Jack Date: Wed, 10 Dec 2025 10:47:40 +0000 Subject: [PATCH 1/4] Test image size --- .github/workflows/test-test-image-size.yml | 19 ++++++++++++ .github/workflows/test.yml | 5 ++++ test-image-size/action.yml | 23 +++++++++++++++ test-image-size/test-image-size.functions.sh | 23 +++++++++++++++ .../test-image-size.functions_tests.sh | 29 +++++++++++++++++++ test-image-size/test_scripts.sh | 5 ++++ 6 files changed, 104 insertions(+) create mode 100644 .github/workflows/test-test-image-size.yml create mode 100644 test-image-size/action.yml create mode 100644 test-image-size/test-image-size.functions.sh create mode 100755 test-image-size/test-image-size.functions_tests.sh create mode 100755 test-image-size/test_scripts.sh diff --git a/.github/workflows/test-test-image-size.yml b/.github/workflows/test-test-image-size.yml new file mode 100644 index 0000000..6d83497 --- /dev/null +++ b/.github/workflows/test-test-image-size.yml @@ -0,0 +1,19 @@ +name: Test test-image-size action + +on: + workflow_call: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Test scripts + run: ./test-image-size/test_scripts.sh + + - name: Run test-image-size + uses: ./test-image-size + with: + image: hazelcast/hazelcast:5.0.1-slim diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bb9c234..1ff7e67 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -41,6 +41,10 @@ jobs: uses: ./.github/workflows/test-slack-notification.yml secrets: inherit + test-test-image-size: + uses: ./.github/workflows/test-test-image-size.yml + secrets: inherit + assert-all-jobs-succeeded: runs-on: ubuntu-latest needs: @@ -54,6 +58,7 @@ jobs: - test-get-supported-platforms - test-resolve-editions - test-slack-notification + - test-test-image-size if: always() steps: - name: Check all jobs succeeded diff --git a/test-image-size/action.yml b/test-image-size/action.yml new file mode 100644 index 0000000..eb50ddf --- /dev/null +++ b/test-image-size/action.yml @@ -0,0 +1,23 @@ +name: Test image size +description: Test image isn't excessively large / wasting space + +inputs: + image: + description: Image name to test + required: true + minimum_efficiency: + description: Minimum efficiency percentage required - 0-1 scale + required: false + default: 0.95 + +runs: + using: "composite" + steps: + - shell: bash + run: | + . ${GITHUB_ACTION_PATH}/test-image-size.functions.sh + + test_image_size "${IMAGE}" "${MINIMUM_EFFICIENCY}" + env: + IMAGE: ${{ inputs.image }} + MINIMUM_EFFICIENCY: ${{ inputs.minimum_efficiency }} diff --git a/test-image-size/test-image-size.functions.sh b/test-image-size/test-image-size.functions.sh new file mode 100644 index 0000000..01b7654 --- /dev/null +++ b/test-image-size/test-image-size.functions.sh @@ -0,0 +1,23 @@ +function test_image_size() { + local image=$1 + local minimum_efficiency=$2 + + local config_file + config_file=$(mktemp) + + # https://github.com/wagoodman/dive/blob/main/README.md#ci-integration + yq eval -n " + .rules.lowestEfficiency = ${minimum_efficiency} | + .rules.highestWastedBytes = \"disabled\" | + .rules.highestUserWastedPercent = \"disabled\" + " > "${config_file}" + + docker run --rm \ + --env CI=true \ + --volume /var/run/docker.sock:/var/run/docker.sock \ + --volume "${config_file}:/.dive-ci" \ + docker.io/wagoodman/dive:latest \ + "${image}" + + return $? +} diff --git a/test-image-size/test-image-size.functions_tests.sh b/test-image-size/test-image-size.functions_tests.sh new file mode 100755 index 0000000..8f987be --- /dev/null +++ b/test-image-size/test-image-size.functions_tests.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +set -eu ${RUNNER_DEBUG:+-x} + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" + +# Source the latest version of assert.sh unit testing library and include in current shell +source /dev/stdin <<< "$(curl --silent https://raw.githubusercontent.com/hazelcast/assert.sh/main/assert.sh)" + +. "$SCRIPT_DIR"/test-image-size.functions.sh + +TESTS_RESULT=0 + +function assert_test_image_size { + local image=$1 + local minimum_efficiency=$2 + local expected_exit_code=$3 + test_image_size "${image}" "${minimum_efficiency}" && true + local actual_exit_code=$? + local msg="Expected exit code for \"${image}\" / \"${minimum_efficiency}\"" + assert_eq "${expected_exit_code}" "${actual_exit_code}" "${msg}" && log_success "${msg}" || TESTS_RESULT=$? +} + +log_header "Tests for test_image_size" +# expected efficiency: 99.8541 % +assert_test_image_size hazelcast/hazelcast:5.0.1-slim 0.95 0 +assert_test_image_size hazelcast/hazelcast:5.0.1-slim 0.99999999999 1 + +assert_eq 0 "$TESTS_RESULT" "All tests should pass" diff --git a/test-image-size/test_scripts.sh b/test-image-size/test_scripts.sh new file mode 100755 index 0000000..deb6bf2 --- /dev/null +++ b/test-image-size/test_scripts.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" + +find "$SCRIPT_DIR" -name "*_tests.sh" -print0 | xargs -0 -n1 bash From f09fde445394bff6e5ddc8c90461851ddf596d97 Mon Sep 17 00:00:00 2001 From: Jack Date: Thu, 11 Dec 2025 11:11:51 +0000 Subject: [PATCH 2/4] https://github.com/hazelcast/docker-actions/pull/40#discussion_r2610091981 --- test-image-size/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 test-image-size/README.md diff --git a/test-image-size/README.md b/test-image-size/README.md new file mode 100644 index 0000000..53e312d --- /dev/null +++ b/test-image-size/README.md @@ -0,0 +1,9 @@ +# test-image-size + +A GitHub Action that validates image isn't excessively large / wasting space using [`dive`](https://github.com/wagoodman/dive). + +Docker images are built of overlaid [layers](https://docs.docker.com/get-started/docker-concepts/building-images/understanding-image-layers), building on top of one-another. When downloading an image, each layer is downloaded. + +If one layer contains a file that is subsequently removed or modified in a subsequent layer, this intermediate state will still be present in the layer to be downloaded, bloating the overall image. An example of this occurred in . + +This action asserts that the amount of wasted space in an image is below a % threshold. From 61d87e292044c74c228234d0ad6bcf2a09a43a1a Mon Sep 17 00:00:00 2001 From: Jack Green Date: Thu, 11 Dec 2025 13:07:38 +0000 Subject: [PATCH 3/4] https://github.com/hazelcast/docker-actions/pull/40#discussion_r2610044991 --- ...est-image-size.yml => test-assert-image-size.yml} | 8 ++++---- .github/workflows/test.yml | 10 +++++----- {test-image-size => assert-image-size}/README.md | 2 +- {test-image-size => assert-image-size}/action.yml | 4 ++-- .../assert-image-size.functions.sh | 2 +- .../assert-image-size.functions_tests.sh | 12 ++++++------ .../test_scripts.sh | 0 7 files changed, 19 insertions(+), 19 deletions(-) rename .github/workflows/{test-test-image-size.yml => test-assert-image-size.yml} (60%) rename {test-image-size => assert-image-size}/README.md (97%) rename {test-image-size => assert-image-size}/action.yml (78%) rename test-image-size/test-image-size.functions.sh => assert-image-size/assert-image-size.functions.sh (94%) rename test-image-size/test-image-size.functions_tests.sh => assert-image-size/assert-image-size.functions_tests.sh (68%) mode change 100755 => 100644 rename {test-image-size => assert-image-size}/test_scripts.sh (100%) mode change 100755 => 100644 diff --git a/.github/workflows/test-test-image-size.yml b/.github/workflows/test-assert-image-size.yml similarity index 60% rename from .github/workflows/test-test-image-size.yml rename to .github/workflows/test-assert-image-size.yml index 6d83497..8566a16 100644 --- a/.github/workflows/test-test-image-size.yml +++ b/.github/workflows/test-assert-image-size.yml @@ -1,4 +1,4 @@ -name: Test test-image-size action +name: Test assert-image-size action on: workflow_call: @@ -11,9 +11,9 @@ jobs: uses: actions/checkout@v6 - name: Test scripts - run: ./test-image-size/test_scripts.sh + run: ./assert-image-size/test_scripts.sh - - name: Run test-image-size - uses: ./test-image-size + - name: Run assert-image-size + uses: ./assert-image-size with: image: hazelcast/hazelcast:5.0.1-slim diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1ff7e67..2b823ef 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,6 +10,10 @@ jobs: - name: Checkout uses: actions/checkout@v6 + test-assert-image-size: + uses: ./.github/workflows/test-assert-image-size.yml + secrets: inherit + test-check-base-images: uses: ./.github/workflows/test-check-base-images.yml @@ -41,13 +45,10 @@ jobs: uses: ./.github/workflows/test-slack-notification.yml secrets: inherit - test-test-image-size: - uses: ./.github/workflows/test-test-image-size.yml - secrets: inherit - assert-all-jobs-succeeded: runs-on: ubuntu-latest needs: + - test-assert-image-size - test-check-base-images - test-check-if-latest-lts-release - test-check-redhat-service-status @@ -58,7 +59,6 @@ jobs: - test-get-supported-platforms - test-resolve-editions - test-slack-notification - - test-test-image-size if: always() steps: - name: Check all jobs succeeded diff --git a/test-image-size/README.md b/assert-image-size/README.md similarity index 97% rename from test-image-size/README.md rename to assert-image-size/README.md index 53e312d..0d90cda 100644 --- a/test-image-size/README.md +++ b/assert-image-size/README.md @@ -1,4 +1,4 @@ -# test-image-size +# assert-image-size A GitHub Action that validates image isn't excessively large / wasting space using [`dive`](https://github.com/wagoodman/dive). diff --git a/test-image-size/action.yml b/assert-image-size/action.yml similarity index 78% rename from test-image-size/action.yml rename to assert-image-size/action.yml index eb50ddf..19d39ae 100644 --- a/test-image-size/action.yml +++ b/assert-image-size/action.yml @@ -15,9 +15,9 @@ runs: steps: - shell: bash run: | - . ${GITHUB_ACTION_PATH}/test-image-size.functions.sh + . ${GITHUB_ACTION_PATH}/assert-image-size.functions.sh - test_image_size "${IMAGE}" "${MINIMUM_EFFICIENCY}" + assert_image_size "${IMAGE}" "${MINIMUM_EFFICIENCY}" env: IMAGE: ${{ inputs.image }} MINIMUM_EFFICIENCY: ${{ inputs.minimum_efficiency }} diff --git a/test-image-size/test-image-size.functions.sh b/assert-image-size/assert-image-size.functions.sh similarity index 94% rename from test-image-size/test-image-size.functions.sh rename to assert-image-size/assert-image-size.functions.sh index 01b7654..6c85973 100644 --- a/test-image-size/test-image-size.functions.sh +++ b/assert-image-size/assert-image-size.functions.sh @@ -1,4 +1,4 @@ -function test_image_size() { +function assert_image_size() { local image=$1 local minimum_efficiency=$2 diff --git a/test-image-size/test-image-size.functions_tests.sh b/assert-image-size/assert-image-size.functions_tests.sh old mode 100755 new mode 100644 similarity index 68% rename from test-image-size/test-image-size.functions_tests.sh rename to assert-image-size/assert-image-size.functions_tests.sh index 8f987be..4369e2e --- a/test-image-size/test-image-size.functions_tests.sh +++ b/assert-image-size/assert-image-size.functions_tests.sh @@ -7,23 +7,23 @@ SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" # Source the latest version of assert.sh unit testing library and include in current shell source /dev/stdin <<< "$(curl --silent https://raw.githubusercontent.com/hazelcast/assert.sh/main/assert.sh)" -. "$SCRIPT_DIR"/test-image-size.functions.sh +. "$SCRIPT_DIR"/assert-image-size.functions.sh TESTS_RESULT=0 -function assert_test_image_size { +function assert_assert_image_size { local image=$1 local minimum_efficiency=$2 local expected_exit_code=$3 - test_image_size "${image}" "${minimum_efficiency}" && true + assert_image_size "${image}" "${minimum_efficiency}" && true local actual_exit_code=$? local msg="Expected exit code for \"${image}\" / \"${minimum_efficiency}\"" assert_eq "${expected_exit_code}" "${actual_exit_code}" "${msg}" && log_success "${msg}" || TESTS_RESULT=$? } -log_header "Tests for test_image_size" +log_header "Tests for assert_image_size" # expected efficiency: 99.8541 % -assert_test_image_size hazelcast/hazelcast:5.0.1-slim 0.95 0 -assert_test_image_size hazelcast/hazelcast:5.0.1-slim 0.99999999999 1 +assert_assert_image_size hazelcast/hazelcast:5.0.1-slim 0.95 0 +assert_assert_image_size hazelcast/hazelcast:5.0.1-slim 0.99999999999 1 assert_eq 0 "$TESTS_RESULT" "All tests should pass" diff --git a/test-image-size/test_scripts.sh b/assert-image-size/test_scripts.sh old mode 100755 new mode 100644 similarity index 100% rename from test-image-size/test_scripts.sh rename to assert-image-size/test_scripts.sh From 7609bd25899f9f7311f7681efa947342ce9dd3dd Mon Sep 17 00:00:00 2001 From: Jack Date: Thu, 11 Dec 2025 13:11:40 +0000 Subject: [PATCH 4/4] Fix permissions --- assert-image-size/test_scripts.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 assert-image-size/test_scripts.sh diff --git a/assert-image-size/test_scripts.sh b/assert-image-size/test_scripts.sh old mode 100644 new mode 100755