mirror of
https://git.bjxgj.com/xgj/xgj-actions.git
synced 2025-10-14 06:33:37 +08:00
9.8 KiB
9.8 KiB
Web 项目发布构建 Action
自动化 Web 项目发布流程的 GitHub Action,包括版本发布、Docker 镜像构建和推送等完整的 CI/CD 流程。
功能特性
- 🚀 自动化发布: 支持
release-it
工具进行版本管理和发布 - 🐳 Docker 集成: 自动构建和推送 Docker 镜像到私有仓库
- 🏷️ 灵活标签: 支持自定义 Docker 标签,自动生成版本标签
- 📊 Sentry 集成: 可选的 Sentry 错误监控集成
- 🔧 高度可配置: 丰富的输入参数满足不同项目需求
- ✅ 参数验证: 自动验证必需参数和文件存在性
快速开始
基础用法
- name: 发布Web项目
uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
使用环境变量
- 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' }}
# ... 更多任意环境变量
完整示例
- 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
或其他发布命令:
- 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 项目发布:
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 流程
包含完整的构建、测试、发布流程:
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. 多环境发布
支持不同环境的差异化配置:
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 }}
工作流程
- 参数验证: 检查必需参数和文件是否存在
- 发布构建: 执行
release-it
命令进行版本发布 - 获取版本: 从
/tmp/last-version
读取新版本号 - 准备标签: 生成 Docker 镜像标签列表
- Docker 构建: 构建并推送 Docker 镜像(可选)
- 发布总结: 输出发布信息和结果
依赖要求
项目要求
- 包含
package.json
文件 - 配置了
release-it
工具 - 包含发布脚本(如
npm run release
) - Docker 构建需要有效的
Dockerfile
环境依赖
- Node.js 环境
- npm/pnpm/yarn 包管理器
- Docker(如果启用 Docker 构建)
- 配置好的 Docker 仓库访问权限
配置示例
release-it 配置
确保项目中有类似的 .release-it.js
配置:
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 多阶段构建
推荐使用多阶段构建优化镜像大小:
# 构建阶段
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:
hooks: {
'before:release': ['echo \'${version}\' > /tmp/last-version']
}
Q: Docker 构建失败
A: 检查:
- Dockerfile 路径是否正确
- Docker 仓库是否已登录(使用
actions/xgj/setup-env
action) - 构建上下文是否包含必需文件
Q: Gitea Token 权限不足
A: 确保 token 具有以下权限:
- Repository 写权限
- Releases 创建权限
调试模式
启用详细调试信息:
- uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
node-debug: "true"
更新日志
查看 Releases 获取详细的更新历史。
贡献
欢迎提交 Issue 和 Pull Request 来改进这个 Action!
许可证
MIT License - 详见 LICENSE 文件。