Skip to content

Commit 3523a63

Browse files
committed
packaging: harden packages index generator and tests
Fix macOS version parsing in build-catalog.awk, validate LATEST_VERSION overrides, and strip tree HTML footers without relying on a fixed line count. Extend regression tests for automatic latest selection, S3 parity, and invalid inputs. Disable persisted checkout credentials in the release index job. Signed-off-by: lecaros <lecaros@chronosphere.io>
1 parent 7a9995b commit 3523a63

4 files changed

Lines changed: 104 additions & 9 deletions

File tree

.github/workflows/staging-release.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,8 @@ jobs:
373373
steps:
374374
- name: Checkout code
375375
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
376+
with:
377+
persist-credentials: false
376378

377379
- name: Setup runner
378380
run: |

packaging/build-catalog.awk

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ function schema_version(name) {
1515
return name
1616
}
1717

18-
function extract_version(name, rest, i, c) {
18+
function extract_version(name, rest, i, c, following) {
1919
if (substr(name, 1, 11) == "fluent-bit-") {
2020
rest = substr(name, 12)
2121
} else if (substr(name, 1, 11) == "fluent-bit_") {
@@ -26,7 +26,19 @@ function extract_version(name, rest, i, c) {
2626

2727
for (i = 1; i <= length(rest); i++) {
2828
c = substr(rest, i, 1)
29-
if (c != "." && (c < "0" || c > "9")) {
29+
if (c == ".") {
30+
if (i < length(rest)) {
31+
following = substr(rest, i + 1, 1)
32+
if (following !~ /[0-9]/) {
33+
if (i == 1) {
34+
return ""
35+
}
36+
return substr(rest, 1, i - 1)
37+
}
38+
}
39+
continue
40+
}
41+
if (c < "0" || c > "9") {
3042
if (i == 1) {
3143
return ""
3244
}
@@ -104,7 +116,7 @@ function json_url(path) {
104116
return json_str(base_url "/" path)
105117
}
106118

107-
function note_linux(v, path, name, repo, key, label) {
119+
function note_linux(v, path, name, repo, key, label, idx) {
108120
if (!version_includes_linux(v)) {
109121
return
110122
}

packaging/generate-packages-index.sh

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ if [[ ! -s "$TREE_LIST" ]]; then
209209
fi
210210

211211
tree --noreport --charset utf-8 --fromfile "$TREE_LIST" -H "$BASE_URL" | \
212-
sed -e '/<hr>/,+7d' > "$WORK_DIR/tree.html"
212+
awk '/<hr>/ { exit } { print } END { print "</body></html>" }' > "$WORK_DIR/tree.html"
213213

214214
REPO_PATHS="$(printf '%s ' "${LINUX_REPO_PATHS[@]}")"
215215
awk -v emit_mode=versions \
@@ -231,6 +231,17 @@ while IFS= read -r version; do
231231
done < <(awk -F '\t' '{ print $1 }' "$VERSION_ROWS")
232232

233233
if [[ -n "$LATEST_VERSION" ]]; then
234+
found=0
235+
for version in "${SORTED_VERSIONS[@]}"; do
236+
if [[ "$version" == "$LATEST_VERSION" ]]; then
237+
found=1
238+
break
239+
fi
240+
done
241+
if [[ "$found" -eq 0 ]]; then
242+
echo "ERROR: LATEST_VERSION '$LATEST_VERSION' was not found among discovered versions: ${SORTED_VERSIONS[*]}" >&2
243+
exit 1
244+
fi
234245
LATEST="$LATEST_VERSION"
235246
else
236247
LATEST="${SORTED_VERSIONS[${#SORTED_VERSIONS[@]}-1]}"

packaging/testing/test-packages-index.sh

Lines changed: 75 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ S3_LISTING_FILE=""
99

1010
cleanup()
1111
{
12-
rm -rf "$OUTPUT_DIR" "${OUTPUT_DIR_S3:-}" "$S3_LISTING_FILE"
12+
rm -rf "$OUTPUT_DIR" "${OUTPUT_DIR_S3:-}" "${OUTPUT_DIR_OVERRIDE:-}" \
13+
"${EMPTY_BASE_PATH:-}" "$S3_LISTING_FILE"
1314
}
1415

1516
trap cleanup EXIT
@@ -87,11 +88,41 @@ assert_equals()
8788
fi
8889
}
8990

91+
assert_fails_with()
92+
{
93+
local expected_msg="$1"
94+
shift
95+
local output=""
96+
97+
if output=$("$@" 2>&1); then
98+
echo "ERROR: expected command to fail: $*" >&2
99+
exit 1
100+
fi
101+
102+
if [[ -n "$expected_msg" ]] && ! grep -Fq "$expected_msg" <<< "$output"; then
103+
echo "ERROR: expected error message '$expected_msg', got: $output" >&2
104+
exit 1
105+
fi
106+
}
107+
108+
assert_versions_json_match()
109+
{
110+
local left="$1"
111+
local right="$2"
112+
113+
if ! diff <(jq -S 'del(.generated_at)' "$left") \
114+
<(jq -S 'del(.generated_at)' "$right") >/dev/null; then
115+
echo "ERROR: versions.json mismatch between $left and $right" >&2
116+
diff -u <(jq -S 'del(.generated_at)' "$left") \
117+
<(jq -S 'del(.generated_at)' "$right") >&2 || true
118+
exit 1
119+
fi
120+
}
121+
90122
setup_local_fixture "$OUTPUT_DIR"
91123

92124
BASE_PATH="$OUTPUT_DIR" \
93125
AWS_S3_REMOTE_DISCOVERY=false \
94-
LATEST_VERSION=4.2.7 \
95126
BASE_URL=https://packages.example.test \
96127
"$GENERATOR"
97128

@@ -125,13 +156,18 @@ if ! jq -e '.versions[] | select(.version == "4.2.7") | .artifacts.windows.win64
125156
exit 1
126157
fi
127158

159+
if ! jq -e '.versions[] | select(.version == "4.2.7") | .artifacts.macos.pkg' \
160+
"$OUTPUT_DIR/versions.json" >/dev/null; then
161+
echo "ERROR: versions.json missing macOS pkg artifact for 4.2.7" >&2
162+
exit 1
163+
fi
164+
128165
echo "packages-index generator test passed"
129166

130167
OUTPUT_DIR_S3="$(mktemp -d)"
131168
setup_s3_listing_fixture
132169

133170
BASE_PATH="$OUTPUT_DIR_S3" \
134-
LATEST_VERSION=4.2.7 \
135171
BASE_URL=https://packages.example.test \
136172
AWS_S3_BUCKET=packages.example.test \
137173
AWS_S3_REMOTE_DISCOVERY=true \
@@ -140,11 +176,45 @@ AWS_S3_LISTING_FILE="$S3_LISTING_FILE" \
140176

141177
assert_equals "$OUTPUT_DIR_S3/latest-version.txt" "4.2.7"
142178
assert_contains "$OUTPUT_DIR_S3/index.html" "fluent-bit-4.2.7-win64.exe"
179+
assert_versions_json_match "$OUTPUT_DIR/versions.json" "$OUTPUT_DIR_S3/versions.json"
143180

144-
if ! jq -e '.latest == "4.2.7" and (.versions | length) == 2' "$OUTPUT_DIR_S3/versions.json" >/dev/null; then
145-
echo "ERROR: S3 listing parse did not produce expected versions" >&2
181+
if ! jq -e '.latest == "4.2.7" and .base_url == "https://packages.example.test" and (.versions | length) == 2' \
182+
"$OUTPUT_DIR_S3/versions.json" >/dev/null; then
183+
echo "ERROR: S3 listing parse did not produce expected catalog metadata" >&2
146184
jq . "$OUTPUT_DIR_S3/versions.json" >&2 || true
147185
exit 1
148186
fi
149187

150188
echo "packages-index S3 listing parse test passed"
189+
190+
OUTPUT_DIR_OVERRIDE="$(mktemp -d)"
191+
setup_local_fixture "$OUTPUT_DIR_OVERRIDE"
192+
193+
BASE_PATH="$OUTPUT_DIR_OVERRIDE" \
194+
AWS_S3_REMOTE_DISCOVERY=false \
195+
LATEST_VERSION=4.2.6 \
196+
BASE_URL=https://packages.example.test \
197+
"$GENERATOR"
198+
199+
assert_equals "$OUTPUT_DIR_OVERRIDE/latest-version.txt" "4.2.6"
200+
if ! jq -e '.latest == "4.2.6"' "$OUTPUT_DIR_OVERRIDE/versions.json" >/dev/null; then
201+
echo "ERROR: LATEST_VERSION override did not update latest field" >&2
202+
exit 1
203+
fi
204+
205+
assert_fails_with "LATEST_VERSION '9.9.9' was not found among discovered versions" \
206+
env BASE_PATH="$OUTPUT_DIR" AWS_S3_REMOTE_DISCOVERY=false LATEST_VERSION=9.9.9 \
207+
BASE_URL=https://packages.example.test "$GENERATOR"
208+
209+
EMPTY_BASE_PATH="$(mktemp -d)"
210+
assert_fails_with "ERROR: no objects found under" \
211+
env BASE_PATH="$EMPTY_BASE_PATH" AWS_S3_REMOTE_DISCOVERY=false \
212+
BASE_URL=https://packages.example.test "$GENERATOR"
213+
214+
assert_fails_with "AWS_S3_LISTING_FILE does not exist" \
215+
env BASE_PATH="$OUTPUT_DIR_S3" AWS_S3_REMOTE_DISCOVERY=true \
216+
AWS_S3_BUCKET=packages.example.test \
217+
AWS_S3_LISTING_FILE=/tmp/does-not-exist-packages-index-test \
218+
BASE_URL=https://packages.example.test "$GENERATOR"
219+
220+
echo "packages-index validation error handling test passed"

0 commit comments

Comments
 (0)