Files
xgj/release-web/action.yml

185 lines
6.6 KiB
YAML
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.

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'
fail-on-error:
description: '发布失败时是否让 action 失败 (true/false)'
required: false
default: 'true'
outputs:
version:
description: '发布的版本号(带 v 前缀)'
value: ${{ steps.get_var.outputs.version }}
version-with-dash:
description: '版本号(带 v 前缀,点号替换为横线)'
value: ${{ steps.get_var.outputs.version_with_dash }}
release-status:
description: '发布命令执行状态 (success/failure)'
value: ${{ steps.release_build.outputs.status }}
exit-code:
description: '发布命令退出码(仅在失败时有值)'
value: ${{ steps.release_build.outputs.exit_code }}
runs:
using: 'composite'
steps:
- name: 发布构建
id: release_build
shell: bash
run: |
echo "🚀 开始发布构建..."
echo "执行命令: ${{ inputs.release-command }}"
# 设置错误处理,防止命令失败时立即退出
set +e
${{ inputs.release-command }}
RELEASE_EXIT_CODE=$?
set -e
# 根据退出码设置状态
if [ $RELEASE_EXIT_CODE -eq 0 ]; then
echo "status=success" >> $GITHUB_OUTPUT
echo "✅ 发布构建完成"
else
echo "status=failure" >> $GITHUB_OUTPUT
echo "❌ 发布构建失败 (退出码: $RELEASE_EXIT_CODE)"
echo "exit_code=$RELEASE_EXIT_CODE" >> $GITHUB_OUTPUT
fi
env:
NODE_DEBUG: ${{ inputs.node-debug == 'true' && 'release-it:*' || '' }}
- name: 获取版本信息
id: get_var
shell: bash
if: steps.release_build.outputs.status == 'success'
run: |
echo "📝 获取版本信息..."
VERSION=""
# 方法1: 从指定版本文件读取(优先级最高)
if [[ -f "${{ inputs.version-file }}" ]]; then
VERSION=$(cat "${{ inputs.version-file }}" | tr -d ' \n\r')
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')
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')
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)
if [[ -n "$COMMIT_VERSION" ]]; then
VERSION="$COMMIT_VERSION"
echo "✅ 从提交信息获取: $VERSION"
fi
fi
# 最终检查和清理版本号
if [[ -z "$VERSION" ]]; then
echo "❌ 错误: 无法获取版本信息"
echo "请确保:"
echo " 1. 发布命令生成版本文件(推荐格式: v1.2.3),或"
echo " 2. 存在有效的 git tag格式: v1.2.3),或"
echo " 3. package.json 包含 version 字段,或"
echo " 4. 提交信息包含版本号(格式: release: v1.2.3"
exit 1
fi
# 确保版本号格式正确(清理空白字符并确保 v 前缀)
VERSION=$(echo "$VERSION" | tr -d ' \n\r')
# 确保版本号有 v 前缀
if [[ ! "$VERSION" =~ ^v ]]; then
VERSION="v$VERSION"
fi
# 创建带横线的版本号(保持 v 前缀)
VERSION_WITH_DASH=$(echo "$VERSION" | sed 's/\./-/g')
# 验证版本号格式(应该以 v 开头)
if [[ ! "$VERSION" =~ ^v[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
if: always()
run: |
echo "📋 发布流程总结"
echo ""
echo "📊 发布状态: ${{ steps.release_build.outputs.status }}"
if [[ "${{ steps.release_build.outputs.status }}" == "success" ]]; then
echo "🎉 发布构建成功完成!"
echo ""
echo "📋 发布信息:"
echo " - 版本号: ${{ steps.get_var.outputs.version }}"
echo " - 带横线版本: ${{ steps.get_var.outputs.version_with_dash }}"
else
echo "❌ 发布构建失败"
echo ""
echo "📋 错误信息:"
echo " - 状态: 失败"
if [[ -n "${{ steps.release_build.outputs.exit_code }}" ]]; then
echo " - 退出码: ${{ steps.release_build.outputs.exit_code }}"
fi
echo " - 建议: 请检查发布命令和项目配置"
fi
- name: 检查发布结果
shell: bash
if: always()
run: |
if [[ "${{ steps.release_build.outputs.status }}" == "failure" ]]; then
if [[ "${{ inputs.fail-on-error }}" == "true" ]]; then
echo "❌ 发布失败,根据 fail-on-error=true 设置,终止 action 执行"
exit 1
else
echo "⚠️ 发布失败,但根据 fail-on-error=false 设置action 将继续完成"
echo "💡 您可以通过 outputs.release-status 检查发布状态"
fi
else
echo "✅ 发布成功action 正常完成"
fi