mirror of
https://git.bjxgj.com/xgj/xgj-actions.git
synced 2025-10-14 03:53:37 +08:00
185 lines
6.6 KiB
YAML
185 lines
6.6 KiB
YAML
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
|