How to implement CI/CD for micro-frontend architecture?
答案:
微前端架构的CI/CD实现需要处理多个独立应用的协调部署、版本管理、集成测试等复杂场景,构建支持团队自治和技术多样化的部署体系。
微前端CI/CD架构模式:
1. 独立部署模式(Independent Deployment):
micro_app_pipeline:
trigger:
- push: ["apps/user-management/**"]
stages:
- build_and_test:
script: |
cd apps/user-management
npm install && npm test
npm run build
- deploy:
script: |
upload_to_cdn user-management $VERSION
update_module_registry user-management $VERSION
2. 协调部署模式(Orchestrated Deployment):
const moduleRegistry = {
"user-management": {
version: "1.2.3",
url: "https://cdn.example.com/user-management/1.2.3/",
teams: ["user-team"],
dependencies: []
},
"order-system": {
version: "2.1.0",
url: "https://cdn.example.com/order-system/2.1.0/",
teams: ["order-team"],
dependencies: ["[email protected]"]
}
};
版本管理策略:
语义化版本控制:
{
"name": "@company/user-management",
"version": "1.2.3",
"microfrontend": {
"exposed": {
"./UserProfile": "./src/UserProfile",
"./UserList": "./src/UserList"
},
"shared": {
"react": "^18.0.0",
"react-dom": "^18.0.0"
}
}
}
依赖管理:
dependency_check:
script: |
check_shared_dependencies
validate_peer_dependencies
generate_dependency_graph
构建和打包策略:
Module Federation构建:
const ModuleFederationPlugin = require('@module-federation/webpack');
module.exports = {
plugins: [
new ModuleFederationPlugin({
name: 'userManagement',
filename: 'remoteEntry.js',
exposes: {
'./UserProfile': './src/components/UserProfile',
'./UserList': './src/components/UserList'
},
shared: {
react: { singleton: true, eager: true },
'react-dom': { singleton: true, eager: true }
}
})
]
};
独立构建优化:
FROM node:18-alpine AS base
WORKDIR /app
COPY package*.json ./
RUN npm ci
FROM base AS user-app
COPY apps/user-management ./
RUN npm run build
FROM base AS order-app
COPY apps/order-system ./
RUN npm run build
FROM nginx:alpine
COPY --from=user-app /app/dist /usr/share/nginx/html/user-management
COPY --from=order-app /app/dist /usr/share/nginx/html/order-system
集成测试策略:
契约测试:
describe('User Service Contract', () => {
it('should provide user data in expected format', () => {
return provider
.given('user exists')
.uponReceiving('get user request')
.withRequest({
method: 'GET',
path: '/api/user/123'
})
.willRespondWith({
status: 200,
body: { id: 123, name: 'John Doe' }
});
});
});
端到端集成测试:
e2e_integration:
script: |
# 部署所有微前端到测试环境
deploy_all_microfrontends_to_staging
# 运行跨应用集成测试
npm run test:e2e:integration
# 验证模块间通信
npm run test:module-communication
部署编排策略:
渐进式部署:
progressive_deployment:
stages:
- deploy_core_shell:
script: deploy_main_app $MAIN_VERSION
- deploy_microfrontends:
parallel:
- deploy_microapp user-management $USER_VERSION
- deploy_microapp order-system $ORDER_VERSION
- deploy_microapp analytics $ANALYTICS_VERSION
- integration_verification:
script: verify_all_modules_loaded
蓝绿部署适配:
const deploymentStrategy = {
type: 'blue-green',
modules: {
'user-management': {
blue: 'v1.2.3',
green: 'v1.3.0'
},
'order-system': {
blue: 'v2.1.0',
green: 'v2.1.0'
}
}
};
监控和可观测性:
模块级监控:
const moduleMetrics = {
loadTime: performance.mark('module-load-end') - performance.mark('module-load-start'),
errorRate: errorCount / totalRequests,
bundleSize: getBundleSize('user-management'),
dependencies: getLoadedDependencies()
};
集成监控:
monitoring:
module_health:
- name: "module_load_success"
query: "sum(module_load_success_total) by (module_name)"
- name: "cross_module_communication"
query: "sum(module_communication_errors_total)"
回滚策略:
模块级回滚:
rollback_microfront user-management --to-version=1.2.2
verify_module_compatibility user-management 1.2.2
级联影响分析:
const rollbackImpact = {
targetModule: 'user-management',
fromVersion: '1.3.0',
toVersion: '1.2.3',
affectedModules: ['analytics', 'notification'],
compatibilityCheck: 'passed'
};
最佳实践:
- 建立清晰的模块边界和接口契约
- 实现细粒度的部署和回滚机制
- 强化跨模块集成测试
- 建立统一的监控和告警体系
- 制定模块升级和废弃策略