From 5dc00c11426a85c2c7f6642135e0b48ee54cae26 Mon Sep 17 00:00:00 2001 From: DevOps Date: Sun, 21 Jun 2026 21:38:09 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20deploy-now=20without=20heredocs=20?= =?UTF-8?q?=E2=80=94=20Gitea=201.26.3=20compat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/deploy-now.yaml | 133 +++++++++++++++---------------- 1 file changed, 63 insertions(+), 70 deletions(-) diff --git a/.gitea/workflows/deploy-now.yaml b/.gitea/workflows/deploy-now.yaml index 04bc614..a9e0fff 100644 --- a/.gitea/workflows/deploy-now.yaml +++ b/.gitea/workflows/deploy-now.yaml @@ -40,7 +40,7 @@ jobs: echo "Deploy version: v${VERSION} git:${GIT_REF}" echo "version=${VERSION}" >> "$GITEA_OUTPUT" - - name: Prepare .env (secrets + host .env → temp file) + - name: Prepare .env run: | set -euo pipefail HOST_OWNER_PASSWORD="" @@ -51,22 +51,20 @@ jobs: echo "ERROR: OWNER_PASSWORD not found in ${DEPLOY_PATH}/.env" exit 1 fi - cat > "${ENV_TMPFILE}" < "${ENV_TMPFILE}" + printf 'POSTGRES_USER=nexus\n' >> "${ENV_TMPFILE}" + printf 'POSTGRES_PASSWORD=%s\n' "${ENV_POSTGRES_PASSWORD}" >> "${ENV_TMPFILE}" + printf 'JWT_KEY=%s\n' "${ENV_JWT_KEY}" >> "${ENV_TMPFILE}" + printf 'JWT_ISSUER=nexus\n' >> "${ENV_TMPFILE}" + printf 'JWT_AUDIENCE=nexus-web\n' >> "${ENV_TMPFILE}" + printf 'OWNER_EMAIL=vmbao62@hotmail.de\n' >> "${ENV_TMPFILE}" + printf 'OWNER_PASSWORD=%s\n' "${HOST_OWNER_PASSWORD}" >> "${ENV_TMPFILE}" + printf 'OWNER_DISPLAY_NAME=\n' >> "${ENV_TMPFILE}" + printf 'OPENCLAW_BASE_URL=http://host.docker.internal:18789\n' >> "${ENV_TMPFILE}" + printf 'OPENCLAW_GATEWAY_TOKEN=%s\n' "${ENV_OPENCLAW_TOKEN}" >> "${ENV_TMPFILE}" + printf 'OPENCLAW_GATEWAY_PASSWORD=\n' >> "${ENV_TMPFILE}" chmod 600 "${ENV_TMPFILE}" - echo "OK .env written" + echo "OK .env written to ${ENV_TMPFILE}" - name: Sync code to host run: | @@ -76,65 +74,65 @@ ENVEOF -v "${DEPLOY_PATH}:/dest" \ alpine:latest \ sh -c "cd /src && find . -mindepth 1 -maxdepth 1 ! -name .git -exec cp -r {} /dest/ \; && DEST_OWNER=\$(stat -c '%u:%g' /dest) && chown -R \"\$DEST_OWNER\" /dest" - echo "OK synced" + echo "OK synced to ${DEPLOY_PATH}" - name: Build and Deploy run: | set -euo pipefail - cat > /tmp/nexus-deploy-script.sh << 'DEPLOYSCRIPT' -#!/bin/sh -set -e -trap 'rm -f /tmp/nexus-deploy-env' EXIT -cat > /tmp/nexus-deploy-env - -docker compose --env-file /tmp/nexus-deploy-env down --remove-orphans 2>/dev/null || true -docker rm -f nexus-postgres-1 nexus-api-1 nexus-web-1 2>/dev/null || true - -PG_VOL=$(docker volume ls -q --filter name=nexus-postgres 2>/dev/null | head -1) -if [ -n "$PG_VOL" ]; then - echo "Checking postgres WAL integrity..." - docker run --rm -v "$PG_VOL:/var/lib/postgresql/data" --entrypoint sh postgres:17-alpine -c "pg_resetwal -f /var/lib/postgresql/data && echo WAL reset OK" 2>&1 || echo "pg_resetwal failed (may be benign)" -else - echo "Postgres volume not found - will be created fresh" -fi - -echo "Deploying all services" -docker compose --env-file /tmp/nexus-deploy-env build -docker compose --env-file /tmp/nexus-deploy-env up -d --force-recreate - -echo "Waiting for services to become healthy (up to 180s)..." -for i in $(seq 1 36); do - STATUS=$(docker compose --env-file /tmp/nexus-deploy-env ps -a 2>/dev/null | tail -n +2) - if echo "$STATUS" | grep -q 'unhealthy'; then - echo " [$i/36] Unhealthy containers - failing fast" - docker compose --env-file /tmp/nexus-deploy-env ps -a - docker compose --env-file /tmp/nexus-deploy-env logs --tail=30 - exit 1 - elif echo "$STATUS" | grep -q 'starting'; then - echo " [$i/36] Still starting..." - sleep 5 - else - echo "All containers healthy" - docker compose --env-file /tmp/nexus-deploy-env ps -a - exit 0 - fi -done -echo "Timeout waiting for services" -docker compose --env-file /tmp/nexus-deploy-env ps -a -docker compose --env-file /tmp/nexus-deploy-env logs --tail=20 -exit 1 -DEPLOYSCRIPT + SCRIPT=/tmp/nexus-deploy-script.sh + printf '#!/bin/sh\n' > "$SCRIPT" + printf 'set -e\n' >> "$SCRIPT" + printf 'trap "rm -f /tmp/nexus-deploy-env" EXIT\n' >> "$SCRIPT" + printf 'cat > /tmp/nexus-deploy-env\n' >> "$SCRIPT" + printf '\n' >> "$SCRIPT" + printf 'docker compose --env-file /tmp/nexus-deploy-env down --remove-orphans 2>/dev/null || true\n' >> "$SCRIPT" + printf 'docker rm -f nexus-postgres-1 nexus-api-1 nexus-web-1 2>/dev/null || true\n' >> "$SCRIPT" + printf '\n' >> "$SCRIPT" + printf 'PG_VOL=$(docker volume ls -q --filter name=nexus-postgres 2>/dev/null | head -1)\n' >> "$SCRIPT" + printf 'if [ -n "$PG_VOL" ]; then\n' >> "$SCRIPT" + printf ' echo "Checking postgres WAL integrity..."\n' >> "$SCRIPT" + printf ' docker run --rm -v "$PG_VOL:/var/lib/postgresql/data" --entrypoint sh postgres:17-alpine -c "pg_resetwal -f /var/lib/postgresql/data && echo WAL reset OK" 2>&1 || echo "pg_resetwal failed (may be benign)"\n' >> "$SCRIPT" + printf 'else\n' >> "$SCRIPT" + printf ' echo "Postgres volume not found - will be created fresh"\n' >> "$SCRIPT" + printf 'fi\n' >> "$SCRIPT" + printf '\n' >> "$SCRIPT" + printf 'echo "Deploying all services"\n' >> "$SCRIPT" + printf 'docker compose --env-file /tmp/nexus-deploy-env build\n' >> "$SCRIPT" + printf 'docker compose --env-file /tmp/nexus-deploy-env up -d --force-recreate\n' >> "$SCRIPT" + printf '\n' >> "$SCRIPT" + printf 'echo "Waiting for services to become healthy (up to 180s)..."\n' >> "$SCRIPT" + printf 'for i in $(seq 1 36); do\n' >> "$SCRIPT" + printf ' STATUS=$(docker compose --env-file /tmp/nexus-deploy-env ps -a 2>/dev/null | tail -n +2)\n' >> "$SCRIPT" + printf ' if echo "$STATUS" | grep -q unhealthy; then\n' >> "$SCRIPT" + printf ' echo " [$i/36] Unhealthy containers - failing fast"\n' >> "$SCRIPT" + printf ' docker compose --env-file /tmp/nexus-deploy-env ps -a\n' >> "$SCRIPT" + printf ' docker compose --env-file /tmp/nexus-deploy-env logs --tail=30\n' >> "$SCRIPT" + printf ' exit 1\n' >> "$SCRIPT" + printf ' elif echo "$STATUS" | grep -q starting; then\n' >> "$SCRIPT" + printf ' echo " [$i/36] Still starting..."\n' >> "$SCRIPT" + printf ' sleep 5\n' >> "$SCRIPT" + printf ' else\n' >> "$SCRIPT" + printf ' echo "All containers healthy"\n' >> "$SCRIPT" + printf ' docker compose --env-file /tmp/nexus-deploy-env ps -a\n' >> "$SCRIPT" + printf ' exit 0\n' >> "$SCRIPT" + printf ' fi\n' >> "$SCRIPT" + printf 'done\n' >> "$SCRIPT" + printf 'echo "Timeout waiting for services"\n' >> "$SCRIPT" + printf 'docker compose --env-file /tmp/nexus-deploy-env ps -a\n' >> "$SCRIPT" + printf 'docker compose --env-file /tmp/nexus-deploy-env logs --tail=20\n' >> "$SCRIPT" + printf 'exit 1\n' >> "$SCRIPT" + chmod +x "$SCRIPT" docker run --rm \ -v "${DEPLOY_PATH}:/workspace/nexus" \ -v /var/run/docker.sock:/var/run/docker.sock \ - -v /tmp/nexus-deploy-script.sh:/deploy.sh:ro \ + -v "${SCRIPT}:/deploy.sh:ro" \ -w /workspace/nexus \ -i \ docker:cli \ sh /deploy.sh < "${ENV_TMPFILE}" - - rm -f /tmp/nexus-deploy-script.sh + + rm -f "$SCRIPT" echo "OK deployed" - name: Clean up temp .env @@ -148,9 +146,7 @@ DEPLOYSCRIPT - name: Health Check run: | echo "Health check..." - RETRY=0 - MAX=6 - WAIT=1 + RETRY=0; MAX=6; WAIT=1 while [ $RETRY -lt $MAX ]; do RETRY=$((RETRY + 1)) if curl -sf --max-time 10 https://nexus.noveria.net/health; then @@ -168,9 +164,7 @@ DEPLOYSCRIPT - name: Smoke Test run: | - PASS=0 - FAIL=0 - BASE="https://nexus.noveria.net" + PASS=0; FAIL=0; BASE="https://nexus.noveria.net" check() { local path="$1" label="$2" expected="${3:-200}" local code @@ -187,7 +181,6 @@ DEPLOYSCRIPT check "/dashboard" "Dashboard" 200 check "/health" "Health API" 200 check "/api/v1/operations/snapshot" "Operations API (auth)" 401 - echo "" echo "Results: $PASS passed, $FAIL failed" if [ "$FAIL" -gt 0 ]; then echo "ERROR Smoke test failed"