From d97955394fdc8a6cbfe33bf06aa1424f5ce43d8e Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Mon, 25 May 2026 19:49:04 -0500 Subject: [PATCH] feat(ci): auto-update updates.xml on production deploy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After a successful production deployment, the deploy workflow now automatically updates updates.xml on main with the new version, release URL, and docker image tag for the stable channel. Dev deployments skip this step — only production releases update the stable channel. Co-Authored-By: Claude Opus 4.6 (1M context) --- .mokogitea/workflows/deploy-mokogitea.yml | 72 +++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/.mokogitea/workflows/deploy-mokogitea.yml b/.mokogitea/workflows/deploy-mokogitea.yml index 188266406b..2a6fcfacd3 100644 --- a/.mokogitea/workflows/deploy-mokogitea.yml +++ b/.mokogitea/workflows/deploy-mokogitea.yml @@ -140,6 +140,78 @@ jobs: exit 1 " + - name: Update updates.xml + if: success() + env: + GITEA_TOKEN: ${{ secrets.GA_TOKEN }} + TAG: ${{ steps.config.outputs.tag }} + INSTANCE_URL: ${{ steps.config.outputs.instance_url }} + DEPLOY_ENV: ${{ github.event.inputs.environment }} + run: | + # Only update updates.xml for production stable releases + if [ "$DEPLOY_ENV" != "production" ]; then + echo "Skipping updates.xml — dev deployments don't update stable channel" + exit 0 + fi + + # Extract moko version from tag (e.g. v1.26.1-moko.05.01.01 -> 05.01.01) + MOKO_VER=$(echo "$TAG" | sed -n 's/.*-moko\.\(.*\)/\1/p') + if [ -z "$MOKO_VER" ]; then + echo "Could not extract moko version from tag: $TAG" + exit 0 + fi + + RELEASE_URL="https://${REGISTRY}/MokoConsulting/MokoGitea/releases/tag/${TAG}" + DOCKER_IMG="${REGISTRY}/${IMAGE}:${TAG}" + + python3 << PYEOF + import json, os, re, base64, urllib.request + + token = os.environ["GITEA_TOKEN"] + registry = os.environ["REGISTRY"] + tag = os.environ["TAG"] + moko_ver = os.environ["MOKO_VER"] + release_url = os.environ["RELEASE_URL"] + docker_img = os.environ["DOCKER_IMG"] + api = f"https://{registry}/api/v1/repos/MokoConsulting/MokoGitea" + + # Fetch current updates.xml + req = urllib.request.Request(f"{api}/contents/updates.xml?ref=main", + headers={"Authorization": f"token {token}"}) + with urllib.request.urlopen(req) as resp: + data = json.loads(resp.read()) + sha = data["sha"] + content = base64.b64decode(data["content"]).decode("utf-8") + + # Update stable channel version, infourl, and docker tag + content = re.sub( + r"(stable[\s\S]*?)[^<]*()", + rf"\g<1>{moko_ver}\2", content) + content = re.sub( + r"(stable[\s\S]*?]*>)[^<]*()", + rf"\g<1>{release_url}\2", content) + content = re.sub( + r"(stable[\s\S]*?]*>)[^<]*()", + rf"\g<1>{docker_img}\2", content) + + # Also update VERSION comment at top + content = re.sub(r"VERSION: [^\n]*", f"VERSION: {moko_ver}", content) + + # Push updated file + encoded = base64.b64encode(content.encode()).decode() + payload = json.dumps({ + "message": f"chore(ci): update updates.xml to {moko_ver}", + "content": encoded, + "sha": sha, + "branch": "main", + }).encode() + req = urllib.request.Request(f"{api}/contents/updates.xml", + data=payload, method="PUT", + headers={"Authorization": f"token {token}", "Content-Type": "application/json"}) + with urllib.request.urlopen(req) as resp: + print(f"updates.xml updated to {moko_ver}") + PYEOF + - name: Disable maintenance mode if: always() env: -- 2.52.0