Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test JDK version as part of PR builder [DI-317][5.3.z] #818

Merged
merged 2 commits into from
Nov 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions .github/scripts/abstract-simple-smoke-test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#!/usr/bin/env bash

set -o errexit -o nounset -o pipefail

# Performs simple validation tests on an already-running Hazelcast instance
# Abstract as could be from Docker, Homebrew, local binary etc
# Because abstract, expects callers to implement required, but absent functions
function test_package() {
local expected_distribution_type=$1
local expected_version=$2

test_health
test_map_read_write

# Deliberately last step as it doesn't block-and-wait until the instance is initialized
# Otherwise would have false positives if instance still starting and logs empty
check_metadata "${expected_distribution_type}" "${expected_version}"
}

# Search logs for entries _like_:
# Hazelcast Platform 5.5.0 (20240725) starting at [172.17.0.2]:5701
# To validate the version and distribution is correct
function check_metadata() {
local expected_distribution_type=$1
local expected_version=$2

logs=$(get_hz_logs)

if [[ -z "${logs}" ]]; then
echoerr "Failed to read logs"
exit 1;
fi

if grep -q "${expected_distribution_type} ${expected_version}" <<< "${logs}"; then
echo "Expected contents (${expected_distribution_type}) and version (${expected_version}) identified."
else
echoerr "Failed to find ${expected_distribution_type} ${expected_version} in logs:"
echoerr "${logs}"
exit 1;
fi
}

function test_health() {
local attempts=0
local max_attempts=30
until curl --silent --fail "127.0.0.1:5701/hazelcast/health/ready"; do
if [[ ${attempts} -eq ${max_attempts} ]];then
echoerr "Hazelcast not responding"
exit 1;
fi
printf '.'
attempts=$((attempts+1))
sleep 2
done
}

function test_map_read_write() {
install_clc

local key="some-key"
local expected="some-value"
echo "Putting value '${expected}' for key '${key}'"
clc --timeout 5s map set -n some-map "${key}" "${expected}" --log.path stderr
echo "Getting value for key '${key}'"
local actual
actual=$(clc map get --format delimited -n some-map "${key}" --log.path stderr)

if [[ "${expected}" != "${actual}" ]]; then
echoerr "Expected to read '${expected}' but got '${actual}'"
exit 1;
fi
}

function install_clc() {
while ! curl https://hazelcast.com/clc/install.sh | bash
do
echo "Retrying clc installation..."
sleep 3
done
export PATH=${PATH}:${HOME}/.hazelcast/bin
clc config add default cluster.name=dev cluster.address=localhost
}

# Prints the given message to stderr
function echoerr() {
echo "ERROR - $*" 1>&2;
}
117 changes: 35 additions & 82 deletions .github/scripts/simple-smoke-test.sh
Original file line number Diff line number Diff line change
@@ -1,24 +1,11 @@
#!/usr/bin/env bash

set -o errexit -o nounset -o pipefail
set -o errexit

function test_docker_image() {
local image=$1
local container_name=$2
local expected_distribution_type=$3
local expected_version=$4

remove_container_if_exists "${container_name}"

check_distribution_type "${image}" "${expected_distribution_type}"
check_image_hz_version "${image}" "${expected_version}"

test_map_read_write "${image}" "${container_name}"
}
# shellcheck source=../.github/scripts/abstract-simple-smoke-test.sh
. .github/scripts/abstract-simple-smoke-test.sh

function remove_container_if_exists() {
local container_name=$1

local containers
containers=$(docker ps --all --quiet --filter name="${container_name}")

Expand All @@ -28,81 +15,47 @@ function remove_container_if_exists() {
fi
}

function check_distribution_type() {
local image=$1
local expected_distribution_type=$2

echo "Checking ${image} distribution type"
if docker run --rm "${image}" bash -c 'compgen -G lib/*enterprise*'; then
echo "EE contents identified"
distribution_type="ee"
else
echo "No EE contents identified - assuming OSS"
distribution_type="oss"
fi

if [[ "${distribution_type}" != "${expected_distribution_type}" ]]; then
echoerr "Image ${image} should contain ${expected_distribution_type} distribution but ${distribution_type} was detected"
exit 1
fi
function start_container() {
echo "Starting container '${container_name}' from image '${image}'"
docker run -it --name "${container_name}" -e HZ_LICENSEKEY -e HZ_INSTANCETRACKING_FILENAME -d -p5701:5701 "${image}"
}

function check_image_hz_version() {
local image=$1
local expected_version=$2

echo "Checking ${image} version"
local version
version=$(docker run --rm "${image}" bin/hz-cli --version | awk '/Hazelcast/ {print $2}')
if [[ "${version}" == "${expected_version}" ]]; then
echo "${image} version identified as ${version}"
else
echoerr "${image} version was ${version}, not ${expected_version} as expected"
exit 1
fi
function get_hz_logs() {
docker logs "${container_name}"
}

function test_map_read_write() {
local image=$1
local expected_distribution_type=$2

echo "Starting container '${container_name}' from image '${image}'"
docker run -it --name "${container_name}" -e HZ_LICENSEKEY -e HZ_INSTANCETRACKING_FILENAME -d -p5701:5701 "${image}"
local key="some-key"
local expected="some-value"
echo "Putting value '${expected}' for key '${key}'"
while ! clc --timeout 5s map set -n some-map "${key}" "${expected}" --log.path stderr
do
echo "Retrying..."
sleep 3
done
echo "Getting value for key '${key}'"
local actual
actual=$(clc map get --format delimited -n some-map "${key}" --log.path stderr)
function stop_container() {
echo "Stopping container ${container_name}"
docker stop "${container_name}"

if [[ "${expected}" != "${actual}" ]]; then
echoerr "Expected to read '${expected}' but got '${actual}'"
exit 1;
fi
}

function install_clc() {
while ! curl https://hazelcast.com/clc/install.sh | bash
do
echo "Retrying clc installation..."
sleep 3
done
export PATH=${PATH}:${HOME}/.hazelcast/bin
clc config add default cluster.name=dev cluster.address=localhost
function derive_expected_distribution_type() {
local input_distribution_type=$1

case "${input_distribution_type}" in
"oss")
echo "Hazelcast Platform"
;;
"ee")
echo "Hazelcast Enterprise"
;;
*)
echoerr "Unrecognized distribution type ${input_distribution_type}"
exit 1
;;
esac
}

# Prints the given message to stderr
function echoerr() {
echo "ERROR - $*" 1>&2;
}
image=$1
container_name=$2
input_distribution_type=$3
expected_version=$4


remove_container_if_exists
start_container

trap stop_container EXIT

install_clc
test_docker_image "$@"
expected_distribution_type=$(derive_expected_distribution_type "${input_distribution_type}")
test_package "${expected_distribution_type}" "${expected_version}"
12 changes: 7 additions & 5 deletions .github/workflows/build-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,9 @@ jobs:

- name: Run smoke test against OSS image
timeout-minutes: 2
run: |
.github/scripts/simple-smoke-test.sh hazelcast-oss:test ${{ env.test_container_name_oss }} oss ${{ needs.prepare.outputs.HZ_VERSION_OSS }}
run: |
. .github/scripts/docker.functions.sh
.github/scripts/simple-smoke-test.sh hazelcast-oss:test ${{ env.test_container_name_oss }} oss ${{ needs.prepare.outputs.HZ_VERSION_OSS }} "$(get_default_jdk hazelcast-oss)"

- name: Build Test EE image
run: |
Expand All @@ -102,8 +103,9 @@ jobs:
- name: Run smoke test against EE image
timeout-minutes: 2
run: |
. .github/scripts/docker.functions.sh
export HZ_LICENSEKEY=${{ secrets.HZ_ENTERPRISE_LICENSE }}
.github/scripts/simple-smoke-test.sh hazelcast-ee:test ${{ env.test_container_name_ee }} ee ${{ needs.prepare.outputs.HZ_VERSION_EE }}
.github/scripts/simple-smoke-test.sh hazelcast-ee:test ${{ env.test_container_name_ee }} ee ${{ needs.prepare.outputs.HZ_VERSION_EE }} "$(get_default_jdk hazelcast-enterprise)"

- name: Get docker logs
if: ${{ always() }}
Expand Down Expand Up @@ -162,7 +164,7 @@ jobs:
- name: Run smoke test against OSS image
timeout-minutes: 2
run: |
.github/scripts/simple-smoke-test.sh hazelcast-oss:test ${{ env.test_container_name_oss }} oss ${{ needs.prepare.outputs.HZ_VERSION_OSS }}
.github/scripts/simple-smoke-test.sh hazelcast-oss:test ${{ env.test_container_name_oss }} oss ${{ needs.prepare.outputs.HZ_VERSION_OSS }} ${{ matrix.jdk }}

- name: Build Test EE image
run: |
Expand All @@ -180,7 +182,7 @@ jobs:
timeout-minutes: 2
run: |
export HZ_LICENSEKEY=${{ secrets.HZ_ENTERPRISE_LICENSE }}
.github/scripts/simple-smoke-test.sh hazelcast-ee:test ${{ env.test_container_name_ee }} ee ${{ needs.prepare.outputs.HZ_VERSION_EE }}
.github/scripts/simple-smoke-test.sh hazelcast-ee:test ${{ env.test_container_name_ee }} ee ${{ needs.prepare.outputs.HZ_VERSION_EE }} ${{ matrix.jdk }}

- name: Get docker logs
if: ${{ always() }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ee-nlc-snapshot-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ jobs:
timeout-minutes: 2
run: |
export HZ_INSTANCETRACKING_FILENAME=instance-tracking.txt
.github/scripts/simple-smoke-test.sh hazelcast-nlc:test ${{ env.test_container_name_ee }} ee ${HZ_VERSION}
.github/scripts/simple-smoke-test.sh hazelcast-nlc:test ${{ env.test_container_name_ee }} ee ${HZ_VERSION} ${{ matrix.jdk }}

- name: Get docker logs
if: ${{ always() }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ee-nlc-tag-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ jobs:
timeout-minutes: 2
run: |
export HZ_INSTANCETRACKING_FILENAME=instance-tracking.txt
.github/scripts/simple-smoke-test.sh hazelcast-nlc:test ${{ env.test_container_name_ee }} ee ${HZ_VERSION}
.github/scripts/simple-smoke-test.sh hazelcast-nlc:test ${{ env.test_container_name_ee }} ee ${HZ_VERSION} ${{ matrix.jdk }}

- name: Get docker logs
if: ${{ always() }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ee_latest_snapshot_push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ jobs:
timeout-minutes: 2
run: |
export HZ_LICENSEKEY=${{ secrets.HZ_ENTERPRISE_LICENSE }}
.github/scripts/simple-smoke-test.sh hazelcast-ee:test ${{ env.test_container_name_ee }} ee ${HZ_VERSION}
.github/scripts/simple-smoke-test.sh hazelcast-ee:test ${{ env.test_container_name_ee }} ee ${HZ_VERSION} ${{ matrix.jdk }}

- name: Get docker logs
if: ${{ always() }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/oss_latest_snapshot_push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ jobs:
- name: Run smoke test against OSS image
timeout-minutes: 2
run: |
.github/scripts/simple-smoke-test.sh hazelcast-oss:test ${{ env.test_container_name_oss }} oss ${HZ_VERSION}
.github/scripts/simple-smoke-test.sh hazelcast-oss:test ${{ env.test_container_name_oss }} oss ${HZ_VERSION} ${{ matrix.jdk }}

- name: Get docker logs
if: ${{ always() }}
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/tag_image_push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ jobs:
if: needs.prepare.outputs.should_build_oss == 'yes'
timeout-minutes: 2
run: |
.github/scripts/simple-smoke-test.sh hazelcast-oss:test ${{ env.test_container_name_oss }} oss ${{ env.HZ_VERSION }}
.github/scripts/simple-smoke-test.sh hazelcast-oss:test ${{ env.test_container_name_oss }} oss ${{ env.HZ_VERSION }} ${{ matrix.jdk }}

- name: Get EE dist ZIP URL
run: |
Expand All @@ -170,7 +170,7 @@ jobs:
timeout-minutes: 2
run: |
export HZ_LICENSEKEY=${{ secrets.HZ_ENTERPRISE_LICENSE }}
.github/scripts/simple-smoke-test.sh hazelcast-ee:test ${{ env.test_container_name_ee }} ee ${{ env.HZ_VERSION }}
.github/scripts/simple-smoke-test.sh hazelcast-ee:test ${{ env.test_container_name_ee }} ee ${{ env.HZ_VERSION }} ${{ matrix.jdk }}

- name: Get docker logs
if: ${{ always() }}
Expand Down
Loading