Skip to content

Commit 8c3002d

Browse files
authored
[DX-3581] CRE system tests with public images (#21748)
add a dedicated bash script for resolving chainlink image to use in the pipeline; bump a couple of actions' versions
1 parent 136a547 commit 8c3002d

5 files changed

Lines changed: 295 additions & 62 deletions

File tree

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#!/usr/bin/env bash
2+
# Resolves the Chainlink Docker image to use based on environment variables.
3+
# Priority:
4+
# 1. If CHAINLINK_FULL_IMAGE is set, use it directly (must include registry and tag/digest).
5+
# 2. Otherwise, construct the image from:
6+
# - Repository: CHAINLINK_IMAGE_REPO (default: "chainlink")
7+
# - Tag: CHAINLINK_IMAGE_TAG or fallback to CHAINLINK_VERSION
8+
# - Registry: AWS ECR using AWS_ACCOUNT_NUMBER and AWS_REGION
9+
# Enforces mutual exclusivity between FULL_IMAGE and repo/tag inputs, and validates required fields.
10+
set -euo pipefail
11+
12+
error() {
13+
echo "Error: $1" >&2
14+
exit 1
15+
}
16+
17+
full_image="${CHAINLINK_FULL_IMAGE:-}"
18+
explicit_repo="${CHAINLINK_IMAGE_REPO:-}"
19+
tag="${CHAINLINK_IMAGE_TAG:-}"
20+
version="${CHAINLINK_VERSION:-}"
21+
aws_account="${AWS_ACCOUNT_NUMBER:-}"
22+
aws_region="${AWS_REGION:-}"
23+
24+
resolved_repo="${explicit_repo:-chainlink}"
25+
26+
if [[ -n "${full_image}" ]]; then
27+
if [[ -n "${tag}" || -n "${explicit_repo}" ]]; then
28+
error "'CHAINLINK_FULL_IMAGE' is mutually exclusive with 'CHAINLINK_IMAGE_TAG' and 'CHAINLINK_IMAGE_REPO'."
29+
fi
30+
31+
if [[ ! "${full_image}" =~ .+/.+(:[^@]+|@sha256:[a-f0-9]{64})$ ]]; then
32+
error "Invalid 'CHAINLINK_FULL_IMAGE' format: '${full_image}'. Expected '<registry>/<repo>:<tag>' or '<registry>/<repo>@sha256:<digest>'."
33+
fi
34+
35+
printf '%s\n' "${full_image}"
36+
exit 0
37+
fi
38+
39+
resolved_tag="${tag:-$version}"
40+
if [[ -z "${resolved_tag}" ]]; then
41+
error "Either provide 'CHAINLINK_FULL_IMAGE' or provide a tag via 'CHAINLINK_IMAGE_TAG' (or 'CHAINLINK_VERSION')."
42+
fi
43+
44+
if [[ -z "${aws_account}" || -z "${aws_region}" ]]; then
45+
error "When 'CHAINLINK_FULL_IMAGE' is not provided, both 'AWS_ACCOUNT_NUMBER' and 'AWS_REGION' environment variables must be set and non-empty."
46+
fi
47+
48+
printf '%s\n' "${aws_account}.dkr.ecr.${aws_region}.amazonaws.com/${resolved_repo}:${resolved_tag}"
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5+
TARGET_SCRIPT="${SCRIPT_DIR}/resolve-chainlink-image.sh"
6+
7+
TESTS_RUN=0
8+
TESTS_FAILED=0
9+
10+
RUN_STATUS=0
11+
RUN_STDOUT=""
12+
RUN_STDERR=""
13+
14+
run_script() {
15+
local -a env_vars=("$@")
16+
local stdout_file
17+
local stderr_file
18+
stdout_file="$(mktemp)"
19+
stderr_file="$(mktemp)"
20+
21+
set +e
22+
env -i PATH="${PATH}" "${env_vars[@]}" bash "${TARGET_SCRIPT}" >"${stdout_file}" 2>"${stderr_file}"
23+
RUN_STATUS=$?
24+
set -e
25+
26+
RUN_STDOUT="$(<"${stdout_file}")"
27+
RUN_STDERR="$(<"${stderr_file}")"
28+
rm -f "${stdout_file}" "${stderr_file}"
29+
}
30+
31+
assert_eq() {
32+
local got="$1"
33+
local want="$2"
34+
local msg="$3"
35+
if [[ "${got}" != "${want}" ]]; then
36+
echo "FAIL: ${msg}"
37+
echo " expected: ${want}"
38+
echo " got: ${got}"
39+
TESTS_FAILED=$((TESTS_FAILED + 1))
40+
fi
41+
}
42+
43+
assert_contains() {
44+
local haystack="$1"
45+
local needle="$2"
46+
local msg="$3"
47+
if [[ "${haystack}" != *"${needle}"* ]]; then
48+
echo "FAIL: ${msg}"
49+
echo " expected substring: ${needle}"
50+
echo " got: ${haystack}"
51+
TESTS_FAILED=$((TESTS_FAILED + 1))
52+
fi
53+
}
54+
55+
test_full_image_tag() {
56+
TESTS_RUN=$((TESTS_RUN + 1))
57+
run_script \
58+
"CHAINLINK_FULL_IMAGE=public.ecr.aws/chainlink/chainlink:2.0.0"
59+
assert_eq "${RUN_STATUS}" "0" "full image with tag exits 0"
60+
assert_eq "${RUN_STDOUT}" "public.ecr.aws/chainlink/chainlink:2.0.0" "full image is returned to stdout"
61+
assert_eq "${RUN_STDERR}" "" "full image success does not write stderr"
62+
}
63+
64+
test_full_image_digest() {
65+
TESTS_RUN=$((TESTS_RUN + 1))
66+
run_script \
67+
"CHAINLINK_FULL_IMAGE=public.ecr.aws/chainlink/chainlink@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
68+
assert_eq "${RUN_STATUS}" "0" "full image with digest exits 0"
69+
assert_eq "${RUN_STDOUT}" "public.ecr.aws/chainlink/chainlink@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "digest image is returned to stdout"
70+
}
71+
72+
test_repo_and_tag() {
73+
TESTS_RUN=$((TESTS_RUN + 1))
74+
run_script \
75+
"CHAINLINK_IMAGE_REPO=chainlink-integration-tests" \
76+
"CHAINLINK_IMAGE_TAG=v2.1.0" \
77+
"AWS_ACCOUNT_NUMBER=123456789012" \
78+
"AWS_REGION=us-west-2"
79+
assert_eq "${RUN_STATUS}" "0" "repo and tag exits 0"
80+
assert_eq "${RUN_STDOUT}" "123456789012.dkr.ecr.us-west-2.amazonaws.com/chainlink-integration-tests:v2.1.0" "repo and tag resolve to ECR image"
81+
assert_eq "${RUN_STDERR}" "" "repo/tag success does not write stderr"
82+
}
83+
84+
test_default_repo_and_version() {
85+
TESTS_RUN=$((TESTS_RUN + 1))
86+
run_script \
87+
"CHAINLINK_VERSION=abc123" \
88+
"AWS_ACCOUNT_NUMBER=123456789012" \
89+
"AWS_REGION=us-west-2"
90+
assert_eq "${RUN_STATUS}" "0" "version fallback exits 0"
91+
assert_eq "${RUN_STDOUT}" "123456789012.dkr.ecr.us-west-2.amazonaws.com/chainlink:abc123" "default repo is chainlink"
92+
}
93+
94+
test_tag_wins_over_version() {
95+
TESTS_RUN=$((TESTS_RUN + 1))
96+
run_script \
97+
"CHAINLINK_IMAGE_TAG=explicit-tag" \
98+
"CHAINLINK_VERSION=abc123" \
99+
"AWS_ACCOUNT_NUMBER=123456789012" \
100+
"AWS_REGION=us-west-2"
101+
assert_eq "${RUN_STATUS}" "0" "tag override exits 0"
102+
assert_eq "${RUN_STDOUT}" "123456789012.dkr.ecr.us-west-2.amazonaws.com/chainlink:explicit-tag" "tag wins over version"
103+
}
104+
105+
test_mutual_exclusion_full_and_tag() {
106+
TESTS_RUN=$((TESTS_RUN + 1))
107+
run_script \
108+
"CHAINLINK_FULL_IMAGE=public.ecr.aws/chainlink/chainlink:2.0.0" \
109+
"CHAINLINK_IMAGE_TAG=v2.1.0"
110+
assert_eq "${RUN_STATUS}" "1" "full image and tag exits 1"
111+
assert_contains "${RUN_STDERR}" "mutually exclusive" "mutual exclusion error is reported"
112+
}
113+
114+
test_invalid_full_image() {
115+
TESTS_RUN=$((TESTS_RUN + 1))
116+
run_script \
117+
"CHAINLINK_FULL_IMAGE=chainlink:2.0.0"
118+
assert_eq "${RUN_STATUS}" "1" "invalid full image exits 1"
119+
assert_contains "${RUN_STDERR}" "Invalid 'CHAINLINK_FULL_IMAGE' format" "invalid full image format is reported"
120+
}
121+
122+
test_missing_tag_and_version() {
123+
TESTS_RUN=$((TESTS_RUN + 1))
124+
run_script \
125+
"AWS_ACCOUNT_NUMBER=123456789012" \
126+
"AWS_REGION=us-west-2"
127+
assert_eq "${RUN_STATUS}" "1" "missing tag and version exits 1"
128+
assert_contains "${RUN_STDERR}" "Either provide 'CHAINLINK_FULL_IMAGE'" "missing tag/version error is reported"
129+
}
130+
131+
test_missing_aws_envs() {
132+
TESTS_RUN=$((TESTS_RUN + 1))
133+
run_script \
134+
"CHAINLINK_IMAGE_TAG=v2.1.0"
135+
assert_eq "${RUN_STATUS}" "1" "missing AWS env vars exits 1"
136+
assert_contains "${RUN_STDERR}" "'AWS_ACCOUNT_NUMBER' and 'AWS_REGION'" "missing AWS env vars error is reported"
137+
}
138+
139+
main() {
140+
test_full_image_tag
141+
test_full_image_digest
142+
test_repo_and_tag
143+
test_default_repo_and_version
144+
test_tag_wins_over_version
145+
test_mutual_exclusion_full_and_tag
146+
test_invalid_full_image
147+
test_missing_tag_and_version
148+
test_missing_aws_envs
149+
150+
if [[ "${TESTS_FAILED}" -ne 0 ]]; then
151+
echo
152+
echo "Tests failed: ${TESTS_FAILED}/${TESTS_RUN}"
153+
exit 1
154+
fi
155+
156+
echo "All tests passed: ${TESTS_RUN}"
157+
}
158+
159+
main

0 commit comments

Comments
 (0)