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