feat: stream build logs, trigger argocd refresh, watch rollout
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user