feat: 添加 Web 项目发布构建的 GitHub Action,包括版本发布、Docker 镜像构建和推送,支持灵活的输入参数和环境变量配置,优化 CI/CD 流程。

This commit is contained in:
Lyda
2025-08-20 17:12:59 +08:00
parent d13a6b9f38
commit 3144b5c203
8 changed files with 1130 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
name: "基础发布流程"
on:
push:
branches:
- main
workflow_dispatch:
jobs:
release:
runs-on: ubuntu-latest
name: "发布Web项目"
steps:
- name: 检出代码
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITEA_TOKEN }}
- name: 设置构建环境
uses: actions/xgj/setup-env@main
with:
docker-password: ${{ secrets.DOCKER_PASSWORD }}
skip-kubectl: "true"
- name: 安装依赖
uses: actions/xgj/npm-install@main
with:
package-manager: "npm"
- name: 发布构建
id: release
uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
app-env: "production"
- name: 发布结果
run: |
echo "✅ 发布完成!"
echo "📦 版本: ${{ steps.release.outputs.version }}"
echo "🐳 Docker镜像已推送到仓库"

View File

@@ -0,0 +1,64 @@
name: "自定义Docker标签发布"
on:
push:
branches:
- main
- develop
workflow_dispatch:
inputs:
custom_tag:
description: "自定义Docker标签"
required: false
default: "manual"
jobs:
release:
runs-on: ubuntu-latest
name: "发布项目(自定义标签)"
steps:
- name: 检出代码
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITEA_TOKEN }}
- name: 设置构建环境
uses: actions/xgj/setup-env@main
with:
docker-password: ${{ secrets.DOCKER_PASSWORD }}
skip-kubectl: "true"
- name: 安装依赖
uses: actions/xgj/npm-install@main
with:
package-manager: "pnpm"
- 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"
docker-tags: |
${{ github.sha }}
${{ github.ref_name }}
${{ github.event.inputs.custom_tag || 'auto' }}
stable
${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
- name: 显示所有Docker标签
run: |
echo "🏷️ 生成的Docker标签包括"
echo " - latest默认"
echo " - prod默认"
echo " - ${{ steps.release.outputs.version }}(版本标签,保留)"
echo " - ${{ github.sha }}(提交哈希)"
echo " - ${{ github.ref_name }}(分支名)"
echo " - ${{ github.event.inputs.custom_tag || 'auto' }}(自定义标签)"
echo " - stable稳定版本"
echo " - ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}(环境标签)"

View File

@@ -0,0 +1,83 @@
name: "环境变量配置示例"
on:
push:
branches:
- main
workflow_dispatch:
jobs:
release-with-env:
runs-on: ubuntu-latest
name: "使用环境变量配置发布"
steps:
- name: 检出代码
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITEA_TOKEN }}
- name: 设置构建环境
uses: actions/xgj/setup-env@main
with:
docker-password: ${{ secrets.DOCKER_PASSWORD }}
skip-kubectl: "true"
- name: 安装依赖
uses: actions/xgj/npm-install@main
with:
package-manager: "npm"
- name: 发布构建(环境变量配置)
id: release
uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
env:
# 🌍 任意数量的环境变量都会自动传递给 release-it 命令
APP_ENV: "production"
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_DSN: ${{ vars.SENTRY_DSN }}
SENTRY_VITE: "true"
# 自定义环境变量示例
BUILD_NUMBER: ${{ github.run_number }}
BRANCH_NAME: ${{ github.ref_name }}
COMMIT_SHA: ${{ github.sha }}
# release-it 相关的环境变量
RELEASE_VERSION_TYPE: "patch"
CHANGELOG_PRESET: "conventionalcommits"
# 其他可能需要的环境变量
CI: "true"
NODE_ENV: "production"
- name: 多环境配置示例
uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
docker-tags: |
env-example
${{ github.ref_name }}
env:
# 🎯 根据分支设置不同的环境变量
APP_ENV: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
SENTRY_VITE: ${{ github.ref == 'refs/heads/main' && 'true' || 'false' }}
# 动态环境变量
DEPLOY_TARGET: ${{ github.ref == 'refs/heads/main' && 'prod' || 'dev' }}
FEATURE_FLAG_NEW_UI: ${{ contains(github.event.head_commit.message, '[enable-new-ui]') && 'true' || 'false' }}
- name: 发布结果
run: |
echo "🎉 发布完成!"
echo "📦 版本: ${{ steps.release.outputs.version }}"
echo ""
echo "✨ 环境变量的优势:"
echo " 🌍 可以传递任意数量的环境变量"
echo " 🔄 支持动态配置"
echo " 🎯 基于条件设置不同值"
echo " 🔧 release-it 和构建脚本可直接使用"
echo " 📋 不需要修改 action 代码"

View File

@@ -0,0 +1,111 @@
name: "完整CI/CD流程"
on:
push:
branches:
- main
- develop
pull_request:
branches:
- main
env:
REGISTRY: docker-registry.bjxgj.com
NODE_VERSION: "18"
jobs:
test:
runs-on: ubuntu-latest
name: "代码测试"
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置Node.js环境
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: 安装依赖
uses: actions/xgj/npm-install@main
with:
package-manager: "npm"
- name: 代码检查
run: |
npm run lint
npm run type-check
- name: 运行测试
run: npm run test:ci
- name: 构建项目
run: npm run build
release:
runs-on: ubuntu-latest
name: "发布构建"
needs: test
if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop')
steps:
- name: 检出代码
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITEA_TOKEN }}
- name: 设置构建环境
uses: actions/xgj/setup-env@main
with:
docker-registry: ${{ env.REGISTRY }}
docker-password: ${{ secrets.DOCKER_PASSWORD }}
kube-config: ${{ secrets.KUBE_CONFIG }}
- name: 安装依赖
uses: actions/xgj/npm-install@main
with:
package-manager: "npm"
cache-prefix: "release"
- name: 发布构建
id: release
uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
app-env: ${{ github.ref == 'refs/heads/main' && 'production' || 'develop' }}
sentry-auth-token: ${{ secrets.SENTRY_AUTH_TOKEN }}
sentry-dsn: ${{ vars.SENTRY_DSN }}
enable-sentry: ${{ github.ref == 'refs/heads/main' && 'true' || 'false' }}
docker-registry: ${{ env.REGISTRY }}
dockerfile-path: "./Dockerfile"
docker-tags: |
${{ github.sha }}
${{ github.ref_name }}
${{ github.ref == 'refs/heads/main' && 'stable' || 'unstable' }}
- name: 部署到Kubernetes (生产环境)
if: github.ref == 'refs/heads/main'
run: |
echo "🚀 部署到生产环境..."
kubectl set image deployment/web-app \
web-app=${{ env.REGISTRY }}/${{ github.event.repository.name }}:${{ steps.release.outputs.version }} \
-n production
kubectl rollout status deployment/web-app -n production
- name: 部署到Kubernetes (开发环境)
if: github.ref == 'refs/heads/develop'
run: |
echo "🧪 部署到开发环境..."
kubectl set image deployment/web-app-dev \
web-app=${{ env.REGISTRY }}/${{ github.event.repository.name }}:${{ steps.release.outputs.version }} \
-n development
kubectl rollout status deployment/web-app-dev -n development
- name: 通知发布结果
run: |
echo "🎉 发布完成!"
echo "📦 版本: ${{ steps.release.outputs.version }}"
echo "🌍 环境: ${{ github.ref == 'refs/heads/main' && '生产环境' || '开发环境' }}"
echo "🐳 Docker镜像: ${{ env.REGISTRY }}/${{ github.event.repository.name }}:${{ steps.release.outputs.version }}"

View File

@@ -0,0 +1,151 @@
name: "多环境发布"
on:
workflow_dispatch:
inputs:
environment:
description: "部署环境"
required: true
default: "staging"
type: choice
options:
- staging
- production
- testing
version_type:
description: "版本类型"
required: true
default: "patch"
type: choice
options:
- patch
- minor
- major
custom_tags:
description: "自定义Docker标签每行一个"
required: false
default: ""
jobs:
release:
runs-on: ubuntu-latest
name: "发布到 ${{ github.event.inputs.environment }} 环境"
strategy:
matrix:
include:
- environment: staging
dockerfile: "./container/dev/Dockerfile"
app_env: "staging"
registry: "docker-registry.bjxgj.com"
namespace: "staging"
- environment: production
dockerfile: "./container/prod/Dockerfile"
app_env: "production"
registry: "docker-registry.bjxgj.com"
namespace: "production"
- environment: testing
dockerfile: "./container/test/Dockerfile"
app_env: "testing"
registry: "docker-registry.bjxgj.com"
namespace: "testing"
steps:
- name: 检出代码
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITEA_TOKEN }}
- name: 设置构建环境
uses: actions/xgj/setup-env@main
with:
docker-registry: ${{ matrix.registry }}
docker-password: ${{ secrets.DOCKER_PASSWORD }}
kube-config: ${{ secrets.KUBE_CONFIG }}
- name: 安装依赖
uses: actions/xgj/npm-install@main
with:
package-manager: "pnpm"
- name: 准备环境特定的标签
id: env_tags
run: |
ENVIRONMENT="${{ github.event.inputs.environment }}"
VERSION_TYPE="${{ github.event.inputs.version_type }}"
CUSTOM_TAGS="${{ github.event.inputs.custom_tags }}"
# 基础标签
TAGS="${ENVIRONMENT}"
TAGS="${TAGS}\n${ENVIRONMENT}-${VERSION_TYPE}"
TAGS="${TAGS}\n$(date +%Y%m%d)-${ENVIRONMENT}"
# 添加自定义标签
if [[ -n "$CUSTOM_TAGS" ]]; then
while IFS= read -r tag; do
if [[ -n "$tag" ]]; then
TAGS="${TAGS}\n${tag}-${ENVIRONMENT}"
fi
done <<< "$CUSTOM_TAGS"
fi
{
echo "tags<<EOF"
echo -e "$TAGS"
echo "EOF"
} >> $GITHUB_OUTPUT
echo "🏷️ 环境特定标签:"
echo -e "$TAGS" | sed 's/^/ - /'
- name: 发布构建
id: release
uses: actions/xgj/release-web@main
with:
gitea-token: ${{ secrets.GITEA_TOKEN }}
app-env: ${{ matrix.app_env }}
sentry-auth-token: ${{ secrets.SENTRY_AUTH_TOKEN }}
sentry-dsn: ${{ vars.SENTRY_DSN }}
enable-sentry: ${{ matrix.environment == 'production' && 'true' || 'false' }}
docker-registry: ${{ matrix.registry }}
dockerfile-path: ${{ matrix.dockerfile }}
release-command: "npm run release -- --release -V --increment ${{ github.event.inputs.version_type }}"
docker-tags: ${{ steps.env_tags.outputs.tags }}
- name: 部署到Kubernetes
run: |
ENVIRONMENT="${{ github.event.inputs.environment }}"
VERSION="${{ steps.release.outputs.version }}"
NAMESPACE="${{ matrix.namespace }}"
IMAGE="${{ matrix.registry }}/${{ github.event.repository.name }}:${VERSION}"
echo "🚀 部署到 ${ENVIRONMENT} 环境..."
echo "📦 版本: ${VERSION}"
echo "🐳 镜像: ${IMAGE}"
echo "📍 命名空间: ${NAMESPACE}"
kubectl set image deployment/web-app \
web-app=${IMAGE} \
-n ${NAMESPACE}
kubectl rollout status deployment/web-app -n ${NAMESPACE}
echo "✅ 部署完成!"
- name: 发布总结
run: |
echo "🎉 多环境发布完成!"
echo ""
echo "📋 发布信息:"
echo " - 环境: ${{ github.event.inputs.environment }}"
echo " - 版本: ${{ steps.release.outputs.version }}"
echo " - 版本类型: ${{ github.event.inputs.version_type }}"
echo " - Docker仓库: ${{ matrix.registry }}"
echo " - Kubernetes命名空间: ${{ matrix.namespace }}"
echo ""
echo "🏷️ 主要标签:"
echo " - latest默认"
echo " - prod默认"
echo " - ${{ steps.release.outputs.version }}(版本标签)"
echo " - ${{ github.event.inputs.environment }}(环境标签)"