Skip to content

Commit c4e6a37

Browse files
committed
packaging: pass the elements to jq by pipes instead of command line
Signed-off-by: lecaros <lecaros@chronosphere.io>
1 parent cf50b7e commit c4e6a37

3 files changed

Lines changed: 161 additions & 15 deletions

File tree

packaging/build-catalog.awk

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,41 @@
11
BEGIN {
22
nrepos = split(repo_paths, repos, " ")
3+
if (min_catalog_major !~ /^[0-9]+$/) {
4+
print "ERROR: min_catalog_major must be a nonnegative integer: " min_catalog_major > "/dev/stderr"
5+
exit 1
6+
}
7+
min_catalog_major = min_catalog_major + 0
38
}
49

510
function is_version(v) {
611
return v ~ /^[0-9]+\.[0-9]+(\.[0-9]+)*$/
712
}
813

14+
function version_major(v, parts) {
15+
split(v, parts, ".")
16+
return parts[1] + 0
17+
}
18+
19+
function version_in_catalog(v) {
20+
if (!is_version(v)) {
21+
return 0
22+
}
23+
if (min_catalog_major == 0) {
24+
return 1
25+
}
26+
return version_major(v) >= min_catalog_major
27+
}
28+
29+
function path_in_catalog(path, n, name, v, parts) {
30+
n = split(path, parts, "/")
31+
name = parts[n]
32+
v = extract_version(name)
33+
if (v == "") {
34+
return 1
35+
}
36+
return version_in_catalog(v)
37+
}
38+
939
function schema_version(name) {
1040
if (name !~ /^fluent-bit-schema-[0-9]+\.[0-9]+(\.[0-9]+)*\.json$/) {
1141
return ""
@@ -49,10 +79,6 @@ function extract_version(name, rest, i, c, following) {
4979
return rest
5080
}
5181

52-
function version_includes_linux(v) {
53-
return v ~ /^[45]\./
54-
}
55-
5682
function repo_prefix(path, i, p) {
5783
for (i = 1; i <= nrepos; i++) {
5884
p = repos[i]
@@ -117,7 +143,7 @@ function json_url(path) {
117143
}
118144

119145
function note_linux(v, path, name, repo, key, label, idx) {
120-
if (!version_includes_linux(v)) {
146+
if (!version_in_catalog(v)) {
121147
return
122148
}
123149
key = v SUBSEP path
@@ -212,12 +238,20 @@ function emit_version(v, out, i, repo_key, repo, repos_out, repos_n) {
212238

213239
path = $0
214240
sub(/\r$/, "", path)
241+
242+
if (emit_mode == "filter") {
243+
if (path_in_catalog(path)) {
244+
print path
245+
}
246+
next
247+
}
248+
215249
n = split(path, parts, "/")
216250
name = parts[n]
217251

218252
if (name ~ /^fluent-bit-schema-[0-9]+\.[0-9]+(\.[0-9]+)*\.json$/) {
219253
v = schema_version(name)
220-
if (is_version(v)) {
254+
if (version_in_catalog(v)) {
221255
versions[v] = 1
222256
schema[v] = path
223257
}
@@ -227,7 +261,7 @@ function emit_version(v, out, i, repo_key, repo, repos_out, repos_n) {
227261
if (path ~ /^windows\//) {
228262
v = extract_version(name)
229263
key = windows_key(name, v)
230-
if (key != "") {
264+
if (key != "" && version_in_catalog(v)) {
231265
versions[v] = 1
232266
windows[v, key] = path
233267
}
@@ -236,7 +270,7 @@ function emit_version(v, out, i, repo_key, repo, repos_out, repos_n) {
236270

237271
if (path ~ /^macos\//) {
238272
v = extract_version(name)
239-
if (v == "") {
273+
if (v == "" || !version_in_catalog(v)) {
240274
next
241275
}
242276
versions[v] = 1
@@ -254,7 +288,7 @@ function emit_version(v, out, i, repo_key, repo, repos_out, repos_n) {
254288
next
255289
}
256290
v = extract_version(name)
257-
if (!is_version(v)) {
291+
if (!version_in_catalog(v)) {
258292
next
259293
}
260294
versions[v] = 1
@@ -264,8 +298,11 @@ function emit_version(v, out, i, repo_key, repo, repos_out, repos_n) {
264298

265299
END {
266300
mode = emit_mode
301+
if (mode == "filter") {
302+
exit 0
303+
}
267304
for (v in versions) {
268-
if (!is_version(v)) {
305+
if (!version_in_catalog(v)) {
269306
continue
270307
}
271308
if (mode == "versions") {

packaging/generate-packages-index.sh

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ AWS_S3_BUCKET=${AWS_S3_BUCKET:-}
1212
AWS_S3_REMOTE_DISCOVERY=${AWS_S3_REMOTE_DISCOVERY:-false}
1313
AWS_S3_NO_SIGN_REQUEST=${AWS_S3_NO_SIGN_REQUEST:-true}
1414
AWS_S3_ENDPOINT=${AWS_S3_ENDPOINT:-}
15+
MIN_CATALOG_MAJOR=${MIN_CATALOG_MAJOR:-3}
1516

1617
WORK_DIR=""
1718
OBJECT_LIST=""
@@ -57,6 +58,7 @@ Environment variables:
5758
AWS_S3_ENDPOINT Optional custom S3 endpoint URL
5859
GITHUB_REPO GitHub repository URL for release links
5960
DOCS_URL Installation documentation URL
61+
MIN_CATALOG_MAJOR Minimum major version in catalog (default: 3, 0 = all)
6062
6163
Example:
6264
BASE_PATH=./catalog ./generate-packages-index.sh
@@ -96,6 +98,11 @@ if ! command -v tree >/dev/null 2>&1; then
9698
exit 1
9799
fi
98100

101+
if [[ ! "$MIN_CATALOG_MAJOR" =~ ^[0-9]+$ ]]; then
102+
echo "ERROR: MIN_CATALOG_MAJOR must be a nonnegative integer: $MIN_CATALOG_MAJOR" >&2
103+
exit 1
104+
fi
105+
99106
BASE_PATH="$(cd "$BASE_PATH" && pwd)"
100107
WORK_DIR="$(mktemp -d)"
101108
OBJECT_LIST="$WORK_DIR/objects.txt"
@@ -203,6 +210,17 @@ fi
203210
grep -Ev 'source-|pool|dists' "$OBJECT_LIST" | \
204211
grep -E '\.(rpm|deb|key|repo|exe|msi|zip|pkg)$' > "$TREE_LIST" || true
205212

213+
awk -v emit_mode=filter \
214+
-v min_catalog_major="$MIN_CATALOG_MAJOR" \
215+
-f "$SCRIPT_DIR/build-catalog.awk" \
216+
"$TREE_LIST" > "$WORK_DIR/tree-filtered.txt"
217+
218+
if [[ -s "$WORK_DIR/tree-filtered.txt" ]]; then
219+
mv "$WORK_DIR/tree-filtered.txt" "$TREE_LIST"
220+
else
221+
: > "$TREE_LIST"
222+
fi
223+
206224
if [[ ! -s "$TREE_LIST" ]]; then
207225
echo "ERROR: no package files found for index.html" >&2
208226
exit 1
@@ -217,6 +235,7 @@ awk -v emit_mode=versions \
217235
-v github_release="$GITHUB_REPO" \
218236
-v docs_url="$DOCS_URL" \
219237
-v repo_paths="$REPO_PATHS" \
238+
-v min_catalog_major="$MIN_CATALOG_MAJOR" \
220239
-f "$SCRIPT_DIR/build-catalog.awk" \
221240
"$OBJECT_LIST" | sort -t $'\t' -V -k1,1 > "$VERSION_ROWS"
222241

@@ -249,16 +268,15 @@ fi
249268

250269
GENERATED_AT="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
251270

252-
jq -n \
271+
awk -F '\t' '{ print $2 }' "$VERSION_ROWS" | jq -s \
253272
--arg latest "$LATEST" \
254273
--arg generated_at "$GENERATED_AT" \
255274
--arg base_url "$BASE_URL" \
256-
--argjson versions "$(awk -F '\t' '{ print $2 }' "$VERSION_ROWS" | jq -s 'reverse')" \
257-
'{
275+
'reverse | {
258276
latest: $latest,
259277
generated_at: $generated_at,
260278
base_url: $base_url,
261-
versions: $versions
279+
versions: .
262280
}' > "$BASE_PATH/versions.json"
263281

264282
printf '%s\n' "$LATEST" > "$BASE_PATH/latest-version.txt"

packaging/testing/test-packages-index.sh

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ S3_LISTING_FILE=""
1010
cleanup()
1111
{
1212
rm -rf "$OUTPUT_DIR" "${OUTPUT_DIR_S3:-}" "${OUTPUT_DIR_OVERRIDE:-}" \
13-
"${EMPTY_BASE_PATH:-}" "$S3_LISTING_FILE"
13+
"${OUTPUT_DIR_MIN:-}" "${OUTPUT_DIR_ALL:-}" \
14+
"${EMPTY_BASE_PATH:-}" "${JQ_STRESS_DIR:-}" "$S3_LISTING_FILE"
1415
}
1516

1617
trap cleanup EXIT
@@ -48,6 +49,16 @@ setup_local_fixture()
4849
"$root/windows/fluent-bit-4.2.7-win64.zip"
4950
}
5051

52+
setup_local_fixture_with_legacy()
53+
{
54+
local root="$1"
55+
56+
setup_local_fixture "$root"
57+
touch \
58+
"$root/centos/9/fluent-bit-2.1.0-1.x86_64.rpm" \
59+
"$root/windows/fluent-bit-2.1.0-win64.exe"
60+
}
61+
5162
setup_s3_listing_fixture()
5263
{
5364
S3_LISTING_FILE="$(mktemp)"
@@ -237,3 +248,83 @@ if ! jq -e '.latest == "4.2.7"' "$PREVIEW_DIR/versions.json" >/dev/null; then
237248
fi
238249

239250
echo "packages-index preview script test passed"
251+
252+
OUTPUT_DIR_MIN="$(mktemp -d)"
253+
setup_local_fixture_with_legacy "$OUTPUT_DIR_MIN"
254+
255+
BASE_PATH="$OUTPUT_DIR_MIN" \
256+
AWS_S3_REMOTE_DISCOVERY=false \
257+
BASE_URL=https://packages.example.test \
258+
"$GENERATOR"
259+
260+
if jq -e '.versions[] | select(.version == "2.1.0")' "$OUTPUT_DIR_MIN/versions.json" >/dev/null; then
261+
echo "ERROR: versions.json should exclude 2.1.0 with default MIN_CATALOG_MAJOR" >&2
262+
exit 1
263+
fi
264+
265+
if grep -Fq "fluent-bit-2.1.0" "$OUTPUT_DIR_MIN/index.html"; then
266+
echo "ERROR: index.html should exclude 2.1.0 packages with default MIN_CATALOG_MAJOR" >&2
267+
exit 1
268+
fi
269+
270+
echo "packages-index min catalog major test passed"
271+
272+
OUTPUT_DIR_ALL="$(mktemp -d)"
273+
setup_local_fixture_with_legacy "$OUTPUT_DIR_ALL"
274+
275+
BASE_PATH="$OUTPUT_DIR_ALL" \
276+
AWS_S3_REMOTE_DISCOVERY=false \
277+
MIN_CATALOG_MAJOR=0 \
278+
BASE_URL=https://packages.example.test \
279+
"$GENERATOR"
280+
281+
if ! jq -e '.versions[] | select(.version == "2.1.0")' "$OUTPUT_DIR_ALL/versions.json" >/dev/null; then
282+
echo "ERROR: versions.json should include 2.1.0 when MIN_CATALOG_MAJOR=0" >&2
283+
exit 1
284+
fi
285+
286+
if ! jq -e '.versions[] | select(.version == "2.1.0") | .artifacts.linux[] | select(.name == "fluent-bit-2.1.0-1.x86_64.rpm")' \
287+
"$OUTPUT_DIR_ALL/versions.json" >/dev/null; then
288+
echo "ERROR: versions.json missing Linux RPM artifact for 2.1.0 when MIN_CATALOG_MAJOR=0" >&2
289+
exit 1
290+
fi
291+
292+
assert_contains "$OUTPUT_DIR_ALL/index.html" "fluent-bit-2.1.0-win64.exe"
293+
294+
echo "packages-index disabled min catalog major test passed"
295+
296+
assert_fails_with "MIN_CATALOG_MAJOR must be a nonnegative integer" \
297+
env BASE_PATH="$OUTPUT_DIR" AWS_S3_REMOTE_DISCOVERY=false MIN_CATALOG_MAJOR=-1 \
298+
BASE_URL=https://packages.example.test "$GENERATOR"
299+
300+
assert_fails_with "MIN_CATALOG_MAJOR must be a nonnegative integer" \
301+
env BASE_PATH="$OUTPUT_DIR" AWS_S3_REMOTE_DISCOVERY=false MIN_CATALOG_MAJOR=abc \
302+
BASE_URL=https://packages.example.test "$GENERATOR"
303+
304+
echo "packages-index min catalog major validation test passed"
305+
306+
JQ_STRESS_DIR="$(mktemp -d)"
307+
VERSION_ROWS="$JQ_STRESS_DIR/version-rows.tsv"
308+
i=0
309+
while [[ "$i" -lt 500 ]]; do
310+
i=$((i + 1))
311+
printf '3.0.%s\t{"version":"3.0.%s"}\n' "$i" "$i"
312+
done > "$VERSION_ROWS"
313+
314+
awk -F '\t' '{ print $2 }' "$VERSION_ROWS" | jq -s \
315+
--arg latest "3.0.500" \
316+
--arg generated_at "2026-01-01T00:00:00Z" \
317+
--arg base_url "https://packages.example.test" \
318+
'reverse | {
319+
latest: $latest,
320+
generated_at: $generated_at,
321+
base_url: $base_url,
322+
versions: .
323+
}' > "$JQ_STRESS_DIR/versions.json"
324+
325+
if ! jq -e '.latest == "3.0.500" and (.versions | length) == 500' "$JQ_STRESS_DIR/versions.json" >/dev/null; then
326+
echo "ERROR: large versions.json envelope generation failed" >&2
327+
exit 1
328+
fi
329+
330+
echo "packages-index large versions.json test passed"

0 commit comments

Comments
 (0)