feat: stream build logs, trigger argocd refresh, watch rollout

This commit is contained in:
Tanner Wright
2026-05-24 14:40:46 -06:00
parent 7f9ca156b0
commit 2ebb68d18a
+35 -6
View File
@@ -4,6 +4,7 @@ set -e
IMAGE=${IMAGE:-$REPO} IMAGE=${IMAGE:-$REPO}
JOB_SAFE=$(echo "${IMAGE}" | tr '_' '-') JOB_SAFE=$(echo "${IMAGE}" | tr '_' '-')
JOB_NAME="build-${JOB_SAFE}-${GITHUB_SHA:0:8}" JOB_NAME="build-${JOB_SAFE}-${GITHUB_SHA:0:8}"
APP_DIR="${JOB_SAFE}"
kubectl apply -f - <<EOF kubectl apply -f - <<EOF
apiVersion: batch/v1 apiVersion: batch/v1
@@ -63,26 +64,41 @@ spec:
restartPolicy: Never restartPolicy: Never
EOF EOF
echo "Waiting for ${JOB_NAME}..." # Wait for the build pod to be scheduled
echo "=== Waiting for build pod ==="
until POD=$(kubectl get pods -n gitea-runner -l job-name=${JOB_NAME} -o jsonpath='{.items[0].metadata.name}' 2>/dev/null) && [ -n "$POD" ]; do
sleep 1
done
# Stream git-clone initContainer logs (blocks until container exits)
echo "=== Cloning repository ==="
kubectl logs -n gitea-runner ${POD} -c git-clone -f --pod-running-timeout=60s 2>/dev/null || true
# Stream kaniko logs in background while polling for job completion
echo "=== Building image ==="
kubectl logs -n gitea-runner ${POD} -c kaniko -f --pod-running-timeout=120s 2>/dev/null &
LOG_PID=$!
while true; do while true; do
COMPLETE=$(kubectl get job ${JOB_NAME} -n gitea-runner -o jsonpath='{.status.completionTime}' 2>/dev/null) COMPLETE=$(kubectl get job ${JOB_NAME} -n gitea-runner -o jsonpath='{.status.completionTime}' 2>/dev/null)
FAILED=$(kubectl get job ${JOB_NAME} -n gitea-runner -o jsonpath='{.status.failed}' 2>/dev/null) FAILED=$(kubectl get job ${JOB_NAME} -n gitea-runner -o jsonpath='{.status.failed}' 2>/dev/null)
if [ -n "$COMPLETE" ]; then if [ -n "$COMPLETE" ]; then
wait ${LOG_PID} 2>/dev/null || true
echo "Build succeeded" echo "Build succeeded"
kubectl delete job ${JOB_NAME} -n gitea-runner --ignore-not-found kubectl delete job ${JOB_NAME} -n gitea-runner --ignore-not-found
break break
fi fi
if [ "${FAILED:-0}" -ge 1 ]; then if [ "${FAILED:-0}" -ge 1 ]; then
echo "Build failed, logs:" kill ${LOG_PID} 2>/dev/null || true
kubectl logs -n gitea-runner -l job-name=${JOB_NAME} -c kaniko --tail=100 || true echo "Build failed"
kubectl delete job ${JOB_NAME} -n gitea-runner --ignore-not-found kubectl delete job ${JOB_NAME} -n gitea-runner --ignore-not-found
exit 1 exit 1
fi fi
sleep 15 sleep 5
done done
# Update k8s manifests so ArgoCD picks up the new image # Update k8s manifests
APP_DIR=$(echo "${IMAGE}" | tr '_' '-') echo "=== Updating manifests ==="
K8S_DIR=$(mktemp -d) K8S_DIR=$(mktemp -d)
git clone --depth=1 "https://${GIT_USERNAME}:${GITEA_TOKEN}@gitea.saltysoup.dev/tanner/k8s.git" "${K8S_DIR}" git clone --depth=1 "https://${GIT_USERNAME}:${GITEA_TOKEN}@gitea.saltysoup.dev/tanner/k8s.git" "${K8S_DIR}"
sed -i "s|gitea.saltysoup.dev/tanner/${IMAGE}:.*|gitea.saltysoup.dev/tanner/${IMAGE}:${GITHUB_SHA}|g" \ sed -i "s|gitea.saltysoup.dev/tanner/${IMAGE}:.*|gitea.saltysoup.dev/tanner/${IMAGE}:${GITHUB_SHA}|g" \
@@ -93,3 +109,16 @@ git -C "${K8S_DIR}" add "apps/${APP_DIR}/deployment.yaml"
git -C "${K8S_DIR}" commit -m "ci: ${IMAGE}${GITHUB_SHA:0:8}" git -C "${K8S_DIR}" commit -m "ci: ${IMAGE}${GITHUB_SHA:0:8}"
git -C "${K8S_DIR}" push git -C "${K8S_DIR}" push
rm -rf "${K8S_DIR}" rm -rf "${K8S_DIR}"
# Trigger ArgoCD refresh immediately
echo "=== Triggering deploy ==="
kubectl annotate application ${APP_DIR} -n argocd argocd.argoproj.io/refresh=normal --overwrite
# Wait for ArgoCD to apply the new image SHA to the deployment spec
until kubectl get deployment ${APP_DIR} -n hungry -o jsonpath='{.spec.template.spec.containers[0].image}' 2>/dev/null | grep -q "${GITHUB_SHA}"; do
sleep 3
done
# Watch the rollout to completion
echo "=== Watching rollout ==="
kubectl rollout status deployment/${APP_DIR} -n hungry --timeout=5m