name: Release on: push: tags: - "v*" jobs: build: runs-on: ubuntu-latest if: startsWith(gitea.ref, 'refs/tags/v') outputs: version: ${{ steps.version.outputs.version }} tag: ${{ steps.version.outputs.tag }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: "22" cache: "npm" - name: Install dependencies run: npm ci - name: Build run: npm run build - name: Get version id: version env: GITEA_REF: ${{ gitea.ref }} run: | echo "version=${GITEA_REF#refs/tags/v}" >> $GITHUB_OUTPUT echo "tag=${GITEA_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Upload build artifacts uses: actions/upload-artifact@v3 with: name: build-output path: .scaffold/build/ retention-days: 1 update-rolling-release: runs-on: ubuntu-latest needs: build steps: - name: Download build artifacts uses: actions/download-artifact@v3 with: name: build-output path: .scaffold/build/ - name: Upsert rolling 'release' tag with latest update.json env: GITEA_TOKEN: ${{ gitea.token }} API_URL: ${{ gitea.server_url }}/api/v1 REPO: ${{ gitea.repository }} VERSION: ${{ needs.build.outputs.version }} run: | set -euo pipefail TAG="release" echo "=== Configuration ===" echo "API_URL: ${API_URL}" echo "REPO: ${REPO}" echo "VERSION: ${VERSION}" # Check if the rolling release already exists EXISTING=$(curl -s -o /dev/null -w "%{http_code}" \ "${API_URL}/repos/${REPO}/releases/tags/${TAG}" \ -H "Authorization: token ${GITEA_TOKEN}") echo "Existing release check: HTTP ${EXISTING}" if [ "${EXISTING}" = "200" ]; then # Fetch the release ID RELEASE_ID=$(curl -s "${API_URL}/repos/${REPO}/releases/tags/${TAG}" \ -H "Authorization: token ${GITEA_TOKEN}" \ | jq -r '.id') echo "Found existing 'release' release (ID: ${RELEASE_ID}). Replacing assets..." # Delete all existing assets so we can upload fresh ones ASSETS=$(curl -s "${API_URL}/repos/${REPO}/releases/${RELEASE_ID}/assets" \ -H "Authorization: token ${GITEA_TOKEN}") echo "${ASSETS}" | jq -r '.[].id' | while read -r ASSET_ID; do echo "Deleting asset ${ASSET_ID}..." curl -s -X DELETE "${API_URL}/repos/${REPO}/releases/${RELEASE_ID}/assets/${ASSET_ID}" \ -H "Authorization: token ${GITEA_TOKEN}" done # Update the release body to reflect the current version curl -s -X PATCH "${API_URL}/repos/${REPO}/releases/${RELEASE_ID}" \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"body\": \"Rolling release — always points to the latest update manifest (currently v${VERSION}). Do not delete.\"}" else # Create the rolling release for the first time echo "Creating new 'release' release..." # Ensure the tag exists (Gitea requires the tag to exist before creating a release for it) curl -s -X POST "${API_URL}/repos/${REPO}/tags" \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"tag_name\": \"${TAG}\", \"target\": \"main\"}" || true RELEASE=$(curl -s -X POST "${API_URL}/repos/${REPO}/releases" \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d "{ \"tag_name\": \"${TAG}\", \"name\": \"Update Manifest (rolling)\", \"body\": \"Rolling release — always points to the latest update manifest (currently v${VERSION}). Do not delete.\", \"draft\": false, \"prerelease\": false }") RELEASE_ID=$(echo "${RELEASE}" | jq -r '.id') if [ -z "${RELEASE_ID}" ] || [ "${RELEASE_ID}" = "null" ]; then echo "Failed to create rolling release. Response: ${RELEASE}" exit 1 fi echo "Created rolling release ID: ${RELEASE_ID}" fi # Upload update.json and update-beta.json to the rolling release for JSON in .scaffold/build/update.json .scaffold/build/update-beta.json; do [ -f "${JSON}" ] || continue FILENAME=$(basename "${JSON}") echo "Uploading ${FILENAME} to rolling release..." curl -s -X POST "${API_URL}/repos/${REPO}/releases/${RELEASE_ID}/assets?name=${FILENAME}" \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ --data-binary "@${JSON}" done echo "Rolling 'release' release updated to v${VERSION}." publish-release: runs-on: ubuntu-latest needs: [build, update-rolling-release] steps: - name: Download build artifacts uses: actions/download-artifact@v3 with: name: build-output path: .scaffold/build/ - name: Create versioned release and upload assets env: GITEA_TOKEN: ${{ gitea.token }} API_URL: ${{ gitea.server_url }}/api/v1 REPO: ${{ gitea.repository }} VERSION: ${{ needs.build.outputs.version }} TAG: ${{ needs.build.outputs.tag }} run: | set -euo pipefail echo "=== Configuration ===" echo "API_URL: ${API_URL}" echo "REPO: ${REPO}" echo "VERSION: ${VERSION}" echo "TAG: ${TAG}" # Create the versioned release RELEASE=$(curl -s -X POST "${API_URL}/repos/${REPO}/releases" \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d "{ \"tag_name\": \"${TAG}\", \"name\": \"${TAG}\", \"body\": \"Release ${TAG}\", \"draft\": false, \"prerelease\": false }") RELEASE_ID=$(echo "${RELEASE}" | jq -r '.id') if [ -z "${RELEASE_ID}" ] || [ "${RELEASE_ID}" = "null" ]; then echo "Failed to create release. Response: ${RELEASE}" exit 1 fi echo "Created release ID: ${RELEASE_ID}" # Upload XPI for XPI in .scaffold/build/*.xpi; do [ -f "${XPI}" ] || continue FILENAME=$(basename "${XPI}") echo "Uploading ${FILENAME}..." curl -s -X POST "${API_URL}/repos/${REPO}/releases/${RELEASE_ID}/assets?name=${FILENAME}" \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/octet-stream" \ --data-binary "@${XPI}" done # Upload update manifests for JSON in .scaffold/build/update.json .scaffold/build/update-beta.json; do [ -f "${JSON}" ] || continue FILENAME=$(basename "${JSON}") echo "Uploading ${FILENAME}..." curl -s -X POST "${API_URL}/repos/${REPO}/releases/${RELEASE_ID}/assets?name=${FILENAME}" \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ --data-binary "@${JSON}" done echo "Versioned release ${TAG} published."