#!/usr/bin/env bash set -e VERSION="$1" if [ -z "$VERSION" ]; then echo "Usage: ./release.sh " exit 1 fi if ! [[ "$VERSION" =~ ^[0-9]+.[0-9]+.[0-9]+$ ]]; then echo "Version must be SemVer: X.Y.Z" exit 1 fi TAG="v$VERSION" echo "=== Release $TAG ===" sedi() { if sed --version >/dev/null 2>&1; then sed -i "$@" else sed -i '' "$@" fi } BRANCH=$(git rev-parse --abbrev-ref HEAD) [ "$BRANCH" = "main" ] || { echo "Not on main"; exit 1; } git diff --quiet || { echo "Working tree not clean"; exit 1; } git fetch origin LOCAL=$(git rev-parse main) REMOTE=$(git rev-parse origin/main) [ "$LOCAL" = "$REMOTE" ] || { echo "main not in sync"; exit 1; } git rev-parse "$TAG" >/dev/null 2>&1 && { echo "Tag exists locally"; exit 1; } git ls-remote --tags origin | grep -q "refs/tags/$TAG" && { echo "Tag exists remote"; exit 1; } [ -f versions.env ] || { echo "versions.env missing"; exit 1; } echo "Updating versions.env" if grep -q "^APP_VERSION=" versions.env; then sedi "s/^APP_VERSION=.*/APP_VERSION=$VERSION/" versions.env else echo "APP_VERSION=$VERSION" >> versions.env fi if [ -f CHANGELOG.md ]; then echo "Updating CHANGELOG.md" LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || true) if [ -n "$LAST_TAG" ]; then git log $LAST_TAG..HEAD --pretty=format:"- %s" > NOTES.tmp else git log --pretty=format:"- %s" > NOTES.tmp fi DATE=$(date +%Y-%m-%d) { echo "## $VERSION - $DATE" cat NOTES.tmp echo cat CHANGELOG.md } > CHANGELOG.new mv CHANGELOG.new CHANGELOG.md rm NOTES.tmp git add CHANGELOG.md fi git add versions.env git commit -m "release: $VERSION" git push origin main echo "Main pushed → edge build" git tag -a "$TAG" -m "Release $TAG" git push origin "$TAG" echo "Tag pushed → release build" echo "=== Release complete ==="