mirror of
https://git.bjxgj.com/xgj/xgj-actions.git
synced 2025-10-14 06:33:37 +08:00
feat: 增强 Web 项目发布构建的 GitHub Action,添加发布失败时的错误处理选项,支持状态监控和退出码输出,更新文档以反映新功能和使用示例。
This commit is contained in:
@@ -9,8 +9,10 @@
|
|||||||
- 🚀 **自动化发布**: 支持任意发布命令进行版本管理和发布
|
- 🚀 **自动化发布**: 支持任意发布命令进行版本管理和发布
|
||||||
- 🌍 **环境变量支持**: 支持传递任意数量的环境变量给发布命令
|
- 🌍 **环境变量支持**: 支持传递任意数量的环境变量给发布命令
|
||||||
- 📦 **智能版本处理**: 自动获取版本号,确保输出格式一致(无 `v` 前缀)
|
- 📦 **智能版本处理**: 自动获取版本号,确保输出格式一致(无 `v` 前缀)
|
||||||
|
- 📊 **状态监控**: 实时监控发布状态,支持成功/失败状态输出和退出码
|
||||||
- 🔧 **简洁配置**: 最小化配置,专注于发布核心功能
|
- 🔧 **简洁配置**: 最小化配置,专注于发布核心功能
|
||||||
- ✅ **灵活使用**: 可配置发布命令,适应不同项目需求
|
- ✅ **灵活使用**: 可配置发布命令,适应不同项目需求
|
||||||
|
- 🛡️ **错误控制**: 可配置发布失败时的行为(中断或继续)
|
||||||
|
|
||||||
## 快速开始
|
## 快速开始
|
||||||
|
|
||||||
@@ -83,11 +85,12 @@ Action 自动处理各种版本格式,确保输出一致:
|
|||||||
|
|
||||||
## 输入参数
|
## 输入参数
|
||||||
|
|
||||||
| 参数名 | 描述 | 必需 | 默认值 |
|
| 参数名 | 描述 | 必需 | 默认值 |
|
||||||
| ----------------- | ------------------------- | ---- | --------------------------------- |
|
| ----------------- | ---------------------------- | ---- | --------------------------------- |
|
||||||
| `release-command` | 发布命令 | ❌ | `npm run release -- --release -V` |
|
| `release-command` | 发布命令 | ❌ | `npm run release -- --release -V` |
|
||||||
| `node-debug` | 是否启用 Node.js 调试模式 | ❌ | `false` |
|
| `node-debug` | 是否启用 Node.js 调试模式 | ❌ | `false` |
|
||||||
| `version-file` | 自定义版本文件路径 | ❌ | `/tmp/last-version` |
|
| `version-file` | 自定义版本文件路径 | ❌ | `/tmp/last-version` |
|
||||||
|
| `fail-on-error` | 发布失败时是否让 action 失败 | ❌ | `true` |
|
||||||
|
|
||||||
## 环境变量支持
|
## 环境变量支持
|
||||||
|
|
||||||
@@ -120,10 +123,12 @@ Action 支持通过 `env` 传递**任意数量**的环境变量给发布命令
|
|||||||
|
|
||||||
## 输出参数
|
## 输出参数
|
||||||
|
|
||||||
| 参数名 | 描述 |
|
| 参数名 | 描述 |
|
||||||
| ------------------- | ------------------------ |
|
| ------------------- | -------------------------------------- |
|
||||||
| `version` | 发布的版本号 |
|
| `version` | 发布的版本号 |
|
||||||
| `version-with-dash` | 版本号(点号替换为横线) |
|
| `version-with-dash` | 版本号(点号替换为横线) |
|
||||||
|
| `release-status` | 发布命令执行状态 (`success`/`failure`) |
|
||||||
|
| `exit-code` | 发布命令退出码(仅在失败时有值) |
|
||||||
|
|
||||||
## 使用场景
|
## 使用场景
|
||||||
|
|
||||||
@@ -210,16 +215,107 @@ steps:
|
|||||||
APP_ENV: ${{ matrix.app_env }}
|
APP_ENV: ${{ matrix.app_env }}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 4. 状态检查和错误处理
|
||||||
|
|
||||||
|
演示如何处理发布状态和错误:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: 发布项目
|
||||||
|
id: release
|
||||||
|
uses: actions/xgj/release-web@main
|
||||||
|
with:
|
||||||
|
fail-on-error: false # 发布失败时不中断 workflow
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
|
||||||
|
# 总是执行的清理步骤
|
||||||
|
- name: 清理临时文件
|
||||||
|
if: always()
|
||||||
|
run: |
|
||||||
|
echo "清理临时文件..."
|
||||||
|
rm -rf temp/ dist/temp/
|
||||||
|
|
||||||
|
# 根据发布状态执行不同操作
|
||||||
|
- name: 处理发布结果
|
||||||
|
if: always()
|
||||||
|
run: |
|
||||||
|
echo "发布状态: ${{ steps.release.outputs.release-status }}"
|
||||||
|
|
||||||
|
if [[ "${{ steps.release.outputs.release-status }}" == "success" ]]; then
|
||||||
|
echo "✅ 发布成功,版本: ${{ steps.release.outputs.version }}"
|
||||||
|
echo "开始部署流程..."
|
||||||
|
else
|
||||||
|
echo "❌ 发布失败,退出码: ${{ steps.release.outputs.exit-code }}"
|
||||||
|
echo "发送失败通知..."
|
||||||
|
# 这里可以添加通知逻辑
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 只在成功时执行的部署步骤
|
||||||
|
- name: 部署到生产环境
|
||||||
|
if: steps.release.outputs.release-status == 'success'
|
||||||
|
run: |
|
||||||
|
echo "部署版本 ${{ steps.release.outputs.version }} 到生产环境"
|
||||||
|
kubectl set image deployment/app app=registry.com/app:${{ steps.release.outputs.version }}
|
||||||
|
|
||||||
|
# 失败时的回退操作
|
||||||
|
- name: 回退操作
|
||||||
|
if: steps.release.outputs.release-status == 'failure'
|
||||||
|
run: |
|
||||||
|
echo "执行回退操作..."
|
||||||
|
# 回退到上一个稳定版本的逻辑
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. 严格模式发布(默认行为)
|
||||||
|
|
||||||
|
适用于生产环境,发布失败时立即停止:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: 发布项目
|
||||||
|
id: release
|
||||||
|
uses: actions/xgj/release-web@main
|
||||||
|
with:
|
||||||
|
fail-on-error: true # 默认值,发布失败时中断 workflow
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
APP_ENV: "production"
|
||||||
|
|
||||||
|
# 这个步骤只有在发布成功时才会执行
|
||||||
|
- name: 部署到生产环境
|
||||||
|
run: |
|
||||||
|
echo "部署版本 ${{ steps.release.outputs.version }}"
|
||||||
|
kubectl apply -f k8s/
|
||||||
|
```
|
||||||
|
|
||||||
## 工作流程
|
## 工作流程
|
||||||
|
|
||||||
1. **发布构建**: 执行指定的发布命令进行版本发布
|
1. **发布构建**: 执行指定的发布命令进行版本发布
|
||||||
2. **智能版本获取**: 通过多种方法自动获取版本号
|
|
||||||
|
- 捕获命令执行状态和退出码
|
||||||
|
- 设置 `release-status` 输出(`success`/`failure`)
|
||||||
|
- 失败时记录 `exit-code` 输出
|
||||||
|
|
||||||
|
2. **智能版本获取**: 只在发布成功时执行,通过多种方法自动获取版本号
|
||||||
|
|
||||||
- 优先从版本文件读取(`/tmp/last-version` 或自定义路径)
|
- 优先从版本文件读取(`/tmp/last-version` 或自定义路径)
|
||||||
- 回退到最新 git tag(自动去除 `v` 前缀)
|
- 回退到最新 git tag(自动去除 `v` 前缀)
|
||||||
- 回退到 `package.json` 中的版本
|
- 回退到 `package.json` 中的版本
|
||||||
- 最后尝试从提交信息解析(支持 `v1.2.3` 和 `1.2.3` 格式)
|
- 最后尝试从提交信息解析(支持 `v1.2.3` 和 `1.2.3` 格式)
|
||||||
- **所有方法都确保输出不包含 `v` 前缀**
|
- **所有方法都确保输出不包含 `v` 前缀**
|
||||||
3. **发布总结**: 输出发布信息和结果
|
|
||||||
|
3. **发布总结**: 显示详细的发布状态信息
|
||||||
|
|
||||||
|
- 成功时:显示版本号和发布信息
|
||||||
|
- 失败时:显示错误状态和退出码
|
||||||
|
|
||||||
|
4. **状态检查**: 根据 `fail-on-error` 参数决定最终行为
|
||||||
|
- `true`(默认):发布失败时让 action 失败,中断 workflow
|
||||||
|
- `false`:发布失败时继续完成,允许后续步骤执行
|
||||||
|
|
||||||
## 依赖要求
|
## 依赖要求
|
||||||
|
|
||||||
@@ -282,12 +378,28 @@ CMD ["npm", "start"]
|
|||||||
|
|
||||||
## 错误处理
|
## 错误处理
|
||||||
|
|
||||||
Action 会在以下情况报错并退出:
|
### 发布失败处理
|
||||||
|
|
||||||
- 缺少必需的 `gitea-token` 参数
|
Action 提供灵活的错误处理机制:
|
||||||
- 指定的 `Dockerfile` 不存在
|
|
||||||
- `/tmp/last-version` 文件不存在(发布命令未正确执行)
|
**严格模式** (`fail-on-error: true` - 默认):
|
||||||
- Docker 构建失败
|
|
||||||
|
- 发布命令失败时,action 立即失败并中断 workflow
|
||||||
|
- 适用于生产环境,确保发布质量
|
||||||
|
|
||||||
|
**宽松模式** (`fail-on-error: false`):
|
||||||
|
|
||||||
|
- 发布命令失败时,action 继续完成并返回状态信息
|
||||||
|
- 允许执行清理、通知等后续操作
|
||||||
|
- 可通过 `outputs.release-status` 检查发布结果
|
||||||
|
|
||||||
|
### 常见错误情况
|
||||||
|
|
||||||
|
Action 会在以下情况报错:
|
||||||
|
|
||||||
|
- 发布命令执行失败(返回非零退出码)
|
||||||
|
- 无法获取版本信息(所有版本获取方法都失败)
|
||||||
|
- 版本文件不存在且无其他版本源
|
||||||
|
|
||||||
## 安全注意事项
|
## 安全注意事项
|
||||||
|
|
||||||
@@ -300,6 +412,46 @@ Action 会在以下情况报错并退出:
|
|||||||
|
|
||||||
### 常见问题
|
### 常见问题
|
||||||
|
|
||||||
|
### Q: 如何处理发布失败的情况?
|
||||||
|
|
||||||
|
A: Action 提供了多种方式处理发布失败:
|
||||||
|
|
||||||
|
1. **检查发布状态**:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: 发布项目
|
||||||
|
id: release
|
||||||
|
uses: actions/xgj/release-web@main
|
||||||
|
|
||||||
|
- name: 检查发布结果
|
||||||
|
run: |
|
||||||
|
if [[ "${{ steps.release.outputs.release-status }}" == "failure" ]]; then
|
||||||
|
echo "发布失败,退出码: ${{ steps.release.outputs.exit-code }}"
|
||||||
|
# 执行失败处理逻辑
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **宽松模式处理**:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: 发布项目
|
||||||
|
uses: actions/xgj/release-web@main
|
||||||
|
with:
|
||||||
|
fail-on-error: false # 失败时不中断
|
||||||
|
|
||||||
|
- name: 清理操作
|
||||||
|
if: always()
|
||||||
|
run: echo "总是执行清理"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q: 如何获取发布失败的详细信息?
|
||||||
|
|
||||||
|
A: 通过输出参数获取:
|
||||||
|
|
||||||
|
- `release-status`: `success` 或 `failure`
|
||||||
|
- `exit-code`: 失败时的命令退出码
|
||||||
|
- 检查 action 日志中的详细错误信息
|
||||||
|
|
||||||
### Q: 无法获取版本信息
|
### Q: 无法获取版本信息
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
@@ -21,6 +21,11 @@ inputs:
|
|||||||
description: '自定义版本文件路径,默认为 /tmp/last-version'
|
description: '自定义版本文件路径,默认为 /tmp/last-version'
|
||||||
required: false
|
required: false
|
||||||
default: '/tmp/last-version'
|
default: '/tmp/last-version'
|
||||||
|
|
||||||
|
fail-on-error:
|
||||||
|
description: '发布失败时是否让 action 失败 (true/false)'
|
||||||
|
required: false
|
||||||
|
default: 'true'
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
version:
|
version:
|
||||||
@@ -30,23 +35,47 @@ outputs:
|
|||||||
version-with-dash:
|
version-with-dash:
|
||||||
description: '版本号(点号替换为横线)'
|
description: '版本号(点号替换为横线)'
|
||||||
value: ${{ steps.get_var.outputs.version_with_dash }}
|
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:
|
runs:
|
||||||
using: 'composite'
|
using: 'composite'
|
||||||
steps:
|
steps:
|
||||||
- name: 发布构建
|
- name: 发布构建
|
||||||
|
id: release_build
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
echo "🚀 开始发布构建..."
|
echo "🚀 开始发布构建..."
|
||||||
echo "执行命令: ${{ inputs.release-command }}"
|
echo "执行命令: ${{ inputs.release-command }}"
|
||||||
|
|
||||||
|
# 设置错误处理,防止命令失败时立即退出
|
||||||
|
set +e
|
||||||
${{ inputs.release-command }}
|
${{ inputs.release-command }}
|
||||||
echo "✅ 发布构建完成"
|
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:
|
env:
|
||||||
NODE_DEBUG: ${{ inputs.node-debug == 'true' && 'release-it:*' || '' }}
|
NODE_DEBUG: ${{ inputs.node-debug == 'true' && 'release-it:*' || '' }}
|
||||||
|
|
||||||
- name: 获取版本信息
|
- name: 获取版本信息
|
||||||
id: get_var
|
id: get_var
|
||||||
shell: bash
|
shell: bash
|
||||||
|
if: steps.release_build.outputs.status == 'success'
|
||||||
run: |
|
run: |
|
||||||
echo "📝 获取版本信息..."
|
echo "📝 获取版本信息..."
|
||||||
VERSION=""
|
VERSION=""
|
||||||
@@ -108,8 +137,41 @@ runs:
|
|||||||
|
|
||||||
- name: 发布总结
|
- name: 发布总结
|
||||||
shell: bash
|
shell: bash
|
||||||
|
if: always()
|
||||||
run: |
|
run: |
|
||||||
echo "🎉 发布流程完成!"
|
echo "📋 发布流程总结"
|
||||||
echo ""
|
echo ""
|
||||||
echo "📋 发布信息:"
|
echo "📊 发布状态: ${{ steps.release_build.outputs.status }}"
|
||||||
echo " - 版本号: ${{ steps.get_var.outputs.version }}"
|
|
||||||
|
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
|
||||||
|
Reference in New Issue
Block a user