88jobs :
99 hourly-build :
1010 name : Periodic Gateway Build
11- runs-on : ubuntu-24.04
12- permissions :
13- contents : read
14- packages : read
11+ runs-on : ubuntu-latest
12+
13+ # BUILDX_BUILDER will be detected and exported by the initiation step
1514
1615 steps :
1716 # ------------------------------------------------------------
@@ -35,39 +34,88 @@ jobs:
3534 docker.log
3635
3736 # ------------------------------------------------------------
38- # 1. Docker / Buildx (aligned with gateway-release.yml)
37+ # 1. Initiation
3938 # ------------------------------------------------------------
40- - name : Set up QEMU
41- uses : docker/setup-qemu-action@v3
42- with :
43- platforms : linux/amd64,linux/arm64
44-
45- - name : Set up Docker Buildx
46- uses : docker/setup-buildx-action@v3
47- with :
48- install : true
49- driver : docker-container
50-
51- - name : Log in to GitHub Container Registry
52- uses : docker/login-action@v3
53- with :
54- registry : ghcr.io
55- username : ${{ github.actor }}
56- password : ${{ secrets.GITHUB_TOKEN }}
57-
5839 - name : Initiate environment
5940 run : |
6041 set -o pipefail
6142 {
6243 echo "== Repository =="
6344 git rev-parse HEAD
6445
46+ echo "== Go version =="
47+ go version || true
48+
6549 echo "== Docker =="
6650 docker version
6751
68- echo "== Buildx =="
69- docker buildx ls
52+ echo "== Buildx setup =="
53+
54+ # Prefer an active docker-backed builder. Strategy:
55+ # 1. If there's an active builder (starred), and it's docker-backed, use it.
56+ # 2. Otherwise, find any existing docker-backed builder and use it.
57+ # 3. Otherwise, attempt to create `docker-local` and use it only if creation succeeded.
58+ # 4. If none of the above work, fall back to whatever builder is active (do not attempt to `use` a non-existent name).
59+ ACTIVE_BUILDER=$(docker buildx ls 2>/dev/null | awk '/\*/{print $1}' | sed 's/\*//g' | head -n1 || true)
60+ CHOSEN_BUILDER=""
61+
62+ if [ -n "${ACTIVE_BUILDER}" ] && docker buildx inspect "${ACTIVE_BUILDER}" >/dev/null 2>&1 && docker buildx inspect "${ACTIVE_BUILDER}" | grep -qi 'Driver: *docker'; then
63+ CHOSEN_BUILDER="${ACTIVE_BUILDER}"
64+ echo "Active docker-backed builder detected: ${CHOSEN_BUILDER}"
65+ else
66+ # find any docker-backed builder
67+ for b in $(docker buildx ls 2>/dev/null | tail -n +2 | awk '{print $1}' | sed 's/\*//g'); do
68+ if docker buildx inspect "$b" >/dev/null 2>&1 && docker buildx inspect "$b" | grep -qi 'Driver: *docker'; then
69+ CHOSEN_BUILDER="$b"
70+ echo "Found existing docker-backed builder: ${CHOSEN_BUILDER}"
71+ break
72+ fi
73+ done
74+ fi
75+
76+ if [ -z "${CHOSEN_BUILDER}" ]; then
77+ echo "No existing docker-backed builder found; attempting to create docker-local"
78+ if docker buildx create --name docker-local --driver docker >/dev/null 2>&1; then
79+ CHOSEN_BUILDER="docker-local"
80+ echo "Created docker-local builder"
81+ else
82+ echo "Could not create docker-local builder; will not call 'docker buildx use' for a missing builder"
83+ fi
84+ fi
85+
86+ # Only call `docker buildx use` if the chosen builder actually exists.
87+ if [ -n "${CHOSEN_BUILDER}" ] && docker buildx inspect "${CHOSEN_BUILDER}" >/dev/null 2>&1; then
88+ docker buildx use "${CHOSEN_BUILDER}"
89+ else
90+ echo "Proceeding without switching builder (using runner's default)"
91+ fi
92+
7093 docker buildx inspect --bootstrap
94+ docker buildx ls
95+
96+ # Determine and export the builder for later steps.
97+ CURRENT_BUILDER=$(docker buildx ls 2>/dev/null | awk '/\*/{print $1}' | sed 's/\*//g' | head -n1 || true)
98+ if [ -z "${CURRENT_BUILDER}" ]; then
99+ if [ -n "${CHOSEN_BUILDER}" ]; then
100+ CURRENT_BUILDER="${CHOSEN_BUILDER}"
101+ elif docker buildx inspect docker-local >/dev/null 2>&1; then
102+ CURRENT_BUILDER="docker-local"
103+ else
104+ for b in $(docker buildx ls 2>/dev/null | tail -n +2 | awk '{print $1}' | sed 's/\*//g'); do
105+ if docker buildx inspect "$b" >/dev/null 2>&1 && docker buildx inspect "$b" | grep -qi 'Driver: *docker'; then
106+ CURRENT_BUILDER="$b"
107+ break
108+ fi
109+ done
110+ fi
111+ fi
112+ if [ -n "${CURRENT_BUILDER}" ]; then
113+ echo "BUILDX_BUILDER=${CURRENT_BUILDER}" >> $GITHUB_ENV
114+ echo "Exported BUILDX_BUILDER=${CURRENT_BUILDER}"
115+ else
116+ echo "BUILDX_BUILDER=" >> $GITHUB_ENV
117+ echo "No docker-backed builder available; subsequent steps may use runner default"
118+ fi
71119 } 2>&1 | tee 1-initiate.log || true
72120
73121 - name : Set up Go
@@ -134,7 +182,9 @@ jobs:
134182 run : |
135183 set -o pipefail
136184
137- LOG_ROOT="$HOME/.wso2ap/.tmp"
185+ REAL_DOCKER_LOG="$HOME/.wso2ap/.tmp/gateway-image-build/logs/docker.log"
186+
187+ mkdir -p "$(dirname "$REAL_DOCKER_LOG")"
138188
139189 set -o pipefail
140190
@@ -144,11 +194,8 @@ jobs:
144194 (./ap gateway image build) 2>&1 | tee "$GITHUB_WORKSPACE/5-ap-gw-image-build.log"
145195 BUILD_RC=${PIPESTATUS[0]}
146196
147- # Resolve the most recent gateway build log directory (CLI uses gateway-image-build-<id>/logs/docker.log)
148- LOG_DIR="$(ls -dt "$LOG_ROOT"/gateway-image-build*/logs 2>/dev/null | head -n1 || true)"
149- REAL_DOCKER_LOG="${LOG_DIR:+$LOG_DIR/docker.log}"
150-
151197 # Post-build diagnostics: list/log sizes/stat to help debug missing files
198+ LOG_DIR="$(dirname "$REAL_DOCKER_LOG")"
152199 echo "=== DIAGNOSTICS: list $LOG_DIR ===" >> "$GITHUB_WORKSPACE/5-ap-gw-image-build.log" 2>&1
153200 ls -la "$LOG_DIR" >> "$GITHUB_WORKSPACE/5-ap-gw-image-build.log" 2>&1 || true
154201 echo "=== DIAGNOSTICS: stat $REAL_DOCKER_LOG ===" >> "$GITHUB_WORKSPACE/5-ap-gw-image-build.log" 2>&1
@@ -175,10 +222,6 @@ jobs:
175222
176223 # Exit with the build return code so failures are visible
177224 if [ "${BUILD_RC}" -ne 0 ]; then
178- if [ -f "$REAL_DOCKER_LOG" ]; then
179- echo "=== docker.log (last 200 lines) ===" >> "$GITHUB_WORKSPACE/5-ap-gw-image-build.log"
180- tail -n 200 "$REAL_DOCKER_LOG" >> "$GITHUB_WORKSPACE/5-ap-gw-image-build.log" 2>&1 || true
181- fi
182225 echo "ap gateway image build failed (rc=${BUILD_RC})" >&2
183226 exit ${BUILD_RC}
184227 fi
@@ -195,18 +238,18 @@ jobs:
195238 run : |
196239 set -o pipefail
197240
198- LOG_ROOT="$HOME/.wso2ap/.tmp"
241+ REAL_DOCKER_LOG="$HOME/.wso2ap/.tmp/gateway-image-build/logs/docker.log"
242+
243+ mkdir -p "$(dirname "$REAL_DOCKER_LOG")"
199244
200245 set -o pipefail
201246
202247 # cd into sample-policies so that relative filePath entries in build.yaml resolve correctly
203248 (cd sample-policies && ../ap gateway image build) 2>&1 | tee "$GITHUB_WORKSPACE/6-sample-policies-gw-image-build.log"
204249 BUILD_RC=${PIPESTATUS[0]}
205250
206- LOG_DIR="$(ls -dt "$LOG_ROOT"/gateway-image-build*/logs 2>/dev/null | head -n1 || true)"
207- REAL_DOCKER_LOG="${LOG_DIR:+$LOG_DIR/docker.log}"
208-
209251 # Post-build diagnostics
252+ LOG_DIR="$(dirname "$REAL_DOCKER_LOG")"
210253 echo "=== DIAGNOSTICS: list $LOG_DIR ===" >> "$GITHUB_WORKSPACE/6-sample-policies-gw-image-build.log" 2>&1
211254 ls -la "$LOG_DIR" >> "$GITHUB_WORKSPACE/6-sample-policies-gw-image-build.log" 2>&1 || true
212255 echo "=== DIAGNOSTICS: stat $REAL_DOCKER_LOG ===" >> "$GITHUB_WORKSPACE/6-sample-policies-gw-image-build.log" 2>&1
@@ -230,10 +273,6 @@ jobs:
230273
231274 # Exit with the build return code so failures are visible
232275 if [ "${BUILD_RC}" -ne 0 ]; then
233- if [ -f "$REAL_DOCKER_LOG" ]; then
234- echo "=== docker.log (last 200 lines) ===" >> "$GITHUB_WORKSPACE/6-sample-policies-gw-image-build.log"
235- tail -n 200 "$REAL_DOCKER_LOG" >> "$GITHUB_WORKSPACE/6-sample-policies-gw-image-build.log" 2>&1 || true
236- fi
237276 echo "ap gateway image build with sample policies failed (rc=${BUILD_RC})" >&2
238277 exit ${BUILD_RC}
239278 fi
0 commit comments