sync-ci-to-staging-prod
npx skills add https://github.com/oldwinter/skills --skill sync-ci-to-staging-prod
Agent 安装分布
Skill 文档
Sync CI to Staging + Production Skill
æ¤ skill å° CI ç¯å¢çä¸å¡åè½é ç½®ä¸æ¬¡æ§åæ¥å° Staging å Production 两个ç¯å¢ã éç¨äº CI ä¸éªè¯éè¿çæ°åè½é ç½®éè¦åæ¶æ¨å¹¿å° Staging å Prod çåºæ¯ã
Triggers: “sync ci to staging and prod”, “sync configs to all envs”, “promote ci config”, “忥cié ç½®å°stagingåprod”
â ï¸ å ³é®åå
- åªåæ¥ä¸å¡åè½é ç½®ï¼feature flagsã积åè´¹çãå¥é¤ç»æãéåå®ä¹ãé®ä»¶æ¨¡æ¿çï¼
- ç½ååå çé 置永è¿ä¸åæ¥ï¼åºç¡è®¾æ½è¿æ¥ãStripe åæ®ãå®å ¨å¼å ³çï¼
- Staging å¯èªå¨åï¼Production å¿ é¡»æå¨ç¡®è®¤ ArgoCD sync
ç¯å¢å·®å¼ç½ååï¼ä¸åæ¥ï¼
以ä¸é 置项å¨åç¯å¢é´é¢æä¸åï¼åæ¥æ¶å¿ 须跳è¿ï¼
| ç½åå项 | 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å·²å ç½®æ¤ç½ååã
工使µ
Step 0: å ¨é¢å¯¹æ¯ï¼å¿ é¡»ï¼
cd kubernetes
# æ¥ç 3 ç¯å¢é
置差å¼ï¼èªå¨åºç¨ç½ååï¼
python3 scripts/compare-configs.py --diff-only
# 妿æ "éè¦å
³æ³¨çå·®å¼é¡¹"ï¼çº¢è²ï¼ï¼è¯´ææä¸å¡é
ç½®ä¸ä¸è´ï¼éè¦åæ¥
# å¦æåªæ "ç½ååå
颿ä¸å"ï¼èè²ï¼ï¼è¯´æå·²åæ¥å®æ¯
# æ¥çç½åå项详æ
ï¼å¯éï¼
python3 scripts/compare-configs.py --diff-only --show-expected
# 对æ¯å
¶ä»æå¡
python3 scripts/compare-configs.py -s simplex-gateway --diff-only
python3 scripts/compare-configs.py -s simplex-router-backend --diff-only
Step 1: ç¡®è®¤åæ¥èå´
åºäº Step 0 çè¾åºï¼ç¡®è®¤åªäºå·®å¼éè¦ä» CI åæ¥å° Staging/Prodã
å ¸åçå¯åæ¥é¡¹ï¼ä¸å¡åè½ï¼ï¼
- é®ä»¶æ¨¡æ¿ IDï¼
resend.welcomeTemplateId,resend.verificationCodeTemplateIdçï¼ - é®ä»¶åé人ï¼
resend.fromï¼ - 积åè´¹çï¼
credit.rates.*,credit.signalRates.*ï¼ - æ°ç¨æ·èµ éï¼
credit.newUserGrant,credit.newUserGrantWithInviteï¼ - å¥é¤ç»æï¼
payment.plans[]ç»æãéé¢ãæè¿°ãå¹¶åæ°ï¼ - RabbitMQ éåå®ä¹ï¼
rabbitmq.default.queues.*æ°éåï¼ - Worker å¹¶åï¼
worker.concurrencyï¼
ä¸å¯åæ¥é¡¹ï¼ç½ååï¼ï¼ è§ä¸æ¹ç½ååè¡¨æ ¼ã
Step 2: æ§è¡åæ¥
æ¹å¼ A: æå¨ç¼è¾ï¼æ¨èç¨äº configs/ ä¸ç YAML æä»¶ï¼
å¯¹äº configs/simplex-api/config.yaml çæä»¶ï¼æå¨å° CI çæ°é
置项添å å° Staging å Prodï¼
# æå¼ 3 个æä»¶å¯¹æ¯ç¼è¾
# 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ï¼åå¡«å ¥ ID
æ¹å¼ B: éåæ ç¾åæ¥ï¼kustomization.yamlï¼
# æ¥çéåå·®å¼
python3 ~/.cursor/skills/sync-ci-to-staging/scripts/sync_images.py --diff
# åæ¥å° Staging
python3 ~/.cursor/skills/sync-ci-to-staging/scripts/sync_images.py --all --dry-run
python3 ~/.cursor/skills/sync-ci-to-staging/scripts/sync_images.py --all
# åæ¥å° Prodï¼éè¦ç¨ staging-to-prod èæ¬ï¼
python3 ~/.cursor/skills/sync-staging-to-prod/scripts/sync_images.py --all --dry-run
python3 ~/.cursor/skills/sync-staging-to-prod/scripts/sync_images.py --all
Step 3: éªè¯åæ¥ç»æ
cd kubernetes
# 忬¡è¿è¡å¯¹æ¯ï¼ç¡®è®¤æ æ®çå·®å¼
python3 scripts/compare-configs.py --diff-only
# ææè¾åºï¼
# ä¸å: 0 | ç½åå(颿ä¸å): N | é¨å缺失: 0
Step 4: æäº¤å¹¶æ¨é
cd /path/to/simplex-gitops
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 5: é¨ç½²
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
å¸¸ç¨ 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 |
æå¡ç±»å«
| ç±»å« | æå¡ |
|---|---|
| AI Core | anotherme-agent, anotherme-api, anotherme-search, anotherme-worker |
| Frontend | front, front-homepage |
| Backend | simplex-cron, simplex-gateway-api, simplex-gateway-worker |
| Data | data-search-api, crawler |
| Infrastructure | litellm, node-server, simplex-router, simplex-router-backend, simplex-router-fronted |
Promotion Path
CI (aws-ci)
â æ¬ Skill: 䏿¬¡åæ¥å° staging + prod
Staging (aws-staging) + Production (aws-prod)
ä¹å¯ä»¥åæ¥ï¼
CI (aws-ci)
â sync-ci-to-staging skill
Staging (aws-staging)
â sync-staging-to-prod skill
Production (aws-prod)