11#! /usr/bin/env bash
22set -euo pipefail
33
4+ # --------------------------------------------------
5+ # REPOSITORY ROOT RESOLUTION
6+ # --------------------------------------------------
7+
8+ # Absolute path to this script (resolves symlinks)
9+ SCRIPT_PATH=" $( realpath " ${BASH_SOURCE[0]} " ) "
10+ SCRIPT_DIR=" $( dirname " $SCRIPT_PATH " ) "
11+
12+ # Try Git first (authoritative)
13+ if REPO_ROOT=" $( git -C " $SCRIPT_DIR " rev-parse --show-toplevel 2> /dev/null) " ; then
14+ :
15+ else
16+ # Fallback: assume src/bin layout
17+ REPO_ROOT=" $( realpath " $SCRIPT_DIR /../.." ) "
18+ fi
19+
420# --------------------------------------------------
521# FLAGS / DEFAULTS
622# --------------------------------------------------
@@ -70,19 +86,60 @@ if [[ "$QUIET" == "yes" ]]; then
7086fi
7187
7288# --------------------------------------------------
73- # CONFIG
89+ # Safety check
7490# --------------------------------------------------
75- VERSIONS_JSON=" ./versions.json"
76- MAINTAINERS_JSON=" ./maintainers.json"
77- HASHES_FILE=" ./hashes.txt"
91+ if [[ ! -d " $REPO_ROOT /conf" || ! -d " $REPO_ROOT /src" ]]; then
92+ echo " [ERROR] Unable to determine repository root"
93+ echo " Resolved REPO_ROOT=$REPO_ROOT "
94+ exit 1
95+ fi
7896
79- DOCKERFILE_TEMPLATE=" ./Dockerfile.template"
80- DOCKER_ENTRYPOINT=" ./docker-entrypoint.sh"
97+ # --------------------------------------------------
98+ # CONFIG (repo-root anchored)
99+ # --------------------------------------------------
100+ VERSIONS_JSON_FILE=" $REPO_ROOT /conf/versions.json"
101+ MAINTAINERS_JSON_FILE=" $REPO_ROOT /conf/maintainers.json"
102+ HASHES_FILE=" $REPO_ROOT /conf/hashes.txt"
103+ BUILD_MANIFEST_FILE=" $REPO_ROOT /conf/manifest.ndjson"
81104
82- TAG_REVIEW_FILE=" ./.log"
83- BUILD_MANIFEST=" ./manifest.ndjson"
105+ # --------------------------------------------------
106+ # Safety check
107+ # --------------------------------------------------
108+ if [[ ! -f " $VERSIONS_JSON_FILE " ]]; then
109+ echo " [ERROR] Unable to determine versions file path"
110+ echo " Resolved VERSIONS_JSON_FILE=$VERSIONS_JSON_FILE "
111+ exit 1
112+ fi
113+
114+ if [[ ! -f " $MAINTAINERS_JSON_FILE " ]]; then
115+ echo " [ERROR] Unable to determine maintainers file path"
116+ echo " Resolved MAINTAINERS_JSON_FILE=$MAINTAINERS_JSON_FILE "
117+ exit 1
118+ fi
84119
85- AWK_SCRIPT=' .jq-template.awk'
120+ DOCKERFILE_TEMPLATE=" $REPO_ROOT /src/docker/Dockerfile.template"
121+ DOCKER_ENTRYPOINT=" $REPO_ROOT /src/docker/docker-entrypoint.sh"
122+
123+ # --------------------------------------------------
124+ # Safety check
125+ # --------------------------------------------------
126+ if [[ ! -f " $DOCKERFILE_TEMPLATE " ]]; then
127+ echo " [ERROR] Unable to determine docker template file path"
128+ echo " Resolved DOCKERFILE_TEMPLATE=$DOCKERFILE_TEMPLATE "
129+ exit 1
130+ fi
131+
132+ if [[ ! -f " $DOCKER_ENTRYPOINT " ]]; then
133+ echo " [ERROR] Unable to determine docker entrypoint file path"
134+ echo " Resolved DOCKER_ENTRYPOINT=$DOCKER_ENTRYPOINT "
135+ exit 1
136+ fi
137+
138+ IMAGES_PATH=" $REPO_ROOT /images"
139+ LOG_PATH=" $REPO_ROOT /log"
140+ TAG_LOG_FILE=" $LOG_PATH /joomengine-tag.log"
141+
142+ AWK_SCRIPT=" $REPO_ROOT /src/docker/.jq-template.awk"
86143if [ -n " ${BASHBREW_SCRIPTS:- } " ]; then
87144 AWK_SCRIPT=" $BASHBREW_SCRIPTS /jq-template.awk"
88145elif [ " $BASH_SOURCE " -nt " $AWK_SCRIPT " ]; then
107164generated_warning () {
108165 cat << -EOH
109166 #
110- # NOTE: THIS DOCKERFILE IS GENERATED VIA "joomengine.sh"
167+ # NOTE: THIS DOCKERFILE IS GENERATED VIA "src/bin/ joomengine.sh"
111168 #
112169 # PLEASE DO NOT EDIT IT DIRECTLY.
113170 #
@@ -125,10 +182,26 @@ MAINTAINERS="$(
125182 .email + "> (@" +
126183 .github + ")"
127184 ) | join(", ")
128- ' " $MAINTAINERS_JSON "
185+ ' " $MAINTAINERS_JSON_FILE "
129186) "
130187export MAINTAINERS
131188
189+ # --------------------------------------------------
190+ # MOVE TO WORKING PATH
191+ # --------------------------------------------------
192+ cd " $REPO_ROOT /conf"
193+
194+ # --------------------------------------------------
195+ # INIT FOLDERS
196+ # --------------------------------------------------
197+ mkdir -p " $LOG_PATH "
198+
199+ # --------------------------------------------------
200+ # INIT FILES
201+ # --------------------------------------------------
202+ : > " $TAG_LOG_FILE "
203+ : > " $BUILD_MANIFEST_FILE "
204+
132205# --------------------------------------------------
133206# FORCE UPDATE OF ALL FILES
134207# --------------------------------------------------
@@ -138,12 +211,6 @@ else
138211 touch " $HASHES_FILE "
139212fi
140213
141- # --------------------------------------------------
142- # INIT FILES
143- # --------------------------------------------------
144- : > " $TAG_REVIEW_FILE "
145- : > " $BUILD_MANIFEST "
146-
147214# --------------------------------------------------
148215# VERSION PARSING
149216# --------------------------------------------------
@@ -182,7 +249,7 @@ ver_max() {
182249# --------------------------------------------------
183250# LOAD MAJORS
184251# --------------------------------------------------
185- mapfile -t MAJORS < <( jq -r ' keys[]' " $VERSIONS_JSON " )
252+ mapfile -t MAJORS < <( jq -r ' keys[]' " $VERSIONS_JSON_FILE " )
186253
187254# --------------------------------------------------
188255# PASS 1: CONTEXT GENERATION + RELEASE COLLECTION
@@ -203,9 +270,9 @@ for MAJOR in "${MAJORS[@]}"; do
203270 continue
204271 fi
205272
206- mapfile -t PHP_VERSIONS < <( jq -r " .\" $MAJOR \" .php[]" " $VERSIONS_JSON " )
207- mapfile -t VARIANTS < <( jq -r " .\" $MAJOR \" .variants[]" " $VERSIONS_JSON " )
208- JOOMLA_VERSION=" $( jq -r --arg m " $MAJOR " ' .[$m].joomla' " $VERSIONS_JSON " ) "
273+ mapfile -t PHP_VERSIONS < <( jq -r " .\" $MAJOR \" .php[]" " $VERSIONS_JSON_FILE " )
274+ mapfile -t VARIANTS < <( jq -r " .\" $MAJOR \" .variants[]" " $VERSIONS_JSON_FILE " )
275+ JOOMLA_VERSION=" $( jq -r --arg m " $MAJOR " ' .[$m].joomla' " $VERSIONS_JSON_FILE " ) "
209276
210277 PHP_LIST_BY_MAJOR[" $MAJOR " ]=" ${PHP_VERSIONS[*]} "
211278 VARIANT_LIST_BY_MAJOR[" $MAJOR " ]=" ${VARIANTS[*]} "
@@ -262,20 +329,21 @@ for MAJOR in "${MAJORS[@]}"; do
262329 export MAJOR_VERSION=" $MAJOR "
263330 export JOOMLA_VERSION=" $JOOMLA_VERSION "
264331
265- dir=" build/jcb${VERSION} /j${JOOMLA_VERSION} /php${PHP} /${VARIANT} "
266- mkdir -p " $dir "
332+ target=" jcb${VERSION} /j${JOOMLA_VERSION} /php${PHP} /${VARIANT} "
333+ target_dir=" ${IMAGES_PATH} /${target} "
334+ mkdir -p " $target_dir "
267335
268- echo " -> generating $dir "
336+ echo " -> generating ${target} "
269337
270- cp " $DOCKER_ENTRYPOINT " " $dir /docker-entrypoint.sh"
271- chmod +x " $dir /docker-entrypoint.sh"
338+ cp " $DOCKER_ENTRYPOINT " " ${target_dir} /docker-entrypoint.sh"
339+ chmod +x " ${target_dir} /docker-entrypoint.sh"
272340
273341 {
274342 generated_warning
275- gawk -f " $AWK_SCRIPT " " $DOCKERFILE_TEMPLATE "
276- } > " $dir /Dockerfile"
343+ gawk -f " ${ AWK_SCRIPT} " " ${ DOCKERFILE_TEMPLATE} "
344+ } > " ${target_dir} /Dockerfile"
277345
278- printf " %s %s %s %s %s\n" " $VERSION " " ${PHP} " " ${JOOMLA_VERSION} " " ${VARIANT} " " ${SHA} " >> " $HASHES_FILE "
346+ printf " %s %s %s %s %s\n" " ${ VERSION} " " ${PHP} " " ${JOOMLA_VERSION} " " ${VARIANT} " " ${SHA} " >> " $HASHES_FILE "
279347 done
280348
281349 done
308376IMAGE_NAME=" octoleo/joomengine"
309377
310378emit_tag () {
311- printf " - %s:%s\n" " $IMAGE_NAME " " $1 " >> " $TAG_REVIEW_FILE "
379+ printf " - %s:%s\n" " $IMAGE_NAME " " $1 " >> " $TAG_LOG_FILE "
312380}
313381
314382for i in " ${! REL_VERSION[@]} " ; do
@@ -368,7 +436,7 @@ for i in "${!REL_VERSION[@]}"; do
368436 echo " JOOMLA : $JOOMLA_VERSION "
369437 echo " LEADERS : stable_major=$IS_HIGHEST_STABLE_MAJOR stable_global=$IS_HIGHEST_STABLE_GLOBAL pr_major=$IS_HIGHEST_PRERELEASE_MAJOR pr_global=$IS_HIGHEST_PRERELEASE_GLOBAL "
370438 echo " TAGS:"
371- } >> " $TAG_REVIEW_FILE "
439+ } >> " $TAG_LOG_FILE "
372440
373441 # ---- Base tag (always)
374442 emit_once " ${VERSION} -php${PHP} -${VARIANT} "
@@ -461,11 +529,11 @@ for i in "${!REL_VERSION[@]}"; do
461529 fi
462530 fi
463531
464- BUILD_PATH= " build /jcb${VERSION} /j${JOOMLA_VERSION} /php${PHP} /${VARIANT} "
532+ build_path= " ${IMAGES_PATH} /jcb${VERSION} /j${JOOMLA_VERSION} /php${PHP} /${VARIANT} "
465533
466534 jq -nc \
467535 --arg image " $IMAGE_NAME " \
468- --arg path " $BUILD_PATH " \
536+ --arg path " $build_path " \
469537 --arg version " $VERSION " \
470538 --arg major " $V_MAJOR " \
471539 --arg minor " $V_MINOR " \
@@ -484,15 +552,15 @@ for i in "${!REL_VERSION[@]}"; do
484552 joomla: $joomla,
485553 base_tag: $tags[0],
486554 tags: $tags
487- }' >> " $BUILD_MANIFEST "
555+ }' >> " $BUILD_MANIFEST_FILE "
488556
489- echo >> " $TAG_REVIEW_FILE "
557+ echo >> " $TAG_LOG_FILE "
490558 done
491559 done
492560done
493561
494- echo " ✅ Tag review written to: $TAG_REVIEW_FILE "
495- echo " ✅ Build manifest written to: $BUILD_MANIFEST "
562+ echo " ✅ Tag review written to: $TAG_LOG_FILE "
563+ echo " ✅ Build manifest written to: $BUILD_MANIFEST_FILE "
496564
497565# --------------------------------------------------
498566# DOCKER AUTH VALIDATION (before build+push)
@@ -590,7 +658,7 @@ while IFS= read -r LINE || [[ -n "$LINE" ]]; do
590658 fi
591659 done
592660
593- done < " $BUILD_MANIFEST "
661+ done < " $BUILD_MANIFEST_FILE "
594662
595663echo
596664echo " ✅ All images built and tagged successfully"
0 commit comments