mirror of
https://github.com/DeBrosOfficial/network.git
synced 2025-12-11 07:38:49 +00:00
- Upgraded `actions/upload-artifact` and `actions/download-artifact` to version 4 in the release workflow for improved functionality. - Introduced a new `release.sh` script to manage the complete release workflow, including versioning, branch checks, and tagging for both stable and nightly releases.
290 lines
8.3 KiB
Bash
Executable File
290 lines
8.3 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# DeBros Network Interactive Release Script
|
||
# Handles the complete release workflow for both stable and nightly releases
|
||
|
||
set -e
|
||
|
||
# Color codes
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
CYAN='\033[0;36m'
|
||
BLUE='\033[38;2;2;128;175m'
|
||
YELLOW='\033[1;33m'
|
||
NOCOLOR='\033[0m'
|
||
|
||
log() { echo -e "${CYAN}[$(date '+%Y-%m-%d %H:%M:%S')]${NOCOLOR} $1"; }
|
||
error() { echo -e "${RED}[ERROR]${NOCOLOR} $1"; }
|
||
success() { echo -e "${GREEN}[SUCCESS]${NOCOLOR} $1"; }
|
||
warning() { echo -e "${YELLOW}[WARNING]${NOCOLOR} $1"; }
|
||
info() { echo -e "${BLUE}ℹ${NOCOLOR} $1"; }
|
||
|
||
display_banner() {
|
||
echo -e "${BLUE}========================================================================${NOCOLOR}"
|
||
echo -e "${CYAN}
|
||
____ ____ _ _ _ _
|
||
| _ \\ ___| __ ) _ __ ___ ___ | \\ | | ___| |___ _____ _ __| | __
|
||
| | | |/ _ \\ _ \\| __/ _ \\/ __| | \\| |/ _ \\ __\\ \\ /\\ / / _ \\| __| |/ /
|
||
| |_| | __/ |_) | | | (_) \\__ \\ | |\\ | __/ |_ \\ V V / (_) | | | <
|
||
|____/ \\___|____/|_| \\___/|___/ |_| \\_|\\___|\\__| \\_/\\_/ \\___/|_| |_|\\_\\
|
||
${NOCOLOR}"
|
||
echo -e "${BLUE}========================================================================${NOCOLOR}"
|
||
echo -e "${GREEN} Release Management Tool${NOCOLOR}"
|
||
echo -e "${BLUE}========================================================================${NOCOLOR}"
|
||
}
|
||
|
||
check_git_clean() {
|
||
if ! git diff-index --quiet HEAD --; then
|
||
error "Working directory has uncommitted changes. Please commit or stash them first."
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
check_current_branch() {
|
||
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
||
echo "$CURRENT_BRANCH"
|
||
}
|
||
|
||
get_latest_version() {
|
||
git tag --list 'v*' --sort=-version:refname | head -1 | sed 's/^v//' || echo "0.0.0"
|
||
}
|
||
|
||
increment_version() {
|
||
local version=$1
|
||
local bump=$2
|
||
|
||
IFS='.' read -r major minor patch <<< "$version"
|
||
|
||
case $bump in
|
||
major)
|
||
major=$((major + 1))
|
||
minor=0
|
||
patch=0
|
||
;;
|
||
minor)
|
||
minor=$((minor + 1))
|
||
patch=0
|
||
;;
|
||
patch)
|
||
patch=$((patch + 1))
|
||
;;
|
||
esac
|
||
|
||
echo "$major.$minor.$patch"
|
||
}
|
||
|
||
prompt_release_type() {
|
||
echo "" >&2
|
||
echo -e "${CYAN}=== Release Type ===${NOCOLOR}" >&2
|
||
echo "1) Stable Release (merge nightly → main, tag on main)" >&2
|
||
echo "2) Nightly Release (tag directly on nightly)" >&2
|
||
echo "3) Exit" >&2
|
||
echo "" >&2
|
||
read -p "Choose release type (1-3): " release_type >&2
|
||
echo "$release_type"
|
||
}
|
||
|
||
prompt_version_strategy() {
|
||
echo "" >&2
|
||
echo -e "${CYAN}=== Version Strategy ===${NOCOLOR}" >&2
|
||
local latest=$(get_latest_version)
|
||
echo "Latest version: $latest" >&2
|
||
echo "" >&2
|
||
echo "1) Major bump ($latest → $(increment_version $latest major))" >&2
|
||
echo "2) Minor bump ($latest → $(increment_version $latest minor))" >&2
|
||
echo "3) Patch bump ($latest → $(increment_version $latest patch))" >&2
|
||
echo "4) Custom version" >&2
|
||
echo "" >&2
|
||
read -p "Choose version strategy (1-4): " version_strategy >&2
|
||
echo "$version_strategy"
|
||
}
|
||
|
||
prompt_custom_version() {
|
||
read -p "Enter custom version (e.g., 0.52.1): " custom_version >&2
|
||
if [[ ! $custom_version =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||
error "Invalid version format. Must be X.Y.Z"
|
||
exit 1
|
||
fi
|
||
echo "$custom_version"
|
||
}
|
||
|
||
confirm_release() {
|
||
local version=$1
|
||
local target=$2
|
||
local msg=$3
|
||
|
||
echo ""
|
||
echo -e "${YELLOW}=== Release Summary ===${NOCOLOR}"
|
||
echo "Version: $version"
|
||
echo "Target: $target"
|
||
echo "Message: $msg"
|
||
echo ""
|
||
read -p "Is this correct? (yes/no): " confirm
|
||
|
||
if [[ "$confirm" != "yes" ]]; then
|
||
error "Release cancelled."
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
handle_stable_release() {
|
||
local version=$1
|
||
|
||
log "Stable Release: v$version"
|
||
echo ""
|
||
|
||
# Check if on nightly
|
||
if [[ "$CURRENT_BRANCH" != "nightly" ]]; then
|
||
warning "Not on nightly branch. Checking out nightly..."
|
||
git checkout nightly
|
||
git pull origin nightly
|
||
else
|
||
git pull origin nightly
|
||
fi
|
||
|
||
log "Current branch: nightly"
|
||
info "Next step: Create PR from nightly → main in GitHub"
|
||
info "Once PR is merged, this script will create the release tag"
|
||
echo ""
|
||
echo -e "${YELLOW}Have you already merged the PR to main? (yes/no)${NOCOLOR}"
|
||
read -p "> " pr_merged
|
||
|
||
if [[ "$pr_merged" != "yes" ]]; then
|
||
warning "Please create and merge the PR first, then run this script again."
|
||
exit 0
|
||
fi
|
||
|
||
# Verify main is updated
|
||
log "Switching to main and pulling latest..."
|
||
git checkout main
|
||
git pull origin main
|
||
|
||
# Create tag
|
||
log "Creating tag v$version on main..."
|
||
git tag -a "v$version" -m "Release v$version"
|
||
|
||
success "Tag created: v$version"
|
||
}
|
||
|
||
handle_nightly_release() {
|
||
local version=$1
|
||
|
||
log "Nightly Release: v$version-nightly"
|
||
echo ""
|
||
|
||
# Check if on nightly
|
||
if [[ "$CURRENT_BRANCH" != "nightly" ]]; then
|
||
warning "Not on nightly branch. Checking out nightly..."
|
||
git checkout nightly
|
||
git pull origin nightly
|
||
else
|
||
git pull origin nightly
|
||
fi
|
||
|
||
log "Current branch: nightly"
|
||
|
||
# Create tag
|
||
log "Creating tag v$version-nightly on nightly..."
|
||
git tag -a "v$version-nightly" -m "Nightly Release v$version"
|
||
|
||
success "Tag created: v$version-nightly"
|
||
}
|
||
|
||
push_release() {
|
||
local tag=$1
|
||
|
||
echo ""
|
||
echo -e "${CYAN}=== Pushing Release ===${NOCOLOR}"
|
||
log "Pushing tag $tag to origin..."
|
||
echo ""
|
||
echo -e "${YELLOW}This will trigger GitHub Actions to build and publish the release.${NOCOLOR}"
|
||
read -p "Continue? (yes/no): " confirm_push
|
||
|
||
if [[ "$confirm_push" != "yes" ]]; then
|
||
error "Push cancelled. Tag created but not pushed."
|
||
exit 0
|
||
fi
|
||
|
||
git push origin "$tag"
|
||
success "Tag pushed successfully!"
|
||
|
||
echo ""
|
||
echo -e "${GREEN}========================================================================${NOCOLOR}"
|
||
echo -e "${GREEN}✅ Release Started!${NOCOLOR}"
|
||
echo -e "${GREEN}========================================================================${NOCOLOR}"
|
||
echo ""
|
||
echo -e "📊 Monitor your release:"
|
||
echo -e " • GitHub Actions: https://github.com/DeBrosOfficial/network/actions"
|
||
echo -e " • Releases: https://github.com/DeBrosOfficial/network/releases"
|
||
echo ""
|
||
echo -e "⏱️ The build usually takes 2-5 minutes."
|
||
echo -e "📦 Your release will appear on the Releases page once complete."
|
||
echo ""
|
||
}
|
||
|
||
main() {
|
||
display_banner
|
||
|
||
# Check git status
|
||
log "Checking git status..."
|
||
check_git_clean
|
||
|
||
CURRENT_BRANCH=$(check_current_branch)
|
||
log "Current branch: $CURRENT_BRANCH"
|
||
|
||
# Get release type
|
||
release_type=$(prompt_release_type)
|
||
|
||
if [[ "$release_type" == "3" ]]; then
|
||
info "Release cancelled."
|
||
exit 0
|
||
fi
|
||
|
||
# Get version strategy
|
||
version_strategy=$(prompt_version_strategy)
|
||
latest_version=$(get_latest_version)
|
||
|
||
case $version_strategy in
|
||
1)
|
||
new_version=$(increment_version "$latest_version" major)
|
||
;;
|
||
2)
|
||
new_version=$(increment_version "$latest_version" minor)
|
||
;;
|
||
3)
|
||
new_version=$(increment_version "$latest_version" patch)
|
||
;;
|
||
4)
|
||
new_version=$(prompt_custom_version)
|
||
;;
|
||
*)
|
||
error "Invalid choice"
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
# Handle release based on type
|
||
case $release_type in
|
||
1)
|
||
# Stable release
|
||
confirm_release "$new_version" "main (stable)" "Release v$new_version to stable main branch"
|
||
handle_stable_release "$new_version"
|
||
push_release "v$new_version"
|
||
;;
|
||
2)
|
||
# Nightly release
|
||
confirm_release "$new_version" "nightly (development)" "Release v$new_version-nightly to nightly branch"
|
||
handle_nightly_release "$new_version"
|
||
push_release "v$new_version-nightly"
|
||
;;
|
||
*)
|
||
error "Invalid choice"
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
echo -e "${GREEN}Done! 🎉${NOCOLOR}"
|
||
}
|
||
|
||
main "$@"
|