#!/bin/bash set -euo pipefail GITEA_URL="$1" OWNER="$2" REPO="$3" TAG="$4" VERSION="$5" TOKEN="$6" CHANNEL="${7:-stable}" # "stable" or "edge" API_URL="${GITEA_URL}/api/v1" PACKAGES_DIR="dist/packages" BINARIES_DIR="dist/bin" SKIP_RELEASE_CREATION=false echo "Release configuration:" echo " Repository: ${OWNER}/${REPO}" echo " Tag: ${TAG}" echo " Version: ${VERSION}" echo "" # Check if release already exists echo "Checking if release ${TAG} exists..." RELEASE_ID=$(curl -s -H "Authorization: token ${TOKEN}" \ "${API_URL}/repos/${OWNER}/${REPO}/releases/tags/${TAG}" \ | jq -r '.id // empty') if [ -n "$RELEASE_ID" ]; then echo "Release ${TAG} exists (ID: ${RELEASE_ID})" echo "Updating existing release assets..." # Get existing assets EXISTING_ASSETS=$(curl -s -H "Authorization: token ${TOKEN}" \ "${API_URL}/repos/${OWNER}/${REPO}/releases/${RELEASE_ID}/assets" \ | jq -r '.[].id') # Delete old assets for ASSET_ID in $EXISTING_ASSETS; do ASSET_NAME=$(curl -s -H "Authorization: token ${TOKEN}" \ "${API_URL}/repos/${OWNER}/${REPO}/releases/${RELEASE_ID}/assets/${ASSET_ID}" \ | jq -r '.name') if [[ "$ASSET_NAME" == *.deb ]] || [[ "$ASSET_NAME" == wild-central-* ]] || [[ "$ASSET_NAME" == "SHA256SUMS" ]]; then echo " Deleting old asset: ${ASSET_NAME}" curl -s -X DELETE -H "Authorization: token ${TOKEN}" \ "${API_URL}/repos/${OWNER}/${REPO}/releases/${RELEASE_ID}/assets/${ASSET_ID}" fi done echo "Cleaned up old package assets" SKIP_RELEASE_CREATION=true fi # Extract changelog section for this version CHANGELOG_SECTION="" if [ -f "../CHANGELOG.md" ]; then CHANGELOG_SECTION=$(awk "/^## \[${VERSION}\]/{found=1; next} /^## \[/{if(found) exit} found{print}" ../CHANGELOG.md | sed '/^$/d') fi INSTALL_DOCS="### Installation #### Full Installation (.deb package) Download the appropriate .deb package for your architecture: - **arm64**: \`wild-central_${VERSION}_arm64.deb\` — Raspberry Pi 4/5, ARM servers - **amd64**: \`wild-central_${VERSION}_amd64.deb\` — x86_64 systems \`\`\`bash wget ${GITEA_URL}/${OWNER}/${REPO}/releases/download/v${VERSION}/wild-central_${VERSION}_amd64.deb sudo dpkg -i wild-central_${VERSION}_amd64.deb sudo apt-get install -f sudo systemctl enable --now wild-central \`\`\` #### Standalone Binary - \`wild-central-{arch}\` — Daemon binary only (Docker/K8s) #### Verification \`\`\`bash wget ${GITEA_URL}/${OWNER}/${REPO}/releases/download/v${VERSION}/SHA256SUMS sha256sum -c SHA256SUMS \`\`\`" if [ -n "$CHANGELOG_SECTION" ]; then BODY="${CHANGELOG_SECTION} --- ${INSTALL_DOCS}" else BODY="${INSTALL_DOCS}" fi # Set release name and prerelease flag based on channel if [ "$CHANNEL" = "edge" ]; then RELEASE_NAME="Wild Central (edge) — ${VERSION}" IS_PRERELEASE=true else RELEASE_NAME="Wild Central ${VERSION}" IS_PRERELEASE=false fi # Create new release if it doesn't exist if [ "$SKIP_RELEASE_CREATION" != "true" ]; then echo "Creating new release ${TAG}..." RELEASE_DATA=$(jq -n \ --arg tag "${TAG}" \ --arg name "${RELEASE_NAME}" \ --arg body "${BODY}" \ --argjson prerelease "${IS_PRERELEASE}" \ '{"tag_name": $tag, "name": $name, "body": $body, "draft": false, "prerelease": $prerelease}') RELEASE_RESPONSE=$(curl -s -X POST -H "Authorization: token ${TOKEN}" \ -H "Content-Type: application/json" \ -d "${RELEASE_DATA}" \ "${API_URL}/repos/${OWNER}/${REPO}/releases") RELEASE_ID=$(echo "${RELEASE_RESPONSE}" | jq -r '.id') if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "null" ]; then echo "Failed to create release" echo "${RELEASE_RESPONSE}" | jq . exit 1 fi echo "Created release ${TAG} (ID: ${RELEASE_ID})" fi # Generate checksums echo "" echo "Generating checksums..." cd dist sha256sum packages/*.deb bin/wild-central-* > SHA256SUMS echo "Created SHA256SUMS" cd .. # Upload artifacts echo "" echo "Uploading release artifacts..." upload_file() { local FILE="$1" local FILENAME=$(basename "$FILE") echo " Uploading ${FILENAME}..." UPLOAD_RESPONSE=$(curl -s -X POST \ -H "Authorization: token ${TOKEN}" \ -F "attachment=@${FILE}" \ "${API_URL}/repos/${OWNER}/${REPO}/releases/${RELEASE_ID}/assets?name=${FILENAME}") ASSET_ID=$(echo "${UPLOAD_RESPONSE}" | jq -r '.id') if [ -z "$ASSET_ID" ] || [ "$ASSET_ID" = "null" ]; then echo " Failed to upload ${FILENAME}" echo "${UPLOAD_RESPONSE}" | jq . return 1 else echo " Uploaded ${FILENAME}" return 0 fi } # Upload .deb packages for DEB in ${PACKAGES_DIR}/wild-central_${VERSION}_*.deb; do if [ ! -f "$DEB" ]; then echo "No .deb files found for version ${VERSION} in ${PACKAGES_DIR}" exit 1 fi upload_file "$DEB" done # Upload standalone daemon binaries for BINARY in ${BINARIES_DIR}/wild-central-*; do if [ -f "$BINARY" ]; then upload_file "$BINARY" fi done # Upload checksums upload_file "dist/SHA256SUMS" echo "" echo "Release complete!" echo "View at: ${GITEA_URL}/${OWNER}/${REPO}/releases/tag/${TAG}"