name: 'Web项目发布构建' description: '自动化Web项目发布流程,支持版本管理和发布' author: 'Your Organization' branding: icon: 'tag' color: 'green' inputs: release-command: description: '发布命令,例如 npm run release -- --release -V' required: false default: 'npm run release -- --release -V' node-debug: description: '是否启用Node.js调试模式 (true/false)' required: false default: 'false' version-file: description: '自定义版本文件路径,默认为 /tmp/last-version' required: false default: '/tmp/last-version' outputs: version: description: '发布的版本号' value: ${{ steps.get_var.outputs.version }} version-with-dash: description: '版本号(点号替换为横线)' value: ${{ steps.get_var.outputs.version_with_dash }} runs: using: 'composite' steps: - name: 发布构建 shell: bash run: | echo "🚀 开始发布构建..." echo "执行命令: ${{ inputs.release-command }}" ${{ inputs.release-command }} echo "✅ 发布构建完成" env: NODE_DEBUG: ${{ inputs.node-debug == 'true' && 'release-it:*' || '' }} - name: 获取版本信息 id: get_var shell: bash run: | echo "📝 获取版本信息..." VERSION="" # 方法1: 从指定版本文件读取(优先级最高) if [[ -f "${{ inputs.version-file }}" ]]; then VERSION=$(cat "${{ inputs.version-file }}" | tr -d ' \n\r' | sed 's/^v//') echo "✅ 从版本文件获取: $VERSION" # 方法2: 从最新的 git tag 获取 elif git describe --tags --abbrev=0 2>/dev/null; then VERSION=$(git describe --tags --abbrev=0 | tr -d ' \n\r' | sed 's/^v//') echo "✅ 从 git tag 获取: $VERSION" # 方法3: 从 package.json 获取 elif [[ -f "package.json" ]] && command -v node >/dev/null; then VERSION=$(node -p "require('./package.json').version" 2>/dev/null | tr -d ' \n\r' | sed 's/^v//') if [[ -n "$VERSION" && "$VERSION" != "undefined" ]]; then echo "✅ 从 package.json 获取: $VERSION" else VERSION="" fi fi # 如果所有方法都失败,尝试解析发布命令输出 if [[ -z "$VERSION" ]]; then echo "⚠️ 无法通过常规方法获取版本,尝试解析最近的提交信息..." # 尝试从最近的提交消息中解析版本(如 "release: 1.2.3" 或 "release: v1.2.3" 格式) COMMIT_VERSION=$(git log -1 --pretty=format:"%s" | grep -oE 'v?[0-9]+\.[0-9]+\.[0-9]+' | head -1 | sed 's/^v//') if [[ -n "$COMMIT_VERSION" ]]; then VERSION="$COMMIT_VERSION" echo "✅ 从提交信息获取: $VERSION" fi fi # 最终检查和清理版本号 if [[ -z "$VERSION" ]]; then echo "❌ 错误: 无法获取版本信息" echo "请确保:" echo " 1. 发布命令生成 /tmp/last-version 文件,或" echo " 2. 存在有效的 git tag,或" echo " 3. package.json 包含 version 字段,或" echo " 4. 提交信息包含版本号" exit 1 fi # 确保版本号格式正确(去掉可能的 v 前缀和空白字符) VERSION=$(echo "$VERSION" | sed 's/^v//' | tr -d ' \n\r') VERSION_WITH_DASH=$(echo "$VERSION" | sed 's/\./-/g') # 验证版本号格式 if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+([.-].*)?$ ]]; then echo "⚠️ 警告: 版本号格式可能不标准: $VERSION" fi echo "version=$VERSION" >> $GITHUB_OUTPUT echo "version_with_dash=$VERSION_WITH_DASH" >> $GITHUB_OUTPUT echo "📦 发布版本: $VERSION" echo "📦 带横线版本: $VERSION_WITH_DASH" - name: 发布总结 shell: bash run: | echo "🎉 发布流程完成!" echo "" echo "📋 发布信息:" echo " - 版本号: ${{ steps.get_var.outputs.version }}"