Files
xgj/release-web

Web 项目发布构建 Action

GitHub

自动化 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 }}

工作流程

  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 配置:

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: 检查:

  1. Dockerfile 路径是否正确
  2. Docker 仓库是否已登录(使用 actions/xgj/setup-env action
  3. 构建上下文是否包含必需文件

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 文件。