feat: stream build logs, trigger argocd refresh, watch rollout
This commit is contained in:
@@ -4,6 +4,7 @@ set -e
|
||||
IMAGE=${IMAGE:-$REPO}
|
||||
JOB_SAFE=$(echo "${IMAGE}" | tr '_' '-')
|
||||
JOB_NAME="build-${JOB_SAFE}-${GITHUB_SHA:0:8}"
|
||||
APP_DIR="${JOB_SAFE}"
|
||||
|
||||
kubectl apply -f - <<EOF
|
||||
apiVersion: batch/v1
|
||||
@@ -63,26 +64,41 @@ spec:
|
||||
restartPolicy: Never
|
||||
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
|
||||
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)
|
||||
if [ -n "$COMPLETE" ]; then
|
||||
wait ${LOG_PID} 2>/dev/null || true
|
||||
echo "Build succeeded"
|
||||
kubectl delete job ${JOB_NAME} -n gitea-runner --ignore-not-found
|
||||
break
|
||||
fi
|
||||
if [ "${FAILED:-0}" -ge 1 ]; then
|
||||
echo "Build failed, logs:"
|
||||
kubectl logs -n gitea-runner -l job-name=${JOB_NAME} -c kaniko --tail=100 || true
|
||||
kill ${LOG_PID} 2>/dev/null || true
|
||||
echo "Build failed"
|
||||
kubectl delete job ${JOB_NAME} -n gitea-runner --ignore-not-found
|
||||
exit 1
|
||||
fi
|
||||
sleep 15
|
||||
sleep 5
|
||||
done
|
||||
|
||||
# Update k8s manifests so ArgoCD picks up the new image
|
||||
APP_DIR=$(echo "${IMAGE}" | tr '_' '-')
|
||||
# Update k8s manifests
|
||||
echo "=== Updating manifests ==="
|
||||
K8S_DIR=$(mktemp -d)
|
||||
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" \
|
||||
@@ -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}" push
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user