From f06e74f254b95233a0b169b267c6030ba2db0e72 Mon Sep 17 00:00:00 2001 From: Samuel K Date: Mon, 18 May 2026 06:52:42 -0500 Subject: [PATCH 1/2] fix(ci): remove Netlify prod deploy that overwrites devsy.sh The deploy-update-metadata job was deploying only desktop update metadata files as the entire production site, wiping the main devsy.sh website content. Remove the job and add a restore workflow to roll back to the last known good deploy. --- .github/workflows/release.yml | 26 +--------- .github/workflows/restore-netlify.yml | 70 +++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 25 deletions(-) create mode 100644 .github/workflows/restore-netlify.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d8a3a866e..15fabde4c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -264,33 +264,9 @@ jobs: files: | ./Devsy.flatpak - deploy-update-metadata: - name: Deploy Update Metadata to Netlify - needs: [build-desktop] - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v6 - - - uses: actions/download-artifact@v8 - with: - pattern: update-metadata-* - merge-multiple: true - path: sites/dl-devsy-sh/public/desktop - - - name: deploy metadata - working-directory: sites/dl-devsy-sh - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} - run: | - npm install -g netlify-cli - netlify deploy --prod --no-build \ - --dir=public \ - --site="$NETLIFY_SITE_ID" - prerelease: name: Publish Prerelease - needs: [build-desktop, build-flatpak, deploy-update-metadata] + needs: [build-desktop, build-flatpak] permissions: contents: write if: github.event.release.prerelease diff --git a/.github/workflows/restore-netlify.yml b/.github/workflows/restore-netlify.yml new file mode 100644 index 000000000..faf8d6840 --- /dev/null +++ b/.github/workflows/restore-netlify.yml @@ -0,0 +1,70 @@ +name: Restore Netlify Site + +on: + workflow_dispatch: + inputs: + deploy_id: + description: "Specific deploy ID to restore (leave empty to auto-detect last good deploy)" + required: false + type: string + +jobs: + restore: + name: Restore Netlify Production Deploy + runs-on: ubuntu-latest + steps: + - name: Install Netlify CLI + run: npm install -g netlify-cli + + - name: Find and restore deploy + env: + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + DEPLOY_ID_INPUT: ${{ inputs.deploy_id }} + run: | + if [ -n "$DEPLOY_ID_INPUT" ]; then + DEPLOY_ID="$DEPLOY_ID_INPUT" + echo "Restoring specific deploy: $DEPLOY_ID" + else + echo "Finding last non-CLI deploy (from Netlify build system)..." + DEPLOY_ID=$(curl -s -H "Authorization: Bearer $NETLIFY_AUTH_TOKEN" \ + "https://api.netlify.com/api/v1/sites/$NETLIFY_SITE_ID/deploys?per_page=20" | \ + jq -r '[.[] | select(.deploy_source != "cli" and .state == "ready")] | .[0].id') + + if [ "$DEPLOY_ID" = "null" ] || [ -z "$DEPLOY_ID" ]; then + echo "ERROR: Could not find a non-CLI deploy to restore" + echo "Available deploys:" + curl -s -H "Authorization: Bearer $NETLIFY_AUTH_TOKEN" \ + "https://api.netlify.com/api/v1/sites/$NETLIFY_SITE_ID/deploys?per_page=10" | \ + jq '.[] | {id, created_at, deploy_source, state, title}' + exit 1 + fi + echo "Found deploy to restore: $DEPLOY_ID" + fi + + echo "Restoring deploy $DEPLOY_ID to production..." + RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \ + -H "Authorization: Bearer $NETLIFY_AUTH_TOKEN" \ + "https://api.netlify.com/api/v1/deploys/$DEPLOY_ID/restore") + + HTTP_CODE=$(echo "$RESPONSE" | tail -1) + BODY=$(echo "$RESPONSE" | sed '$d') + + if [ "$HTTP_CODE" != "200" ] && [ "$HTTP_CODE" != "201" ]; then + echo "ERROR: Netlify restore failed (HTTP $HTTP_CODE)" + echo "$BODY" + exit 1 + fi + echo "Restore API returned HTTP $HTTP_CODE — success" + + echo "" + echo "Verifying..." + sleep 10 + + STATUS=$(curl -s -o /dev/null -w "%{http_code}" "https://devsy.sh") + echo "devsy.sh HTTP status: $STATUS" + if [ "$STATUS" = "200" ]; then + echo "SUCCESS: devsy.sh is back online" + else + echo "WARNING: devsy.sh returned $STATUS — may need a few more seconds to propagate" + fi From 4597fcb1bcb59916431def4113f23e8490ab9f11 Mon Sep 17 00:00:00 2001 From: Samuel K Date: Mon, 18 May 2026 07:00:40 -0500 Subject: [PATCH 2/2] fix(ci): correct Netlify restore endpoint and remove unused CLI install Use the correct /sites/{site_id}/deploys/{deploy_id}/restore endpoint instead of /deploys/{deploy_id}/restore. Remove unused netlify-cli install step that added ~20s without being used. --- .github/workflows/restore-netlify.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/restore-netlify.yml b/.github/workflows/restore-netlify.yml index faf8d6840..0df800e69 100644 --- a/.github/workflows/restore-netlify.yml +++ b/.github/workflows/restore-netlify.yml @@ -13,9 +13,6 @@ jobs: name: Restore Netlify Production Deploy runs-on: ubuntu-latest steps: - - name: Install Netlify CLI - run: npm install -g netlify-cli - - name: Find and restore deploy env: NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} @@ -45,7 +42,7 @@ jobs: echo "Restoring deploy $DEPLOY_ID to production..." RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \ -H "Authorization: Bearer $NETLIFY_AUTH_TOKEN" \ - "https://api.netlify.com/api/v1/deploys/$DEPLOY_ID/restore") + "https://api.netlify.com/api/v1/sites/$NETLIFY_SITE_ID/deploys/$DEPLOY_ID/restore") HTTP_CODE=$(echo "$RESPONSE" | tail -1) BODY=$(echo "$RESPONSE" | sed '$d')