feat(ci): 优化CI/CD流程,支持feature->dev->release->main完整自动化
ci/woodpecker/manual/woodpecker Pipeline was successful

- 新增feature/**分支支持:Lint + TypeCheck + Unit Test + Smoke E2E
- 新增dev分支支持:完整测试套件(不部署)
- 优化release/**分支触发条件
- 修复归档逻辑,支持动态分支名称
- 完善测试策略分层
- 增强部署安全机制
This commit is contained in:
张翔
2026-03-28 16:05:06 +08:00
parent 51397fda0c
commit 92b702776b
+55 -28
View File
@@ -1,20 +1,36 @@
# ============================================
# Novalon Website - 全自动CI/CD工作流
# ============================================
# 发布策略:release分支发布 + main分支归档
# 发布策略:feature -> dev -> release -> main
#
# 分支角色:
# - feature分支:开发新功能
# - release分支:生产环境代码,合并后自动部署
# - main分支:稳定代码归档,只读
# 分支角色与流程
# 1. feature/** 分支:开发新功能
# - 触发:PR和push
# - 执行:Lint + TypeCheck + Smoke Test
# - 合并到:dev分支
#
# 2. dev 分支:开发集成
# - 触发:push
# - 执行:完整测试套件(不部署)
# - 创建/合并到:release/**分支
#
# 3. release/** 分支:生产环境代码
# - 触发:push
# - 执行:完整测试 + 构建 + 部署 + 归档
# - 部署到:生产环境(139.155.109.62)
# - 归档到:main分支
#
# 4. main 分支:稳定代码归档
# - 只读分支
# - 仅接收来自release的自动归档
#
# 流水线阶段:
# 1. 代码质量检查 (lint, type-check, security)
# 2. 单元测试和集成测试
# 3. E2E测试 (分层测试)
# 4. 构建Docker镜像
# 5. 部署到生产环境 (release分支)
# 6. 归档到main分支
# 4. 构建Docker镜像 (仅release分支)
# 5. 部署到生产环境 (release分支)
# 6. 归档到main分支 (仅release分支)
# 7. 通知和监控
# ============================================
@@ -27,7 +43,6 @@ variables:
# 阶段1: 代码质量检查
# ============================================
steps:
# 1.1 Lint检查
lint:
image: *node_image
environment:
@@ -39,8 +54,12 @@ steps:
event:
- push
- pull_request
branch:
- feature/**
- dev
- release
- release/**
# 1.2 类型检查
type-check:
image: *node_image
environment:
@@ -52,8 +71,12 @@ steps:
event:
- push
- pull_request
branch:
- feature/**
- dev
- release
- release/**
# 1.3 安全漏洞扫描
security-scan:
image: *node_image
environment:
@@ -65,11 +88,13 @@ steps:
event:
- push
- pull_request
branch:
- feature/**
- dev
- release
- release/**
failure: ignore
# ============================================
# 阶段2: 单元测试和集成测试
# ============================================
unit-tests:
image: *node_image
environment:
@@ -82,11 +107,15 @@ steps:
event:
- push
- pull_request
branch:
- feature/**
- dev
- release
- release/**
# ============================================
# 阶段3: E2E测试 (分层测试)
# ============================================
# 3.1 Smoke测试 (PR快速验证)
e2e-smoke:
image: mcr.microsoft.com/playwright:v1.48.0-jammy
environment:
@@ -99,9 +128,11 @@ steps:
- npm run test:smoke
when:
event:
- push
- pull_request
branch:
- feature/**
# 3.2 标准测试 (release分支)
e2e-standard:
image: mcr.microsoft.com/playwright:v1.48.0-jammy
environment:
@@ -116,10 +147,10 @@ steps:
event:
- push
branch:
- dev
- release
- release/**
# 3.3 深度测试 (release分支)
e2e-deep:
image: mcr.microsoft.com/playwright:v1.48.0-jammy
environment:
@@ -137,7 +168,6 @@ steps:
- release
- release/**
# 3.4 性能测试 (release分支)
e2e-performance:
image: mcr.microsoft.com/playwright:v1.48.0-jammy
environment:
@@ -155,7 +185,6 @@ steps:
- release
- release/**
# 3.5 可访问性测试 (release分支)
e2e-accessibility:
image: mcr.microsoft.com/playwright:v1.48.0-jammy
environment:
@@ -173,7 +202,6 @@ steps:
- release
- release/**
# 3.6 视觉回归测试 (release分支)
e2e-visual:
image: mcr.microsoft.com/playwright:v1.48.0-jammy
environment:
@@ -336,22 +364,21 @@ steps:
git config --global user.email "ci@novalon.cn"
git config --global user.name "Woodpecker CI"
# 使用SSH而不是HTTPS+Token
git remote set-url origin git@git.f.novalon.cn:novalon/novalon-website.git
# 拉取最新代码
git fetch origin
CURRENT_BRANCH="${CI_COMMIT_BRANCH}"
echo "Current branch: $CURRENT_BRANCH"
git checkout main
git pull origin main
# 合并release分支
git merge release --no-ff -m "chore: 归档release ${CI_COMMIT_SHA:0:7}"
git merge "$CURRENT_BRANCH" --no-ff -m "chore: 归档${CURRENT_BRANCH} ${CI_COMMIT_SHA:0:7}"
# 创建版本标签
VERSION_TAG="v$(date +%Y.%m.%d)-${CI_COMMIT_SHA:0:7}"
git tag -a "$VERSION_TAG" -m "Release $(date +%Y-%m-%d)"
git tag -a "$VERSION_TAG" -m "Release $(date +%Y-%m-%d) from ${CURRENT_BRANCH}"
# 推送到远程(带重试)
for i in {1..3}; do
if git push origin main && git push origin --tags; then
echo "✅ Archive succeeded! Version: $VERSION_TAG"
@@ -363,7 +390,7 @@ steps:
echo "⚠️ Archive failed, but deployment succeeded"
echo "Manual archive may be needed"
exit 0 # 不阻止部署成功
exit 0
when:
event:
- push