Files
homeassistant-jackery/prepare_release.sh
不求圣剑 bef0082d8a 0.5.0
2026-01-22 14:20:42 +08:00

175 lines
5.0 KiB
Bash
Executable File
Raw 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
# Jackery HACS 发布准备脚本
# 此脚本帮助你准备发布到 HACS 并支持自动创建 GitHub Release
set -e
# 配置路径
COMPONENT_PATH="custom_components/jackery"
MANIFEST_FILE="$COMPONENT_PATH/manifest.json"
echo "🚀 准备发布 Jackery 到 HACS"
echo ""
# 检查是否在正确的目录
if [ ! -f "hacs.json" ]; then
echo "❌ 错误:未找到 hacs.json 文件"
echo "请确保在项目根目录运行此脚本"
exit 1
fi
# 检查 manifest 文件是否存在
if [ ! -f "$MANIFEST_FILE" ]; then
echo "❌ 错误:未找到 $MANIFEST_FILE"
echo "请确认文件路径是否正确"
exit 1
fi
# 检查是否有未提交的更改
if ! git diff-index --quiet HEAD --; then
echo "⚠️ 检测到未提交的更改"
echo ""
git status --short
echo ""
read -p "是否要提交这些更改?(y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
read -p "请输入提交信息: " commit_msg
git add .
git commit -m "$commit_msg"
echo "✅ 更改已提交"
else
echo "❌ 请先提交或暂存你的更改"
exit 1
fi
fi
# 获取当前版本
if [ -f "$MANIFEST_FILE" ]; then
CURRENT_VERSION=$(python3 -c "import json; print(json.load(open('$MANIFEST_FILE'))['version'])")
else
echo "❌ 无法读取文件: $MANIFEST_FILE"
exit 1
fi
echo "📦 当前版本: $CURRENT_VERSION"
echo ""
# 询问新版本
read -p "请输入新版本号 (当前: $CURRENT_VERSION): " NEW_VERSION
if [ -z "$NEW_VERSION" ]; then
NEW_VERSION=$CURRENT_VERSION
echo "使用当前版本: $NEW_VERSION"
fi
# 更新 manifest.json 中的版本号
if [ "$NEW_VERSION" != "$CURRENT_VERSION" ]; then
echo "📝 更新 manifest.json 中的版本号..."
# 使用正则匹配替换,更稳健
sed -i.bak "s/\"version\": \".*\"/\"version\": \"$NEW_VERSION\"/" "$MANIFEST_FILE"
rm "$MANIFEST_FILE.bak"
git add "$MANIFEST_FILE"
# 仅在有变更时提交
if ! git diff-index --quiet HEAD --; then
git commit -m "版本更新至 v$NEW_VERSION"
echo "✅ 版本号已更新"
else
echo "⚠️ 版本号未发生实际变化或无法提交"
fi
fi
# 推送到 GitHub
echo ""
echo "📤 推送到 GitHub..."
git push origin main
# 处理 Tag
TAG_NAME="v$NEW_VERSION"
# 检查本地 tag 是否存在
if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then
echo "⚠️ Tag $TAG_NAME 本地已存在"
read -p "是否删除旧 Tag 并重新创建? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
git tag -d "$TAG_NAME"
# 尝试删除远程 tag (如果存在)
git push origin :refs/tags/"$TAG_NAME" 2>/dev/null || true
echo "🗑️ 旧 Tag 已清除"
else
echo "❌ 停止发布Tag 已存在且未选择覆盖"
exit 1
fi
fi
echo ""
echo "🏷️ 创建 Git tag: $TAG_NAME"
git tag -a "$TAG_NAME" -m "Release $TAG_NAME"
git push origin "$TAG_NAME"
echo ""
echo "✅ 代码和 Tag 推送完成!"
echo ""
# GitHub Release 自动化
RELEASE_CREATED=false
if command -v gh &> /dev/null; then
echo "🤖 检测到 GitHub CLI (gh)"
read -p "是否使用 gh 立即创建 GitHub Release? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
RELEASE_TITLE="$TAG_NAME"
read -p "请输入 Release 标题 (默认: $TAG_NAME): " input_title
if [ -n "$input_title" ]; then
RELEASE_TITLE="$input_title"
fi
echo "您可以选择 Release Notes 来源:"
echo "1) 自动生成 (gh --generate-notes)"
echo "2) 使用简单的 'Release v...'"
echo "3) 取消自动发布"
read -p "请选择 (1/2/3, 默认 1): " note_choice
note_choice=${note_choice:-1}
case $note_choice in
1)
echo "⏳ 正在创建 Release (自动生成日志)..."
if gh release create "$TAG_NAME" --title "$RELEASE_TITLE" --generate-notes; then
RELEASE_CREATED=true
fi
;;
2)
echo "⏳ 正在创建 Release..."
if gh release create "$TAG_NAME" --title "$RELEASE_TITLE" --notes "Release $TAG_NAME"; then
RELEASE_CREATED=true
fi
;;
*)
echo "已取消 gh 发布。"
;;
esac
if [ "$RELEASE_CREATED" = true ]; then
echo "🎉 GitHub Release 创建成功!"
# 尝试获取 release url
gh release view "$TAG_NAME" --json url --template '{{.url}}' || echo ""
echo ""
fi
fi
fi
if [ "$RELEASE_CREATED" = false ]; then
echo "📋 下一步操作 (手动发布):"
echo "1. 访问 GitHub 创建 Release:"
echo " https://github.com/suyulin/jackery/releases/new?tag=$TAG_NAME"
echo ""
echo "2. 如果尚未安装,推荐安装 GitHub CLI (gh) 以便下次自动发布。"
fi
echo "✅ 流程结束"