声æå¼é¨ç½²ç¼æ
声æå¼é¨ç½²ç¼æï¼app.deployOrchestratorï¼èª v5.1.0 èµ·æä¾ï¼å¯¹åº CLI tcb deployï¼â¥ v3.8.0ï¼ã
DeployOrchestrator æä¾ä¸é®ç¼æé¨ç½²è½åï¼è¯»åä¸ä»½ cloudbaserc.jsonï¼v2.1ï¼é
ç½®ï¼æä¾èµé¡ºåºï¼database â functions â app â hosting â gatewayï¼é¨ç½²å
¨é¨èµæºï¼æ¯æ dry-run 计åé¢è§ã彿°è¦çç¡®è®¤ãæ¬å° state å¿«ç
§å®ç°çå¢éè·³è¿ã
éè¿ app.deployOrchestrator 访é®ï¼ä¸ CLI tcb deploy åä¸å¥å®ç°ï¼è½å䏿²ï¼ã
manager-node ä¸å
置任ä½äº¤äº UIã彿°è¦ç确认å®å
¨å¤é¨åï¼ä¼ yes: true ç´æ¥æ¾è¡ï¼ææ³¨å
¥ confirmUpdate åè°æè¿åå¼å³å®ã
deployPlanâ
1. æ¥å£æè¿°â
æ¥å£åè½ï¼è®¡ç®é¨ç½²è®¡åï¼dry-runï¼ï¼ä¸æ§è¡ä»»ä½å®é é¨ç½²
æ¥å£å£°æï¼app.deployOrchestrator.deployPlan(options): Promise<IDeployPlanItem[]>
2. è¾å ¥åæ°â
| åæ®µ | å¿ å¡« | ç±»å | 说æ |
|---|---|---|---|
| config | æ¯ | Record<string, any> | è§£æåç cloudbaserc é ç½®ï¼å« envOverrides å·²åå¹¶ï¼ |
| envId | æ¯ | String | ç¯å¢ ID |
| only | å¦ | ResourceType[] | åªé¨ç½²æå®ç±»å |
| skip | å¦ | ResourceType[] | è·³è¿æå®ç±»å |
| refresh | å¦ | Boolean | å¿½ç¥æ¬å° state skip å¤å®ï¼å¼ºå¶äºç«¯å¯¹æ¯ï¼æ¼ç§»æ£æµï¼ |
| cwd | å¦ | String | é¡¹ç®æ ¹ç®å½ï¼é»è®¤ process.cwd() |
ResourceTypeï¼database / functions / app / hosting / gateway
3. è¿åç»æâ
IDeployPlanItem[]ï¼
| åæ®µ | ç±»å | 说æ |
|---|---|---|
| type | ResourceType | èµæºç±»å |
| name | String | èµæºåç§° |
| status | String | createï¼æ°å»ºï¼/ updateï¼è¦çæ´æ°ï¼/ skipï¼æªåæ´ï¼/ conflictï¼database å²çªï¼ä¸æï¼/ deployï¼ç´ä¼ è¦çï¼ |
| action | String | å¨ä½è¯´æï¼ç¨æ·å¯è¯»ï¼ |
| changes | Array | åæ´åæ®µæç»ï¼from â toï¼ |
| fileDiff | Object | hosting æä»¶çº§ diffï¼added/modified/deleted + totalChangedï¼ |
4. 示ä¾ä»£ç â
import CloudBase from "@cloudbase/manager-node";
const app = CloudBase.init({
secretId: "Your SecretId",
secretKey: "Your SecretKey",
envId: "Your envId",
});
const plan = await app.deployOrchestrator.deployPlan({
config: { envId: "xxx", functions: [{ name: "fn-a" }] },
envId: "xxx",
cwd: process.cwd(),
});
for (const item of plan) {
console.log(`[${item.type}] ${item.name}: ${item.action}`);
}
deployâ
1. æ¥å£æè¿°â
æ¥å£åè½ï¼æ§è¡é¨ç½²ï¼å«è¦ç确认ï¼
æ¥å£å£°æï¼app.deployOrchestrator.deploy(options): Promise<IDeployResult>
2. è¾å ¥åæ°â
| åæ®µ | å¿ å¡« | ç±»å | 说æ |
|---|---|---|---|
| config | æ¯ | Record<string, any> | è§£æåç cloudbaserc é ç½® |
| envId | æ¯ | String | ç¯å¢ ID |
| dryRun | å¦ | Boolean | true æ¶åªåºè®¡åä¸é¨ç½² |
| yes | å¦ | Boolean | å·²åå¨å½æ° ï¼updateï¼ç´æ¥æ¾è¡ï¼AI Agent / CIï¼ |
| confirmUpdate | å¦ | (item) => Promise<boolean> | æ¯ä¸ª update 项åè°ï¼è¿å true æ§è¡ / false è·³è¿ |
| only / skip | å¦ | ResourceType[] | ç±»åè¿æ»¤ |
| refresh | å¦ | Boolean | 强å¶äºç«¯å¯¹æ¯ï¼æ¼ç§»æ£æµï¼ |
| cwd | å¦ | String | é¡¹ç®æ ¹ç®å½ |
| log | å¦ | Object | æ¥å¿åè°ï¼info/success/warn/errorï¼ |
3. è¿åç»æâ
IDeployResultï¼
| åæ®µ | ç±»å | 说æ |
|---|---|---|
| plan | IDeployPlanItem[] | 宿´é¨ç½²è®¡å |
| results | Array | æ¯é¡¹ï¼{ type, name, ok, url?, error?, reason? } |
results å¤å®ï¼
ok: trueâ æåï¼url为访é®å°åï¼å¦æï¼ok: false+errorâ é¨ç½²å¤±è´¥ååok: false+reason: 'no-confirm'â æ 确认æºå¶ï¼ä¿å®è·³è¿ï¼ä¸æ èªè¦ç线ä¸ï¼ok: false+reason: 'skipped-by-user'â ç¨æ·åæ¶è¦ç
4. 示ä¾ä»£ç â
import CloudBase from "@cloudbase/manager-node";
const app = CloudBase.init({
secretId: "Your SecretId",
secretKey: "Your SecretKey",
envId: "Your envId",
});
// AI Agent / CIï¼ç´æ¥æ¾è¡ææè¦ç
const result = await app.deployOrchestrator.deploy({
config: { envId: "xxx", functions: [{ name: "fn-a" }] },
envId: "xxx",
yes: true,
cwd: process.cwd(),
});
if (result.results.every((r) => r.ok)) {
console.log("é¨ç½²å®æ");
} else {
for (const r of result.results.filter((r) => !r.ok)) {
console.error(`[${r.type}] ${r.name} 失败: ${r.error || r.reason}`);
}
}
说æâ
å¹çä¸çå¢éâ
- 彿°ï¼äºç«¯å卿§å¤æï¼
ListFunctionsï¼â create / updateï¼ä¸åæ¬å° hash - hostingï¼æ¬å°
.cloudbase/state.jsonæçº¹å¿«ç §ï¼ä¸è´å skip - appï¼æ¬å° state é ç½®å¿«ç §ï¼ä¸è´å skip
refresh: true强å¶å¿½ç¥æ¬å°å¿«ç §éæ°å¯¹æ¯äºç«¯
database å²çªä¸æâ
database è¿ç§»åå¨ conflict æ¶ï¼é¨ç½²ä¸æï¼åç»èµæºå¯è½ä¾èµæ° Schemaï¼ã计åä¸è¡¨ç°ä¸º status: 'conflict'ã
çæ¬å¯¹åºâ
| manager-node | CLI | 说æ |
|---|---|---|
| ⥠v5.1.0 | ⥠v3.8.0 | 声æå¼é¨ç½²ç¼æå¯ç¨ |