Files
knock-gui/back/scripts/quick-release.sh
2025-08-17 00:43:58 +06:00

205 lines
6.6 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Скрипт для быстрого создания релиза Port Knocker
# Использование: ./docs/scripts/quick-release.sh v1.0.7
set -e
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Функция для вывода сообщений
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Проверка аргументов
VERSION=$1
if [ -z "$VERSION" ]; then
log_error "Не указана версия!"
echo "Использование: $0 <version>"
echo "Пример: $0 v1.0.4"
exit 1
fi
# Проверка формата версии
if [[ ! $VERSION =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
log_error "Неверный формат версии: $VERSION"
echo "Используйте формат: vX.Y.Z (например: v1.0.4)"
exit 1
fi
log_info "Начинаем создание релиза $VERSION..."
# Проверка зависимостей
log_info "Проверяем зависимости..."
command -v go >/dev/null 2>&1 || {
log_error "Go не установлен"
exit 1
}
# Проверка версии Go
GO_VERSION=$(go version | awk '{print $3}' | sed 's/go//')
log_info "Версия Go: $GO_VERSION"
if [[ "$(echo -e "1.20\n$GO_VERSION" | sort -V | head -n1)" != "1.20" ]]; then
log_warning "Рекомендуется Go 1.20+ для лучшей совместимости"
fi
command -v git >/dev/null 2>&1 || {
log_error "Git не установлен"
exit 1
}
command -v tar >/dev/null 2>&1 || {
log_error "tar не установлен"
exit 1
}
command -v zip >/dev/null 2>&1 || {
log_error "zip не установлен"
exit 1
}
# Проверка статуса git
log_info "Проверяем статус Git..."
if [ -n "$(git status --porcelain)" ]; then
log_warning "Есть незакоммиченные изменения!"
echo "Текущие изменения:"
git status --short
read -p "Продолжить? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log_info "Отменено пользователем"
exit 1
fi
fi
# Обновление версии
log_info "Обновляем версию в main.go..."
sed -i "s/Version.*=.*\".*\"/Version = \"$VERSION\"/" main.go
log_info "Обновляем версию в README.md..."
sed -i "s/Версия.*: [0-9.]*/Версия**: ${VERSION#v}/" README.md
# Проверка изменений
log_info "Проверяем изменения..."
if [ -z "$(git diff)" ]; then
log_warning "Нет изменений для коммита"
else
echo "Изменения:"
git diff --stat
fi
# Коммит изменений
log_info "Коммитим изменения..."
git add .
git commit -m "Prepare for release $VERSION"
git push origin main
# Сборка бинарников
log_info "Собираем бинарники для всех платформ..."
export VERSION_NUM="${VERSION#v}"
export BUILD_TIME=$(date -u '+%Y-%m-%d_%H:%M:%S')
# Функция сборки для платформы
build_for_platform() {
local os=$1
local arch=$2
local suffix=$3
local binary_name="port-knocker-$suffix"
log_info "Собираем для $os/$arch..."
GOOS=$os GOARCH=$arch go build \
-ldflags "-X main.Version=${VERSION_NUM} -X main.BuildTime=${BUILD_TIME} -s -w" \
-o "$binary_name" .
# Создание архива
if [[ "$os" == "windows" ]]; then
zip "${binary_name}.zip" "$binary_name"
else
tar -czf "${binary_name}.tar.gz" "$binary_name"
fi
# Удаление бинарника
rm "$binary_name"
log_success "Создан архив для $os/$arch"
}
# Сборка для всех платформ
build_for_platform "linux" "amd64" "linux-amd64"
build_for_platform "linux" "arm64" "linux-arm64"
build_for_platform "windows" "amd64" "windows-amd64.exe"
build_for_platform "darwin" "amd64" "darwin-amd64"
build_for_platform "darwin" "arm64" "darwin-arm64"
# Проверка созданных файлов
log_info "Проверяем созданные архивы..."
ls -la port-knocker-*
# Создание Git тега
log_info "Создаем Git тег..."
# Читаем release-notes.md и сохраняем содержимое в переменную NOTES
NOTES=$(cat docs/scripts/release-notes.md)
# Заменяем все переменные вида $VERSION в NOTES на их значения
NOTES=$(echo "$NOTES" | sed "s/\\\$VERSION/$VERSION/g")
git tag -a "$VERSION" -m "$NOTES"
git push origin "$VERSION"
# Проверка GitHub CLI
if command -v gh >/dev/null 2>&1; then
log_info "GitHub CLI найден. Создаем релиз..."
# Проверка авторизации
if gh auth status >/dev/null 2>&1; then
log_info "Создаем релиз на GitHub..."
gh release create "$VERSION" \
--title "Port Knocker $VERSION" \
--notes "$NOTES" \
--draft=false \
--prerelease=false
log_info "Загружаем бинарники..."
gh release upload "$VERSION" port-knocker-*.tar.gz port-knocker-*.zip
log_success "Релиз $VERSION создан и опубликован на GitHub!"
else
log_warning "GitHub CLI не авторизован. Создайте релиз вручную."
log_info "Перейдите на: https://github.com/Direct-Dev-Ru/port-knocker/releases"
log_info "Загрузите файлы: port-knocker-*.tar.gz port-knocker-*.zip"
fi
else
log_warning "GitHub CLI не установлен. Создайте релиз вручную."
log_info "Перейдите на: https://github.com/Direct-Dev-Ru/port-knocker/releases"
log_info "Загрузите файлы: port-knocker-*.tar.gz port-knocker-*.zip"
fi
# Очистка
log_info "Очищаем временные файлы..."
rm -f port-knocker-*.tar.gz port-knocker-*.zip
log_success "Релиз $VERSION успешно создан!"
log_info "Тег: $VERSION"
log_info "Релиз: https://github.com/Direct-Dev-Ru/port-knocker/releases/tag/$VERSION"
echo
log_info "Следующие шаги:"
echo "1. Проверьте релиз на GitHub"
echo "2. Протестируйте скачанные бинарники"
echo "3. Обновите документацию если нужно"