sync-env
SKILL.md
Sync Environment Skill
将 CI 环境的 Kubernetes kustomization 配置同步到 Staging,可选同步到 Production。 适用于 simplex-gitops 仓库。
Triggers: "sync ci to staging", "sync to staging", "sync to prod", "promote to production", "同步ci到staging", "同步到生产", "sync configs", "promote images"
Promotion Path
CI (aws-ci)
↓ 默认:同步到 staging
Staging (aws-staging)
↓ 可选:同步到 production(需明确指定 --target prod 或 --target all)
Production (aws-prod)
⚠️ 部署策略
| 环境 | 策略 | 说明 |
|---|---|---|
| Staging | 可自动同步 | 推送后 ArgoCD 可自动检测并同步 |
| Production | 必须手动 | 推送后需用户手动触发 ArgoCD sync |
永远不要自动执行 argocd app sync simplex-aws-prod。
环境差异白名单(不同步)
以下配置项在各环境间预期不同,同步时必须跳过:
| 白名单项 | CI | Staging | Prod | 原因 |
|---|---|---|---|---|
database.default.link |
CI RDS | Staging RDS | Prod RDS | 各环境独立数据库 |
redis.default.address |
k8s-ci |
k8s-staging |
k8s-prod |
各环境独立 MemoryDB |
mongodb.default.uri |
CI DocDB | Staging DocDB | Prod DocDB | 各环境独立 DocumentDB |
rabbitmq.default.url |
CI MQ | Staging MQ | Prod MQ | 各环境独立 MQ broker |
stripe.publishableKey |
pk_test_* |
pk_live_* |
pk_live_* |
CI 用测试密钥 |
stripe.secretKey |
sk_test_* |
sk_live_* |
sk_live_* |
CI 用测试密钥 |
stripe.webhookSecret |
CI endpoint | Staging endpoint | Prod endpoint | 各环境独立 webhook |
payment.*.stripePriceId |
test Price ID | live Price ID | live Price ID | 不同 Stripe 账户 |
campaign.sendEmails.redirectEnabled |
true |
false |
false |
CI 安全重定向 |
kubernetes/scripts/compare-configs.py已内置此白名单,diff 时自动标记为 "expected"。
文件位置
kubernetes/overlays/aws-ci/kustomization.yaml # CI 配置
kubernetes/overlays/aws-staging/kustomization.yaml # Staging 配置
kubernetes/overlays/aws-prod/kustomization.yaml # Production 配置
kubernetes/overlays/aws-ci/configs/ # CI 服务配置文件
kubernetes/overlays/aws-staging/configs/ # Staging 服务配置文件
kubernetes/overlays/aws-prod/configs/ # Production 服务配置文件
快速命令
查看 YAML 配置差异(推荐,支持白名单)
cd kubernetes
# 对比 simplex-api 配置(默认,只显示差异)
make config-diff
# 对比指定服务
make config-diff SVC=simplex-gateway
make config-diff SVC=simplex-router-backend
# 显示白名单项详情
python3 scripts/compare-configs.py --diff-only --show-expected
# JSON 格式输出
python3 scripts/compare-configs.py --json --diff-only
# 列出所有可对比的服务
make list-services
查看镜像差异
# CI vs Staging(默认)
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --diff
# CI vs Production
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --diff --target prod
# Staging vs Production
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --diff --target prod --source staging
查看配置差异(patches/目录级别)
# 比较所有配置(CI vs Staging)
python3 ~/.cursor/skills/sync-env/scripts/compare_configs.py
# 详细差异(包含文件内容变更)
python3 ~/.cursor/skills/sync-env/scripts/compare_configs.py --detailed
# 只显示安全可同步的配置(排除 secrets, ingress)
python3 ~/.cursor/skills/sync-env/scripts/compare_configs.py --detailed --safe-only
# 比较特定文件
python3 ~/.cursor/skills/sync-env/scripts/compare_configs.py --file anotherme-agent-env-configmap.yaml --detailed
同步镜像
# 同步特定服务到 staging(默认)
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --images front,anotherme-agent
# 同步所有镜像到 staging(先 dry-run)
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --all --dry-run
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --all
# 同步到 production
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --all --target prod --dry-run
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --all --target prod
# 同时同步到 staging 和 production
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --all --target all --dry-run
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --all --target all
同步工作流
Step 0:全面对比(必须)
cd kubernetes
# 查看 3 环境配置差异(自动应用白名单)
python3 scripts/compare-configs.py --diff-only
# 如果有 "需要关注的差异项"(红色),说明有业务配置不一致
# 如果只有 "白名单内预期不同"(蓝色),说明已同步完毕
# 查看镜像差异
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --diff
# 查看配置差异(仅安全可审查的)
python3 ~/.cursor/skills/sync-env/scripts/compare_configs.py --detailed --safe-only
Step 1:确认同步范围
基于 Step 0 的输出,确认哪些差异需要同步。
典型的可同步项(业务功能):
- 邮件模板 ID(
resend.welcomeTemplateId等) - 积分费率(
credit.rates.*,credit.signalRates.*) - 新用户赠送(
credit.newUserGrant,credit.newUserGrantWithInvite) - 套餐结构(
payment.plans[]结构、金额、描述、并发数) - RabbitMQ 队列定义(
rabbitmq.default.queues.*新队列) - Worker 并发(
worker.concurrency)
不可同步项: 见上方白名单表格。
Step 2:审查并选择服务
# 推广单个关键服务
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --images front --dry-run
# 推广前端服务
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --images front,front-homepage --dry-run
# 推广所有 AI 服务
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --images anotherme-agent,anotherme-api,anotherme-search,anotherme-worker --dry-run
# 推广所有内容
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --all --dry-run
Step 3:应用变更
审查 dry-run 输出后,应用变更:
# 只同步到 staging(默认)
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --images <services>
# 同步到 production
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --images <services> --target prod
# 同时同步到 staging 和 production
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --images <services> --target all
Step 4:手动同步配置(如果需要)
方式 A: 手动编辑 configs/ 下的 YAML 文件(推荐)
# 打开文件对比编辑
# CI (源): kubernetes/overlays/aws-ci/configs/simplex-api/config.yaml
# Staging: kubernetes/overlays/aws-staging/configs/simplex-api/config.yaml
# Prod: kubernetes/overlays/aws-prod/configs/simplex-api/config.yaml
注意事项:
- 复制业务逻辑配置时,保持目标文件的白名单值不变
stripePriceId: Staging/Prod 使用各自的 live Price ID,不要覆盖- 新增的 pro 套餐需要先在 Stripe Live Dashboard 创建对应 Price
方式 B: 手动同步 ConfigMap Patches
# 1. 查看详细差异
python3 ~/.cursor/skills/sync-env/scripts/compare_configs.py \
--file anotherme-agent-env-configmap.yaml --detailed
# 2. 手动编辑特定键(推荐)
vim kubernetes/overlays/aws-staging/patches/anotherme-agent-env-configmap.yaml
# 3. 验证变更
git diff kubernetes/overlays/aws-staging/patches/
Step 5:提交并推送
cd /path/to/simplex-gitops
# 只同步了 staging
git add kubernetes/overlays/aws-staging/
git commit -m "chore: 从 CI 推广 <services> 到 staging"
git push
# 同时同步了 staging 和 prod
git add kubernetes/overlays/aws-staging/ kubernetes/overlays/aws-prod/
git commit -m "chore: sync CI business configs to staging and production
Synced: <列出同步的配置项>
Whitelisted (not synced): infra connections, stripe keys, stripePriceId, campaign.redirectEnabled"
git push
Step 6:部署
Staging(可自动):
argocd app get simplex-aws-staging
argocd app diff simplex-aws-staging
# 如需手动同步:
argocd app sync simplex-aws-staging
Production(必须手动确认):
# 查看变更(只读,安全)
argocd app get simplex-aws-prod
argocd app diff simplex-aws-prod
# ⛔ 用户明确要求后才执行
argocd app sync simplex-aws-prod
可能需要同步的配置部分
自动配置差异检测
compare_configs.py 脚本自动识别以下内容的差异:
| 类别 | 示例 | 同步建议 |
|---|---|---|
| ✅ 安全可审查 | *-env-configmap.yaml |
仔细审查,可能需要选择性同步 |
| 🔐 Secrets | *-secrets.yaml |
永不同步 - 环境特定 |
| 🌐 Ingress | ingress.yaml |
永不同步 - 域名不同 |
| ⚙️ 基础设施 | gateway-cm0-*, router-cm0-*, api-cm0-* |
通常是环境特定的 |
不应同步的配置
| 配置 | 原因 |
|---|---|
| 副本数 | CI 运行更少的副本,Staging/Prod 使用 base 默认值 |
| 节点池分配 | CI: ci/singleton-ci, Staging: staging/singleton-staging, Prod: production/singleton-production |
| 存储类 | Prod 使用 gp3, Staging 使用 ebs-gp3-auto |
| 高可用设置 | Prod 有 topologySpreadConstraints、terminationGracePeriodSeconds: 60 |
同步后验证
检查 ArgoCD 状态(只读,安全)
# Staging
argocd app get simplex-aws-staging
argocd app diff simplex-aws-staging
# Production
argocd app get simplex-aws-prod
argocd app diff simplex-aws-prod
手动同步(用户必须明确请求)
# Staging
argocd app sync simplex-aws-staging
# ⛔ Production - 仅在用户明确要求时执行
argocd app sync simplex-aws-prod
检查部署的版本
# CI namespace
k1 get pods -n ci -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\n"}{end}'
# Staging namespace
k2 get pods -n staging -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\n"}{end}'
# Production namespace
k1 get pods -n production -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\n"}{end}'
验证清单
kubectl kustomize kubernetes/overlays/aws-ci > /tmp/ci-manifests.yaml
kubectl kustomize kubernetes/overlays/aws-staging > /tmp/staging-manifests.yaml
kubectl kustomize kubernetes/overlays/aws-prod > /tmp/prod-manifests.yaml
diff /tmp/ci-manifests.yaml /tmp/staging-manifests.yaml
diff /tmp/staging-manifests.yaml /tmp/prod-manifests.yaml
常用 Make 命令
cd kubernetes
# 对比所有服务配置
make config-diff # simplex-api(默认)
make config-diff SVC=simplex-gateway
make config-diff SVC=simplex-router-backend
make list-services # 列出所有可对比的服务
# 镜像版本对比
make compare-images # 快速 bash 对比
make compare-images-detail # 详细 Python 对比
配置文件映射
| 服务 | CI 配置路径 | Staging 配置路径 | Prod 配置路径 |
|---|---|---|---|
| simplex-api | overlays/aws-ci/configs/simplex-api/config.yaml |
overlays/aws-staging/configs/simplex-api/config.yaml |
overlays/aws-prod/configs/simplex-api/config.yaml |
| simplex-gateway | overlays/aws-ci/configs/gateway/config.yaml |
overlays/aws-staging/configs/gateway/config.yaml |
overlays/aws-prod/configs/gateway/config.yaml |
| simplex-router-backend | overlays/aws-ci/configs/simplex-router-backend/config-backend.yaml |
overlays/aws-staging/configs/simplex-router-backend/config-backend.yaml |
overlays/aws-prod/configs/simplex-router-backend/config-backend.yaml |
故障排除
脚本未找到仓库
确保你在 simplex-gitops 目录中或明确设置路径:
cd /path/to/simplex-gitops
python3 ~/.cursor/skills/sync-env/scripts/sync_images.py --diff
CI 中未找到镜像
服务可能使用不同的镜像名称格式(Aliyun vs ECR)。检查 kustomization 文件中的两种格式。
ArgoCD 未同步
# 查看应用状态(只读)
argocd app get simplex-aws-staging --show-operation
argocd app get simplex-aws-prod --show-operation
# 刷新应用检测最新变更(只读,安全)
argocd app refresh simplex-aws-staging
argocd app refresh simplex-aws-prod
# 手动同步 - staging
argocd app sync simplex-aws-staging
# ⛔ 手动同步 production - 仅在用户明确要求时执行
argocd app sync simplex-aws-prod
服务类别参考
| 类别 | 服务 |
|---|---|
| AI 核心 | anotherme-agent, anotherme-api, anotherme-search, anotherme-worker |
| 前端 | front, front-homepage |
| 后端 | simplex-cron, simplex-gateway-api, simplex-gateway-worker |
| 数据 | data-search-api, crawler |
| 基础设施 | litellm, node-server, simplex-router, simplex-router-backend, simplex-router-fronted |
Weekly Installs
1
Repository
oldwinter/skillsGitHub Stars
1
First Seen
2 days ago
Security Audits
Installed on
mcpjam1
github-copilot1
junie1
windsurf1
zencoder1
crush1