Files
xgj/release-web/README.md

350 lines
9.8 KiB
Markdown
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.

# Web 项目发布构建 Action
[![GitHub](https://img.shields.io/badge/github-actions-blue.svg)](https://github.com/features/actions)
自动化 Web 项目发布流程的 GitHub Action包括版本发布、Docker 镜像构建和推送等完整的 CI/CD 流程。
## 功能特性
- 🚀 **自动化发布**: 支持 `release-it` 工具进行版本管理和发布
- 🐳 **Docker 集成**: 自动构建和推送 Docker 镜像到私有仓库
- 🏷️ **灵活标签**: 支持自定义 Docker 标签,自动生成版本标签
- 📊 **Sentry 集成**: 可选的 Sentry 错误监控集成
- 🔧 **高度可配置**: 丰富的输入参数满足不同项目需求
-**参数验证**: 自动验证必需参数和文件存在性
## 快速开始
### 基础用法
```yaml
- name: 发布Web项目
uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
```
### 使用环境变量
```yaml
- name: 发布Web项目
uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
env:
# 🌍 可以传递任意数量的环境变量给发布命令
APP_ENV: production
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_DSN: ${{ vars.SENTRY_DSN }}
SENTRY_VITE: true
BUILD_NUMBER: ${{ github.run_number }}
CUSTOM_CONFIG: "your-value"
FEATURE_FLAG: ${{ github.ref == 'refs/heads/main' }}
# ... 更多任意环境变量
```
### 完整示例
```yaml
- name: 发布Web项目
uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
app-env: "production"
sentry-auth-token: ${{ secrets.SENTRY_AUTH_TOKEN }}
sentry-dsn: ${{ vars.SENTRY_DSN }}
enable-sentry: "true"
docker-registry: "docker-registry.bjxgj.com"
dockerfile-path: "./container/prod/Dockerfile"
docker-tags: |
stable
v2024
```
## 输入参数
| 参数名 | 描述 | 必需 | 默认值 |
| --------------------- | ------------------------- | ---- | --------------------------------- |
| `gitea-token` | Gitea 访问令牌 | ✅ | - |
| `app-env` | 应用环境 | ❌ | `production` |
| `sentry-auth-token` | Sentry 认证令牌 | ❌ | - |
| `sentry-dsn` | Sentry DSN 配置 | ❌ | - |
| `enable-sentry` | 是否启用 Sentry | ❌ | `false` |
| `release-command` | 发布命令 | ❌ | `npm run release -- --release -V` |
| `docker-registry` | Docker 仓库地址 | ❌ | `docker-registry.bjxgj.com` |
| `docker-context` | Docker 构建上下文路径 | ❌ | `.` |
| `dockerfile-path` | Dockerfile 路径 | ❌ | `./container/dev/Dockerfile` |
| `docker-tags` | 额外的 Docker 标签 | ❌ | - |
| `enable-docker-build` | 是否执行 Docker 构建 | ❌ | `true` |
| `node-debug` | 是否启用 Node.js 调试模式 | ❌ | `false` |
## 环境变量支持
Action 支持通过 `env` 传递**任意数量**的环境变量给发布命令,这些环境变量会自动传递给 `npm run release` 或其他发布命令:
```yaml
- uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
env:
# 🌍 任意环境变量都会自动传递给发布命令
APP_ENV: production
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_TOKEN }}
CUSTOM_VAR: "your-value"
BUILD_NUMBER: ${{ github.run_number }}
FEATURE_FLAG: ${{ github.ref == 'refs/heads/main' }}
# ... 更多任意变量
```
### 常用环境变量示例
| 环境变量名 | 描述 | 示例值 |
| ------------------- | ---------------- | ----------------------------- |
| `APP_ENV` | 应用环境 | `production` |
| `SENTRY_AUTH_TOKEN` | Sentry 认证令牌 | `${{ secrets.SENTRY_TOKEN }}` |
| `SENTRY_DSN` | Sentry DSN 配置 | `${{ vars.SENTRY_DSN }}` |
| `SENTRY_VITE` | 是否启用 Sentry | `true` |
| `NODE_DEBUG` | Node.js 调试模式 | `release-it:*` |
| `BUILD_NUMBER` | 构建编号 | `${{ github.run_number }}` |
## 输出参数
| 参数名 | 描述 |
| --------------------- | ------------------------ |
| `version` | 发布的版本号 |
| `version-with-dash` | 版本号(点号替换为横线) |
| `docker-image-digest` | Docker 镜像摘要 |
| `docker-image-tags` | Docker 镜像标签列表 |
## 使用场景
### 1. 基础发布流程
适用于简单的 Web 项目发布:
```yaml
steps:
- uses: actions/checkout@v4
- name: 设置环境
uses: actions/xgj/setup-env@main
with:
docker-password: ${{ secrets.DOCKER_PASSWORD }}
- name: 安装依赖
uses: actions/xgj/npm-install@main
- name: 发布项目
uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
```
### 2. 完整 CI/CD 流程
包含完整的构建、测试、发布流程:
```yaml
steps:
- uses: actions/checkout@v4
- name: 设置构建环境
uses: actions/xgj/setup-env@main
with:
docker-password: ${{ secrets.DOCKER_PASSWORD }}
kube-config: ${{ secrets.KUBE_CONFIG }}
- name: 安装依赖
uses: actions/xgj/npm-install@main
with:
package-manager: "pnpm"
- name: 运行测试
run: npm run test
- name: 发布构建
id: release
uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
app-env: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
sentry-auth-token: ${{ secrets.SENTRY_AUTH_TOKEN }}
sentry-dsn: ${{ vars.SENTRY_DSN }}
enable-sentry: "true"
dockerfile-path: "./Dockerfile"
docker-tags: |
${{ github.sha }}
${{ github.ref_name }}
- name: 部署到Kubernetes
run: |
kubectl set image deployment/web-app web-app=docker-registry.bjxgj.com/${{ github.event.repository.name }}:${{ steps.release.outputs.version }}
```
### 3. 多环境发布
支持不同环境的差异化配置:
```yaml
strategy:
matrix:
environment: [staging, production]
include:
- environment: staging
dockerfile: "./container/dev/Dockerfile"
app-env: "staging"
- environment: production
dockerfile: "./container/prod/Dockerfile"
app-env: "production"
steps:
- name: 发布到 ${{ matrix.environment }}
uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
app-env: ${{ matrix.app-env }}
dockerfile-path: ${{ matrix.dockerfile }}
docker-tags: ${{ matrix.environment }}
```
## 工作流程
1. **参数验证**: 检查必需参数和文件是否存在
2. **发布构建**: 执行 `release-it` 命令进行版本发布
3. **获取版本**: 从 `/tmp/last-version` 读取新版本号
4. **准备标签**: 生成 Docker 镜像标签列表
5. **Docker 构建**: 构建并推送 Docker 镜像(可选)
6. **发布总结**: 输出发布信息和结果
## 依赖要求
### 项目要求
- 包含 `package.json` 文件
- 配置了 `release-it` 工具
- 包含发布脚本(如 `npm run release`
- Docker 构建需要有效的 `Dockerfile`
### 环境依赖
- Node.js 环境
- npm/pnpm/yarn 包管理器
- Docker如果启用 Docker 构建)
- 配置好的 Docker 仓库访问权限
## 配置示例
### release-it 配置
确保项目中有类似的 `.release-it.js` 配置:
```javascript
module.exports = {
hooks: {
"before:release": [
"echo '${version}' > /tmp/last-version",
"npm run build",
],
},
git: {
tagName: "v${version}",
commitMessage: "chore: released version v${version} [no ci]",
},
npm: {
publish: false,
},
};
```
### Docker 多阶段构建
推荐使用多阶段构建优化镜像大小:
```dockerfile
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# 运行阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY dist ./dist
EXPOSE 3000
CMD ["npm", "start"]
```
## 错误处理
Action 会在以下情况报错并退出:
- 缺少必需的 `gitea-token` 参数
- 指定的 `Dockerfile` 不存在
- `/tmp/last-version` 文件不存在(发布命令未正确执行)
- Docker 构建失败
## 安全注意事项
- 🔒 始终通过 `secrets` 传递敏感令牌
- 🔍 定期检查和轮换访问令牌
- 📋 限制 Docker 仓库访问权限
- 🚫 避免在日志中暴露敏感信息
## 故障排除
### 常见问题
**Q: 版本文件不存在错误**
```
❌ 错误: 版本文件 /tmp/last-version 不存在
```
A: 检查 `release-it` 配置是否包含创建版本文件的 hook
```javascript
hooks: {
'before:release': ['echo \'${version}\' > /tmp/last-version']
}
```
**Q: Docker 构建失败**
A: 检查:
1. Dockerfile 路径是否正确
2. Docker 仓库是否已登录(使用 `actions/xgj/setup-env` action
3. 构建上下文是否包含必需文件
**Q: Gitea Token 权限不足**
A: 确保 token 具有以下权限:
- Repository 写权限
- Releases 创建权限
### 调试模式
启用详细调试信息:
```yaml
- uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
node-debug: "true"
```
## 更新日志
查看 [Releases](https://github.com/your-org/actions/releases) 获取详细的更新历史。
## 贡献
欢迎提交 Issue 和 Pull Request 来改进这个 Action
## 许可证
MIT License - 详见 [LICENSE](../LICENSE) 文件。