90 lines
3.4 KiB
Bash
Executable File
90 lines
3.4 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
MAIN_BRANCH="master"
|
|
DEVELOP_BRANCH="develop"
|
|
VALID_LEVELS="major minor patch"
|
|
|
|
# ── Validation ────────────────────────────────────────────────────────────────
|
|
if [ -z "${1:-}" ]; then
|
|
echo "ERROR: Must specify the release level: major, minor, patch" >&2
|
|
exit 1
|
|
fi
|
|
|
|
RELEASE_LEVEL="$1"
|
|
|
|
if ! echo "$VALID_LEVELS" | grep -qw "$RELEASE_LEVEL"; then
|
|
echo "ERROR: Invalid release level '$RELEASE_LEVEL'. Must be one of: $VALID_LEVELS" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# ── Pre-flight checks ────────────────────────────────────────────────────────
|
|
BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
|
|
# Ensure we're in a git repo
|
|
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
echo "ERROR: Not inside a git repository" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Check for a clean working tree
|
|
if ! git diff --quiet || ! git diff --cached --quiet; then
|
|
echo "ERROR: Working tree has uncommitted changes. Commit or stash before releasing." >&2
|
|
git status --short >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Verify both remotes exist
|
|
for remote in origin dtp; do
|
|
if ! git remote get-url "$remote" >/dev/null 2>&1; then
|
|
echo "ERROR: Git remote '$remote' not found" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# Verify branches exist locally
|
|
for branch in "$MAIN_BRANCH" "$DEVELOP_BRANCH"; do
|
|
if ! git rev-parse --verify "$branch" >/dev/null 2>&1; then
|
|
echo "ERROR: Branch '$branch' does not exist locally" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# ── Save starting branch for rollback ────────────────────────────────────────
|
|
STARTING_BRANCH="$BRANCH"
|
|
|
|
# ── Step 1: Update develop and bump version ──────────────────────────────────
|
|
echo ">>> Switching to $DEVELOP_BRANCH..."
|
|
git checkout "$DEVELOP_BRANCH"
|
|
|
|
echo ">>> Bumping version ($RELEASE_LEVEL)..."
|
|
NEW_VERSION=$(npm version "$RELEASE_LEVEL" -m "release: %s")
|
|
echo " Version bumped to $NEW_VERSION"
|
|
|
|
# ── Step 2: Push develop + tags to both remotes ──────────────────────────────
|
|
echo ">>> Pushing $DEVELOP_BRANCH to origin..."
|
|
git push origin "$DEVELOP_BRANCH" --follow-tags
|
|
|
|
echo ">>> Pushing $DEVELOP_BRANCH to dtp..."
|
|
git push dtp "$DEVELOP_BRANCH" --follow-tags
|
|
|
|
# ── Step 3: Merge develop into master ────────────────────────────────────────
|
|
echo ">>> Switching to $MAIN_BRANCH..."
|
|
git checkout "$MAIN_BRANCH"
|
|
|
|
echo ">>> Merging $DEVELOP_BRANCH into $MAIN_BRANCH..."
|
|
git merge "$DEVELOP_BRANCH"
|
|
|
|
# ── Step 4: Push master + tags to both remotes ───────────────────────────────
|
|
echo ">>> Pushing $MAIN_BRANCH to origin..."
|
|
git push origin "$MAIN_BRANCH" --follow-tags
|
|
|
|
echo ">>> Pushing $MAIN_BRANCH to dtp..."
|
|
git push dtp "$MAIN_BRANCH" --follow-tags
|
|
|
|
# ── Step 5: Return to develop ────────────────────────────────────────────────
|
|
echo ">>> Switching back to $DEVELOP_BRANCH..."
|
|
git checkout "$DEVELOP_BRANCH"
|
|
|
|
echo ">>> Release $NEW_VERSION complete!"
|