Merge pull request 'ci: add release script for tag-triggered deployments' (#115) from ci/add-release-script into main
All checks were successful
Build Docker Image / build (push) Successful in 1m20s
All checks were successful
Build Docker Image / build (push) Successful in 1m20s
Reviewed-on: #115
This commit is contained in:
commit
c30e0ad321
99
.scripts/release.sh
Executable file
99
.scripts/release.sh
Executable file
@ -0,0 +1,99 @@
|
||||
#!/usr/bin/env bash
|
||||
# Create a CalVer release tag and push to trigger CI.
|
||||
#
|
||||
# Usage:
|
||||
# .scripts/release.sh # auto-generates next version (YYYY.M.BUILD)
|
||||
# .scripts/release.sh 2026.3.11 # explicit version
|
||||
# .scripts/release.sh -y # auto-generate + skip confirmation
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SKIP_CONFIRM=false
|
||||
VERSION=""
|
||||
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
-y) SKIP_CONFIRM=true ;;
|
||||
*) VERSION="$arg" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# --- Ensure we're on main and up to date ---
|
||||
|
||||
BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
||||
if [[ "$BRANCH" != "main" ]]; then
|
||||
echo "ERROR: Must be on main branch (currently on ${BRANCH})"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "==> Fetching latest..."
|
||||
git fetch origin main --tags --quiet
|
||||
LOCAL=$(git rev-parse HEAD)
|
||||
REMOTE=$(git rev-parse origin/main)
|
||||
if [[ "$LOCAL" != "$REMOTE" ]]; then
|
||||
echo "ERROR: Local main is not up to date with origin. Run: git pull"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Determine version ---
|
||||
|
||||
YEAR=$(date +%Y)
|
||||
MONTH=$(date +%-m) # no leading zero
|
||||
|
||||
if [[ -z "$VERSION" ]]; then
|
||||
# Find the highest build number for this year.month
|
||||
LAST_BUILD=$(git tag --list "${YEAR}.${MONTH}.*" --sort=-v:refname | head -1 | awk -F. '{print $3}')
|
||||
NEXT_BUILD=$((${LAST_BUILD:-0} + 1))
|
||||
VERSION="${YEAR}.${MONTH}.${NEXT_BUILD}"
|
||||
fi
|
||||
|
||||
# Validate format
|
||||
if [[ ! "$VERSION" =~ ^20[0-9]{2}\.[0-9]+\.[0-9]+$ ]]; then
|
||||
echo "ERROR: Invalid version format '${VERSION}'. Expected YYYY.M.BUILD (e.g., 2026.3.11)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check tag doesn't already exist
|
||||
if git rev-parse "refs/tags/${VERSION}" &>/dev/null; then
|
||||
echo "ERROR: Tag ${VERSION} already exists"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Show what's being released ---
|
||||
|
||||
LAST_TAG=$(git tag --sort=-v:refname | head -1)
|
||||
echo ""
|
||||
echo "Version: ${VERSION}"
|
||||
echo "Previous: ${LAST_TAG:-none}"
|
||||
echo "Commit: $(git log -1 --format='%h %s')"
|
||||
echo ""
|
||||
|
||||
if [[ -n "$LAST_TAG" ]]; then
|
||||
COMMIT_COUNT=$(git rev-list "${LAST_TAG}..HEAD" --count)
|
||||
echo "Changes since ${LAST_TAG} (${COMMIT_COUNT} commits):"
|
||||
git log "${LAST_TAG}..HEAD" --oneline --no-merges
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# --- Confirm ---
|
||||
|
||||
if [[ "$SKIP_CONFIRM" != true ]]; then
|
||||
read -rp "Create tag ${VERSION} and trigger release? [y/N] " answer
|
||||
[[ "$answer" =~ ^[Yy]$ ]] || {
|
||||
echo "Aborted."
|
||||
exit 0
|
||||
}
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# --- Tag and push ---
|
||||
|
||||
git tag "$VERSION"
|
||||
git push origin tag "$VERSION"
|
||||
|
||||
echo ""
|
||||
echo "==> Tag ${VERSION} pushed. CI will build:"
|
||||
echo " - manticorum67/major-domo-discordapp:${VERSION}"
|
||||
echo " - manticorum67/major-domo-discordapp:production"
|
||||
echo ""
|
||||
echo "Deploy with: .scripts/deploy.sh"
|
||||
Loading…
Reference in New Issue
Block a user