201 lines
5.7 KiB
Bash
Executable File
201 lines
5.7 KiB
Bash
Executable File
#!/bin/bash
|
|
# push-release.sh - Push an existing release to Gitea
|
|
# Usage: ./push-release.sh --version v1.0.0 --gitea-token TOKEN
|
|
|
|
set -e
|
|
|
|
# Configuration
|
|
BINARY_NAME="aideris-cli"
|
|
GITEA_URL="https://gitea.clickthings.net"
|
|
REPO_OWNER="whuang"
|
|
REPO_NAME="aideris-cli-dist"
|
|
|
|
# Parse arguments
|
|
VERSION=""
|
|
GITEA_TOKEN=""
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--version)
|
|
VERSION="$2"
|
|
shift 2
|
|
;;
|
|
--gitea-token)
|
|
GITEA_TOKEN="$2"
|
|
shift 2
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ -z "$VERSION" ]; then
|
|
echo "Error: --version is required"
|
|
echo "Usage: ./push-release.sh --version v1.0.0 --gitea-token TOKEN"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$GITEA_TOKEN" ]; then
|
|
echo "Error: --gitea-token is required"
|
|
echo "Usage: ./push-release.sh --version v1.0.0 --gitea-token TOKEN"
|
|
exit 1
|
|
fi
|
|
|
|
BUILD_DIR="dist/${VERSION}"
|
|
|
|
if [ ! -d "$BUILD_DIR" ]; then
|
|
echo "Error: Build directory not found: $BUILD_DIR"
|
|
echo "Run the build first to create binaries"
|
|
exit 1
|
|
fi
|
|
|
|
echo "========================================"
|
|
echo " Aideris CLI Release Push"
|
|
echo "========================================"
|
|
echo ""
|
|
echo "Version: $VERSION"
|
|
echo "Build dir: $BUILD_DIR"
|
|
echo ""
|
|
|
|
# Check if release notes exist
|
|
RELEASE_NOTES="${BUILD_DIR}/RELEASE_NOTES.md"
|
|
if [ ! -f "$RELEASE_NOTES" ]; then
|
|
echo "Warning: Release notes not found at $RELEASE_NOTES"
|
|
echo "Creating default release notes..."
|
|
cat > "$RELEASE_NOTES" << EOF
|
|
# Aideris CLI ${VERSION}
|
|
|
|
## Installation
|
|
|
|
### Quick Install
|
|
\`\`\`bash
|
|
curl -fsSL https://gitea.clickthings.net/${REPO_OWNER}/${REPO_NAME}/raw/branch/main/install.sh | sh
|
|
\`\`\`
|
|
|
|
### Manual Download
|
|
Download the binary for your platform from the Assets below.
|
|
EOF
|
|
fi
|
|
|
|
# Check if checksums exist
|
|
CHECKSUMS_FILE="${BUILD_DIR}/checksums.txt"
|
|
if [ ! -f "$CHECKSUMS_FILE" ]; then
|
|
echo "Generating checksums..."
|
|
cd "$BUILD_DIR"
|
|
sha256sum ${BINARY_NAME}-* > checksums.txt 2>/dev/null || true
|
|
cd - > /dev/null
|
|
fi
|
|
|
|
echo "Pushing to Gitea..."
|
|
|
|
# Function to make API calls with error handling
|
|
gitea_api() {
|
|
local method=$1
|
|
local endpoint=$2
|
|
local data=$3
|
|
|
|
if [ -z "$data" ]; then
|
|
curl -fsSL -X "$method" \
|
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
"${GITEA_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}${endpoint}" 2>&1
|
|
else
|
|
curl -fsSL -X "$method" \
|
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$data" \
|
|
"${GITEA_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}${endpoint}" 2>&1
|
|
fi
|
|
}
|
|
|
|
# Check if release already exists
|
|
echo "Checking for existing release..."
|
|
EXISTING_RELEASE=$(gitea_api "GET" "/releases/tags/${VERSION}" 2>/dev/null || echo "{}")
|
|
RELEASE_ID=$(echo "$EXISTING_RELEASE" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2)
|
|
|
|
if [ -n "$RELEASE_ID" ]; then
|
|
echo " ✓ Found existing release: ID $RELEASE_ID"
|
|
else
|
|
echo " Creating new release..."
|
|
|
|
# Escape release notes for JSON
|
|
ESCAPED_BODY=$(cat "$RELEASE_NOTES" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read())[1:-1])' 2>/dev/null || cat "$RELEASE_NOTES" | sed 's/"/\\"/g' | tr '\n' ' ')
|
|
|
|
RELEASE_PAYLOAD=$(cat << EOF
|
|
{
|
|
"tag_name": "${VERSION}",
|
|
"name": "${VERSION}",
|
|
"body": "${ESCAPED_BODY}",
|
|
"draft": false,
|
|
"prerelease": false
|
|
}
|
|
EOF
|
|
)
|
|
|
|
CREATE_RESPONSE=$(gitea_api "POST" "/releases" "$RELEASE_PAYLOAD" 2>&1 || true)
|
|
RELEASE_ID=$(echo "$CREATE_RESPONSE" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2)
|
|
|
|
if [ -n "$RELEASE_ID" ]; then
|
|
echo " ✓ Release created: ID $RELEASE_ID"
|
|
else
|
|
echo " ✗ Failed to create release"
|
|
echo "Response: $CREATE_RESPONSE"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Get list of existing assets
|
|
echo ""
|
|
echo "Fetching existing assets..."
|
|
EXISTING_ASSETS=$(gitea_api "GET" "/releases/${RELEASE_ID}/assets" 2>/dev/null || echo "[]")
|
|
|
|
# Upload assets
|
|
echo ""
|
|
echo "Uploading assets..."
|
|
|
|
upload_count=0
|
|
skip_count=0
|
|
|
|
for asset in ${BUILD_DIR}/${BINARY_NAME}-* ${BUILD_DIR}/checksums.txt; do
|
|
if [ -f "$asset" ]; then
|
|
FILENAME=$(basename "$asset")
|
|
|
|
# Check if asset already exists
|
|
ASSET_EXISTS=$(echo "$EXISTING_ASSETS" | grep -o "\"name\":\"${FILENAME}\"" | head -1 || echo "")
|
|
|
|
if [ -n "$ASSET_EXISTS" ]; then
|
|
echo " ⊘ Skipping (exists): $FILENAME"
|
|
skip_count=$((skip_count + 1))
|
|
else
|
|
echo " ↑ Uploading: $FILENAME..."
|
|
|
|
UPLOAD_RESPONSE=$(curl -fsSL -X POST \
|
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
|
-H "Content-Type: application/octet-stream" \
|
|
--data-binary @"$asset" \
|
|
"${GITEA_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/releases/${RELEASE_ID}/assets?name=${FILENAME}" 2>&1 || true)
|
|
|
|
UPLOADED_ID=$(echo "$UPLOAD_RESPONSE" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2)
|
|
|
|
if [ -n "$UPLOADED_ID" ]; then
|
|
echo " ✓ Uploaded: $FILENAME"
|
|
upload_count=$((upload_count + 1))
|
|
else
|
|
echo " ✗ Failed to upload: $FILENAME"
|
|
echo " Response: $UPLOAD_RESPONSE"
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo "========================================"
|
|
echo " Push Complete"
|
|
echo "========================================"
|
|
echo ""
|
|
echo "Uploaded: $upload_count asset(s)"
|
|
echo "Skipped: $skip_count existing asset(s)"
|
|
echo ""
|
|
echo "Release URL: ${GITEA_URL}/${REPO_OWNER}/${REPO_NAME}/releases/tag/${VERSION}" |