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 }}