205 lines
6.6 KiB
Bash
Executable File
205 lines
6.6 KiB
Bash
Executable File
#!/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. Обновите документацию если нужно"
|