2026-05-16 04:24:10 +08:00

127 lines
5.0 KiB
YAML
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.

name: Hexo Theme Release
on:
push:
branches: [ main ]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
registry-url: 'https://registry.npmjs.org'
- name: Install dependencies
run: |
npm install --ignore-scripts
- name: Smart version management and publish
run: |
COMMIT_MSG=$(git log -1 --pretty=%B)
echo "Commit: $COMMIT_MSG"
# 1. 检查包是否存在并获取最新版本
if npm view hexo-theme-materialis version >/dev/null 2>&1; then
LATEST_NPM_VERSION=$(npm view hexo-theme-materialis version)
echo "📦 Latest version on npm: $LATEST_NPM_VERSION"
PACKAGE_EXISTS=true
else
echo "🆕 Package not found on npm (first publish or access issue)"
LATEST_NPM_VERSION="0.0.0"
PACKAGE_EXISTS=false
fi
CURRENT_VERSION=$(node -p "require('./package.json').version")
echo "📁 Current version in repo: $CURRENT_VERSION"
# 2. 确定目标版本逻辑
if [ "$PACKAGE_EXISTS" = false ]; then
# 首次发布:直接使用仓库版本
echo "🚀 First publish scenario! Using repo version: $CURRENT_VERSION"
TARGET_VERSION="$CURRENT_VERSION"
elif [ "$(printf '%s\n' "$LATEST_NPM_VERSION" "$CURRENT_VERSION" | sort -V | tail -n1)" = "$CURRENT_VERSION" ] && [ "$CURRENT_VERSION" != "$LATEST_NPM_VERSION" ]; then
# 仓库版本较新:使用仓库版本
echo "✅ Using newer repo version: $CURRENT_VERSION"
TARGET_VERSION="$CURRENT_VERSION"
else
# 基于Commit Message计算新版本
if [[ "$COMMIT_MSG" =~ .*BREAKING\ CHANGE.* ]] || \
[[ "$COMMIT_MSG" =~ .*BREAKING\ CHANGES.* ]] || \
[[ "$COMMIT_MSG" =~ ^feat! ]] || \
[[ "$COMMIT_MSG" =~ ^refactor! ]] || \
[[ "$COMMIT_MSG" =~ ^(major|release|version)[[:space:]]+[0-9] ]] || \
[[ "$COMMIT_MSG" =~ .*不兼容.* ]] || \
[[ "$COMMIT_MSG" =~ .*重大更新.* ]] || \
[[ "$COMMIT_MSG" =~ .*重大变更.* ]]; then
BUMP="major"
echo "🎯 Bump type: major (breaking change detected)"
elif [[ "$COMMIT_MSG" =~ ^feat: ]]; then
BUMP="minor"
echo "✨ Bump type: minor (feature)"
else
BUMP="patch"
echo "🔧 Bump type: patch (fix/other)"
fi
# 基于线上真实版本号计算
MAJOR=$(echo $LATEST_NPM_VERSION | cut -d. -f1)
MINOR=$(echo $LATEST_NPM_VERSION | cut -d. -f2)
PATCH=$(echo $LATEST_NPM_VERSION | cut -d. -f3)
case "$BUMP" in
"major")
TARGET_VERSION="$((MAJOR + 1)).0.0"
echo "🚀 MAJOR version update: $LATEST_NPM_VERSION -> $TARGET_VERSION"
;;
"minor")
TARGET_VERSION="$MAJOR.$((MINOR + 1)).0"
echo "🔄 MINOR version update: $LATEST_NPM_VERSION -> $TARGET_VERSION"
;;
"patch")
TARGET_VERSION="$MAJOR.$MINOR.$((PATCH + 1))"
echo "🔧 PATCH version update: $LATEST_NPM_VERSION -> $TARGET_VERSION"
;;
esac
fi
echo "🎯 Target version: $TARGET_VERSION"
# 3. 更新本地package.json版本仅当版本变化时
if [ "$CURRENT_VERSION" != "$TARGET_VERSION" ]; then
echo "📝 Updating package.json version from $CURRENT_VERSION to $TARGET_VERSION..."
npm version $TARGET_VERSION --no-git-tag-version --allow-same-version --ignore-scripts
echo "✅ package.json updated"
else
echo "📝 Version unchanged, no need to update package.json"
fi
# 4. 发布到npm带更详细的错误处理
echo "🔍 Checking if version $TARGET_VERSION already exists..."
if npm view hexo-theme-materialis@$TARGET_VERSION version >/dev/null 2>&1; then
echo "✅ Version $TARGET_VERSION already published, skipping publish"
else
echo "🚀 Publishing version $TARGET_VERSION to npm..."
if npm publish; then
echo "✅ Successfully published hexo-theme-materialis@$TARGET_VERSION to npm!"
else
echo "❌ npm publish failed with exit code $?"
# 检查可能的具体错误
if [ $? -eq 128 ] || [ $? -eq 1 ]; then
echo "⚠️ This might be a permission issue. Please verify:"
echo " 1. Your NPM_TOKEN has write access to this package"
echo " 2. Package 'hexo-theme-materialis' actually exists and you're a maintainer"
fi
exit 1
fi
fi
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}