190 lines
5.2 KiB
Bash
Executable File
190 lines
5.2 KiB
Bash
Executable File
#!/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}"
|