@cloudbase/manager-node 5.7.1-beta.0 → 5.8.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cloudApp/index.js +12 -3
- package/lib/deploy/DatabaseDeployer.js +238 -0
- package/lib/deploy/DeployOrchestrator.js +645 -0
- package/lib/deploy/FunctionDeployer.js +611 -0
- package/lib/deploy/GatewayDeployer.js +612 -0
- package/lib/deploy/StateStore.js +327 -0
- package/lib/deploy/StaticDeployer.js +236 -0
- package/lib/deploy/domain.js +41 -0
- package/lib/deploy/framework.js +230 -0
- package/lib/deploy/function/artifact.js +207 -0
- package/lib/deploy/function/builders/cloud.js +654 -0
- package/lib/deploy/function/cam-preflight.js +157 -0
- package/lib/deploy/function/cloud-build-service.js +191 -0
- package/lib/deploy/function/config-guard.js +595 -0
- package/lib/deploy/function/docker-preflight.js +87 -0
- package/lib/deploy/function/image-preflight.js +164 -0
- package/lib/deploy/function/local-builder.js +129 -0
- package/lib/deploy/function/planner.js +278 -0
- package/lib/deploy/function/preflight.js +329 -0
- package/lib/deploy/types.js +103 -0
- package/lib/env/index.js +0 -9
- package/lib/environment.js +11 -0
- package/lib/function/index.js +1 -1
- package/lib/hosting/index.js +4 -1
- package/lib/index.js +31 -0
- package/lib/projectValidator/index.js +452 -0
- package/lib/projectValidator/types.js +2 -0
- package/lib/storage/index.js +6 -7
- package/lib/utils/index.js +62 -5
- package/package.json +2 -1
- package/types/cloudApp/index.d.ts +4 -0
- package/types/cloudApp/types.d.ts +87 -6
- package/types/deploy/DatabaseDeployer.d.ts +70 -0
- package/types/deploy/DeployOrchestrator.d.ts +170 -0
- package/types/deploy/FunctionDeployer.d.ts +159 -0
- package/types/deploy/GatewayDeployer.d.ts +194 -0
- package/types/deploy/StateStore.d.ts +170 -0
- package/types/deploy/StaticDeployer.d.ts +97 -0
- package/types/deploy/domain.d.ts +17 -0
- package/types/deploy/framework.d.ts +63 -0
- package/types/deploy/function/artifact.d.ts +40 -0
- package/types/deploy/function/builders/cloud.d.ts +110 -0
- package/types/deploy/function/cam-preflight.d.ts +51 -0
- package/types/deploy/function/cloud-build-service.d.ts +10 -0
- package/types/deploy/function/config-guard.d.ts +41 -0
- package/types/deploy/function/docker-preflight.d.ts +17 -0
- package/types/deploy/function/image-preflight.d.ts +21 -0
- package/types/deploy/function/local-builder.d.ts +26 -0
- package/types/deploy/function/planner.d.ts +15 -0
- package/types/deploy/function/preflight.d.ts +9 -0
- package/types/deploy/types.d.ts +429 -0
- package/types/env/index.d.ts +1 -8
- package/types/env/type.d.ts +6 -97
- package/types/environment.d.ts +7 -0
- package/types/function/types.d.ts +15 -0
- package/types/hosting/index.d.ts +6 -0
- package/types/index.d.ts +18 -0
- package/types/interfaces/function.interface.d.ts +1 -1
- package/types/projectValidator/index.d.ts +38 -0
- package/types/projectValidator/types.d.ts +26 -0
- package/types/storage/index.d.ts +6 -0
- package/types/utils/index.d.ts +13 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { ICustomBuildEnv, ICustomBuildSecret, ICustomBuildStep, CloudAppArtifact, CloudAppBuildStep } from '../../../cloudApp/types';
|
|
2
|
+
import { INormalizedHttpCloudConfig } from '../../types';
|
|
3
|
+
export interface ICloudBuildResult {
|
|
4
|
+
imageUri: string;
|
|
5
|
+
imageDigest?: string;
|
|
6
|
+
buildId?: string;
|
|
7
|
+
versionName?: string;
|
|
8
|
+
logsUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
/** COS 上传信息(对应 DescribeCloudAppCosInfo 响应的必要字段) */
|
|
11
|
+
export interface ICloudCosInfo {
|
|
12
|
+
uploadUrl: string;
|
|
13
|
+
uploadHeaders: Array<{
|
|
14
|
+
key: string;
|
|
15
|
+
value: string;
|
|
16
|
+
}>;
|
|
17
|
+
unixTimestamp: string;
|
|
18
|
+
}
|
|
19
|
+
/** 创建 custom 构建入参(不含 envId/deployType/buildType,由 service 补齐固定值) */
|
|
20
|
+
export interface ICloudCreateBuildInput {
|
|
21
|
+
serviceName: string;
|
|
22
|
+
cosTimestamp: string;
|
|
23
|
+
env: ICustomBuildEnv[];
|
|
24
|
+
secrets?: ICustomBuildSecret[];
|
|
25
|
+
customSteps: ICustomBuildStep[];
|
|
26
|
+
}
|
|
27
|
+
/** 创建 custom 构建结果 */
|
|
28
|
+
export interface ICloudCreateBuildResult {
|
|
29
|
+
buildId?: string;
|
|
30
|
+
versionName: string;
|
|
31
|
+
/** CreateCloudApp 接口返回的 RequestId,便于把构建问题反馈给平台后端定位 */
|
|
32
|
+
requestId?: string;
|
|
33
|
+
}
|
|
34
|
+
/** 构建版本状态(对应 DescribeCloudAppVersion 响应必要字段) */
|
|
35
|
+
export interface ICloudVersionStatus {
|
|
36
|
+
status: string;
|
|
37
|
+
steps?: CloudAppBuildStep[] | null;
|
|
38
|
+
artifacts?: CloudAppArtifact[] | null;
|
|
39
|
+
/** DescribeCloudAppVersion 接口返回的 RequestId,便于把构建问题反馈给平台后端定位 */
|
|
40
|
+
requestId?: string;
|
|
41
|
+
}
|
|
42
|
+
/** 需要额外注入到构建 zip 的文件条目(zip 内路径 + 内容 + 可选 unix 权限位) */
|
|
43
|
+
export interface ICloudBuildExtraEntry {
|
|
44
|
+
/** zip 包内的相对路径,如 scripts/tcr-login-and-push.sh */
|
|
45
|
+
zipPath: string;
|
|
46
|
+
/** 文件文本内容 */
|
|
47
|
+
content: string;
|
|
48
|
+
/** unix 权限位(八进制),如 0o755;脚本需可执行 */
|
|
49
|
+
mode?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 云端构建所需的外部能力,由编排器注入
|
|
53
|
+
*每个方法对应构建方案(https://iwiki.woa.com/p/4020519533)的一个 API/IO 步骤
|
|
54
|
+
*/
|
|
55
|
+
export interface ICloudBuildService {
|
|
56
|
+
/**
|
|
57
|
+
* 打包构建上下文为 ZIP,返回本地临时 zip 路径
|
|
58
|
+
* @param cwd 构建上下文目录
|
|
59
|
+
* @param extraEntries 额外注入zip 的文件(如 push 脚本),不写入用户源码目录
|
|
60
|
+
*/
|
|
61
|
+
packContext: (cwd: string, extraEntries?: ICloudBuildExtraEntry[]) => Promise<string>;
|
|
62
|
+
/** 获取 COS 上传凭证(DescribeCloudAppCosInfo,DeployType:custom) */
|
|
63
|
+
getCosInfo: (serviceName: string) => Promise<ICloudCosInfo>;
|
|
64
|
+
/** PUT 上传 zip 到 COS,必须携带全部 uploadHeaders */
|
|
65
|
+
uploadZip: (cosInfo: ICloudCosInfo, zipPath: string) => Promise<void>;
|
|
66
|
+
/** 触发 custom 构建(CreateCloudApp,DeployType:custom) */
|
|
67
|
+
createBuild: (input: ICloudCreateBuildInput) => Promise<ICloudCreateBuildResult>;
|
|
68
|
+
/** 查询构建版本状态(DescribeCloudAppVersion) */
|
|
69
|
+
getVersionStatus: (serviceName: string, versionName: string) => Promise<ICloudVersionStatus>;
|
|
70
|
+
/** 清理本地临时 zip;失败不应影响主流程 */
|
|
71
|
+
cleanup: (zipPath: string) => Promise<void>;
|
|
72
|
+
/** 延时(便于测试注入立即返回) */
|
|
73
|
+
delay: (ms: number) => Promise<void>;
|
|
74
|
+
}
|
|
75
|
+
/** 注入到构建上下文 zip 中的推送脚本相对路径(与 CustomSteps 的 push命令一致) */
|
|
76
|
+
export declare const TCR_PUSH_SCRIPT_ZIP_PATH = "scripts/tcr-login-and-push.sh";
|
|
77
|
+
/**
|
|
78
|
+
* 注入到构建 zip 的 TCR/CCR 登录推送脚本(完整可运行)
|
|
79
|
+
*
|
|
80
|
+
* 对应构建方案(https://iwiki.woa.com/p/4020519533)「阶段 A」的 push 步骤:
|
|
81
|
+
* push-image 步骤执行 `bash./scripts/tcr-login-and-push.sh`,该脚本必须随源码
|
|
82
|
+
* 一同打进zip 根目录,否则云端会 `No such file or directory` 秒挂。
|
|
83
|
+
*
|
|
84
|
+
* 关键设计:
|
|
85
|
+
* - 地域参数化:REGION 读环境变量 $TCR_REGION(由 buildEnv 按部署地域注入),
|
|
86
|
+
* 避免硬编码 ap-shanghai跨地域时 AuthFailure.SignatureFailure。
|
|
87
|
+
* - 双仓库兼容:设置了 $TCR_INSTANCE_ID 走企业版 TCR CreateInstanceToken;
|
|
88
|
+
* 否则走个人版 CCR,用户名来自普通 Env,固定密码来自 CloudApp Secrets。
|
|
89
|
+
* - 安全红线:凭证一律经 --password-stdin 传入,绝不出现在 ps/日志;
|
|
90
|
+
* 不打印任何 $API_SECRET_* / token / $SECRET_TCR_PASSWORD_B64 或解码后的密码。
|
|
91
|
+
*
|
|
92
|
+
* 脚本内容为SDK 固定模板,不拼接任何用户输入(镜像地址等均由已校验的
|
|
93
|
+
* 环境变量在容器内组装),无命令注入面。
|
|
94
|
+
*/
|
|
95
|
+
export declare const TCR_LOGIN_PUSH_SCRIPT = "#!/usr/bin/env bash\n# scripts/tcr-login-and-push.sh\n# \u7531 CloudBase SDK \u81EA\u52A8\u6CE8\u5165\uFF1A\u4F01\u4E1A\u7248\u4F7F\u7528 STS \u6362\u53D6\u4E34\u65F6 token\uFF0C\u4E2A\u4EBA\u7248\u4F7F\u7528 CloudApp Secret\nset -euo pipefail\n\n: \"${TCR_REGISTRY:?TCR_REGISTRY \u672A\u8BBE\u7F6E}\"\n: \"${TCR_NAMESPACE:?TCR_NAMESPACE \u672A\u8BBE\u7F6E}\"\n: \"${CLOUDBASE_SERVICE_NAME:?\u5E73\u53F0\u53D8\u91CF\u7F3A\u5931}\"\n: \"${CLOUDBASE_VERSION_NAME:?\u5E73\u53F0\u53D8\u91CF\u7F3A\u5931}\"\n\nREGION=\"${TCR_REGION:-ap-shanghai}\"\nIMAGE=\"${TCR_REGISTRY}/${TCR_NAMESPACE}/${CLOUDBASE_SERVICE_NAME}:${CLOUDBASE_VERSION_NAME}\"\nIS_PERSONAL_REGISTRY=0\n\nif [ -n \"${TCR_INSTANCE_ID:-}\" ]; then\n : \"${API_SECRET_ID:?STS \u51ED\u8BC1\u7F3A\u5931}\"\n : \"${API_SECRET_KEY:?STS \u51ED\u8BC1\u7F3A\u5931}\"\n : \"${API_TOKEN:?STS \u51ED\u8BC1\u7F3A\u5931}\"\n\n # ---- \u4F01\u4E1A\u7248 TCR\uFF1ACreateInstanceToken \u6362\u767B\u5F55\u6001 ----\n HOST=\"tcr.tencentcloudapi.com\"\n SERVICE=\"tcr\"\n VERSION=\"2019-09-24\"\n ACTION=\"CreateInstanceToken\"\n ALGORITHM=\"TC3-HMAC-SHA256\"\n TIMESTAMP=$(date +%s)\n DATE=$(date -u -d \"@${TIMESTAMP}\" +\"%Y-%m-%d\" 2>/dev/null || date -u -r \"${TIMESTAMP}\" +\"%Y-%m-%d\")\n\n PAYLOAD=$(printf '{\"RegistryId\":\"%s\",\"TokenType\":\"LongTermToken\"}' \"${TCR_INSTANCE_ID}\")\n HASHED_PAYLOAD=$(printf '%s' \"${PAYLOAD}\" | openssl dgst -sha256 -hex | awk '{print $NF}')\n CANONICAL_HEADERS=\"content-type:application/json; charset=utf-8\\nhost:${HOST}\\nx-tc-action:$(echo \"${ACTION}\" | tr '[:upper:]' '[:lower:]')\\n\"\n SIGNED_HEADERS=\"content-type;host;x-tc-action\"\n CANONICAL_REQUEST=\"POST\\n/\\n\\n${CANONICAL_HEADERS}\\n${SIGNED_HEADERS}\\n${HASHED_PAYLOAD}\"\n\n CREDENTIAL_SCOPE=\"${DATE}/${SERVICE}/tc3_request\"\n HASHED_CR=$(printf \"${CANONICAL_REQUEST}\" | openssl dgst -sha256 -hex | awk '{print $NF}')\n STRING_TO_SIGN=\"${ALGORITHM}\\n${TIMESTAMP}\\n${CREDENTIAL_SCOPE}\\n${HASHED_CR}\"\n\n secret_date=$(printf '%s' \"${DATE}\" | openssl dgst -sha256 -hmac \"TC3${API_SECRET_KEY}\" -hex | awk '{print $NF}')\n secret_svc=$(printf '%s' \"${SERVICE}\" | openssl dgst -sha256 -mac HMAC -macopt hexkey:\"${secret_date}\" -hex | awk '{print $NF}')\n secret_sign=$(printf '%s' \"tc3_request\" | openssl dgst -sha256 -mac HMAC -macopt hexkey:\"${secret_svc}\" -hex | awk '{print $NF}')\n SIGNATURE=$(printf \"${STRING_TO_SIGN}\" | openssl dgst -sha256 -mac HMAC -macopt hexkey:\"${secret_sign}\" -hex | awk '{print $NF}')\n\n AUTHZ=\"${ALGORITHM} Credential=${API_SECRET_ID}/${CREDENTIAL_SCOPE}, SignedHeaders=${SIGNED_HEADERS}, Signature=${SIGNATURE}\"\n\n RESP=$(curl -sS -X POST \"https://${HOST}\" \\\n -H \"Authorization: ${AUTHZ}\" \\\n -H \"Content-Type: application/json; charset=utf-8\" \\\n -H \"Host: ${HOST}\" \\\n -H \"X-TC-Action: ${ACTION}\" \\\n -H \"X-TC-Timestamp: ${TIMESTAMP}\" \\\n -H \"X-TC-Version: ${VERSION}\" \\\n -H \"X-TC-Region: ${REGION}\" \\\n -H \"X-TC-Token: ${API_TOKEN}\" \\\n --data \"${PAYLOAD}\")\n\n ERROR_CODE=$(printf '%s' \"${RESP}\" | jq -r '.Response.Error.Code // empty')\n if [ -n \"${ERROR_CODE}\" ]; then\n case \"${ERROR_CODE}\" in\n AuthFailure*|UnauthorizedOperation*|FailedOperation.NoPermission*)\n echo \"\u4F01\u4E1A\u7248 TCR \u9274\u6743\u5931\u8D25\uFF0C\u8BF7\u786E\u8BA4\u5F53\u524D\u8EAB\u4EFD\u6709\u6743\u8BBF\u95EE\u8BE5\u5B9E\u4F8B\u5E76\u8C03\u7528 CreateInstanceToken\" >&2\n exit 42\n ;;\n ResourceNotFound*|InvalidParameterValue.RegistryId*)\n echo \"\u4F01\u4E1A\u7248 TCR \u5B9E\u4F8B\u4E0D\u5B58\u5728\u6216\u5B9E\u4F8B ID \u65E0\u6548\" >&2\n exit 43\n ;;\n *)\n echo \"\u4F01\u4E1A\u7248 TCR \u83B7\u53D6\u767B\u5F55\u51ED\u8BC1\u5931\u8D25\uFF1A${ERROR_CODE}\" >&2\n exit 1\n ;;\n esac\n fi\n\n TOKEN_USER=$(printf '%s' \"${RESP}\" | jq -er '.Response.Username')\n TOKEN_PASS=$(printf '%s' \"${RESP}\" | jq -er '.Response.Token')\n\n printf '%s' \"${TOKEN_PASS}\" | docker login -u \"${TOKEN_USER}\" --password-stdin \"${TCR_REGISTRY}\"\nelse\n # ---- \u4E2A\u4EBA\u7248 CCR\uFF1A\u8D26\u53F7 ID + \u56FA\u5B9A\u5BC6\u7801\uFF08Base64 \u5C01\u88C5\u540E\u7531 CloudApp Secrets \u6CE8\u5165\uFF09 ----\n IS_PERSONAL_REGISTRY=1\n : \"${TCR_USERNAME:?TCR_USERNAME \u672A\u8BBE\u7F6E}\"\n : \"${SECRET_TCR_PASSWORD_B64:?TCR_PASSWORD \u672A\u8BBE\u7F6E}\"\n printf '%s' \"${SECRET_TCR_PASSWORD_B64}\" | base64 --decode | docker login -u \"${TCR_USERNAME}\" --password-stdin \"${TCR_REGISTRY}\"\nfi\n\nPUSH_LOG=$(mktemp)\ntrap 'rm -f \"${PUSH_LOG}\"' EXIT\nset +e\ndocker push \"${IMAGE}\" 2>&1 | tee \"${PUSH_LOG}\"\nPUSH_STATUS=${PIPESTATUS[0]}\nset -e\n\nif [ \"${PUSH_STATUS}\" -ne 0 ]; then\n if [ \"${IS_PERSONAL_REGISTRY}\" -eq 1 ] && {\n grep -Fq 'LimitExceeded.ErrRepoMaxLimit' \"${PUSH_LOG}\" ||\n grep -Fq '\u7528\u6237\u4ED3\u5E93\u5DF2\u7ECF\u8FBE\u5230\u6700\u5927\u914D\u989D' \"${PUSH_LOG}\"\n }; then\n echo \"\u4E2A\u4EBA\u7248 TCR \u955C\u50CF\u4ED3\u5E93\u6570\u91CF\u5DF2\u8FBE\u5230\u5F53\u524D\u5730\u57DF\u914D\u989D\uFF0C\u65E0\u6CD5\u81EA\u52A8\u521B\u5EFA\u76EE\u6807\u4ED3\u5E93\" >&2\n exit 44\n fi\n exit 1\nfi\n\necho \"::output::tag=${CLOUDBASE_VERSION_NAME}\"\n";
|
|
96
|
+
/** buildImageOnCloud 可选项 */
|
|
97
|
+
export interface IBuildImageOnCloudOptions {
|
|
98
|
+
/** 日志回调,用于透出构建进度(不含凭证) */
|
|
99
|
+
onLog?: (line: string) => void;
|
|
100
|
+
/** 部署地域,注入构建环境供推送脚本换取仓库登录态(跨地域必需) */
|
|
101
|
+
region?: string;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 执行云端构建并推送镜像
|
|
105
|
+
*
|
|
106
|
+
* @param config 规范化的 cloud 部署配置
|
|
107
|
+
* @param service 注入的外部能力(打包/tcb API/COS 上传)
|
|
108
|
+
* @param options 可选项:日志回调 onLog、部署地域 region
|
|
109
|
+
*/
|
|
110
|
+
export declare function buildImageOnCloud(config: INormalizedHttpCloudConfig, service: ICloudBuildService, options?: IBuildImageOnCloudOptions): Promise<ICloudBuildResult>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ICheckReport, INormalizedDeployConfig } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* 镜像拉取授权 Preflight(涉及 CAM,scope: cloud)
|
|
4
|
+
*
|
|
5
|
+
* SCF 拉取镜像由服务角色 SCF_QcsRole 代理,个人版镜像要求该角色绑定
|
|
6
|
+
* QcloudAccessForSCFRoleInPullImage 策略。本模块在 image 策略部署前:
|
|
7
|
+
* 1. 探测该角色与策略是否就绪;
|
|
8
|
+
* 2. 缺失且允许时,自动绑定「唯一白名单策略」补齐(绝不放大到其它策略);
|
|
9
|
+
* 3. 当前身份无 CAM 权限时不硬失败,降级为结构化指引 + 一键授权链接兜底。
|
|
10
|
+
*
|
|
11
|
+
* 安全边界(对应 security_rules 的 AuthZ / 最小权限):
|
|
12
|
+
* - 自动授权只允许绑定 REQUIRED_IMAGE_PULL_POLICY 这一条部署必需的预置策略;
|
|
13
|
+
* - 不代用户创建角色、不绑定任何白名单外策略;
|
|
14
|
+
* - 探测/授权失败一律走降级,不阻断到无法给出可操作指引。
|
|
15
|
+
*/
|
|
16
|
+
/** SCF 拉取镜像使用的服务角色 */
|
|
17
|
+
export declare const SCF_PULL_IMAGE_ROLE = "SCF_QcsRole";
|
|
18
|
+
/** 拉取个人版镜像所需的唯一预置策略(自动授权白名单,仅此一条) */
|
|
19
|
+
export declare const REQUIRED_IMAGE_PULL_POLICY = "QcloudAccessForSCFRoleInPullImage";
|
|
20
|
+
/** 官方一键授权链接,作为无 CAM 权限时的兜底指引 */
|
|
21
|
+
export declare const IMAGE_PULL_GRANT_URL: string;
|
|
22
|
+
/** 角色详情,仅取判断所需字段 */
|
|
23
|
+
interface IRoleDetail {
|
|
24
|
+
RoleName?: string;
|
|
25
|
+
/** 已绑定的策略名集合,具体来源由适配层填充 */
|
|
26
|
+
attachedPolicyNames?: string[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* CAM 能力的最小依赖接口
|
|
30
|
+
*
|
|
31
|
+
* 只声明本模块需要的方法,便于解耦具体实现与单元测试。
|
|
32
|
+
* 适配层负责把 CamService 的返回适配为 attachedPolicyNames。
|
|
33
|
+
*/
|
|
34
|
+
export interface ICamPreflightService {
|
|
35
|
+
/** 获取角色详情及其已绑定策略名;角色不存在应抛出可识别错误 */
|
|
36
|
+
getRoleWithPolicies: (roleName: string) => Promise<IRoleDetail>;
|
|
37
|
+
/** 为角色绑定指定预置策略(按策略名) */
|
|
38
|
+
attachPolicyByName: (roleName: string, policyName: string) => Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
/** 判断错误是否为 CAM 权限不足 */
|
|
41
|
+
export declare function isCamPermissionError(error: any): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* 执行镜像拉取授权 Preflight
|
|
44
|
+
*
|
|
45
|
+
* @param service CAM 能力适配(无则视为无法校验,直接降级为提示)
|
|
46
|
+
* @param config 规范化部署配置
|
|
47
|
+
* @param autoGrant 是否允许自动补齐授权(默认 true)
|
|
48
|
+
* @returns scope 为 cloud 的检查报告,聚合全部结论
|
|
49
|
+
*/
|
|
50
|
+
export declare function runImagePullAuthPreflight(service: ICamPreflightService | null, config: INormalizedDeployConfig, autoGrant?: boolean): Promise<ICheckReport>;
|
|
51
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CloudAppService } from '../../cloudApp';
|
|
2
|
+
import { ICloudBuildService } from './builders/cloud';
|
|
3
|
+
export interface ICreateCloudBuildServiceOptions {
|
|
4
|
+
/** 追加的打包忽略项 */
|
|
5
|
+
ignore?: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 由CloudAppService 构造 ICloudBuildService实现
|
|
9
|
+
*/
|
|
10
|
+
export declare function createCloudBuildService(cloudApp: CloudAppService, options?: ICreateCloudBuildServiceOptions): ICloudBuildService;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ICheckReport, IFunctionDeployConfig, INormalizedDeployConfig } from '../types';
|
|
2
|
+
export interface IParsedImageReference {
|
|
3
|
+
registry?: string;
|
|
4
|
+
repository: string;
|
|
5
|
+
tag?: string;
|
|
6
|
+
digest?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 解析 OCI 镜像引用
|
|
10
|
+
*
|
|
11
|
+
* 支持 [registry[:port]/]repository[:tag][@digest]
|
|
12
|
+
* 无法仅通过是否包含冒号判断 tag,因为 registry 可能带端口
|
|
13
|
+
* @returns 解析结果,非法时返回 null
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseImageReference(reference: string): IParsedImageReference | null;
|
|
16
|
+
/**
|
|
17
|
+
* 规范化网关路径
|
|
18
|
+
*
|
|
19
|
+
* 合并连续斜杠并去除尾部斜杠,根路径保持为 /
|
|
20
|
+
* @returns 规范化结果,非法时返回 null
|
|
21
|
+
*/
|
|
22
|
+
export declare function normalizeGatewayPath(input: string): string | null;
|
|
23
|
+
/** 判断是否为自定义镜像运行时 */
|
|
24
|
+
export declare function isCustomImageRuntime(runtime?: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 规范化部署配置
|
|
27
|
+
*
|
|
28
|
+
* 仅填充默认值与收窄类型,不做合法性判断,保证在非法输入下也能安全返回,
|
|
29
|
+
* 以便 checkDeployConfig 汇总全部问题
|
|
30
|
+
*/
|
|
31
|
+
export declare function normalizeDeployConfig(config: IFunctionDeployConfig): INormalizedDeployConfig;
|
|
32
|
+
/**
|
|
33
|
+
* 校验部署配置
|
|
34
|
+
* @returns 检查报告,包含全部问题而非仅第一个
|
|
35
|
+
*/
|
|
36
|
+
export declare function checkDeployConfig(config: IFunctionDeployConfig): ICheckReport;
|
|
37
|
+
/**
|
|
38
|
+
* 校验并规范化部署配置
|
|
39
|
+
* @throws CloudBaseError 存在任一 fail 项时抛出,错误信息包含全部失败原因
|
|
40
|
+
*/
|
|
41
|
+
export declare function assertDeployConfig(config: IFunctionDeployConfig): INormalizedDeployConfig;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ICheckReport } from '../types';
|
|
2
|
+
export interface IExecResult {
|
|
3
|
+
ok: boolean;
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
}
|
|
7
|
+
/** 只读命令执行器签名 */
|
|
8
|
+
export type ReadonlyRunner = (command: string, args: string[]) => Promise<IExecResult>;
|
|
9
|
+
/**
|
|
10
|
+
* 执行 Docker 本地能力检查
|
|
11
|
+
*
|
|
12
|
+
* 检测顺序:CLI 存在性 → daemon 可用性 → buildx 可用性。
|
|
13
|
+
* CLI 缺失时短路(daemon/buildx 无从谈起),其余项独立收集后聚合返回。
|
|
14
|
+
*
|
|
15
|
+
* @param runner 命令执行器,默认真实 execFile;测试可注入 mock
|
|
16
|
+
*/
|
|
17
|
+
export declare function runDockerPreflight(runner?: ReadonlyRunner): Promise<ICheckReport>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ICheckReport, INormalizedDeployConfig } from '../types';
|
|
2
|
+
export interface IExecResult {
|
|
3
|
+
ok: boolean;
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
/** 命令本身无法启动(如 docker 未安装)时为 true,与“命令执行了但返回非零”区分 */
|
|
7
|
+
spawnFailed?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/** 可注入依赖:远端 manifest 查询命令 */
|
|
10
|
+
export interface IImagePreflightDeps {
|
|
11
|
+
runCommand: (command: string, args: string[]) => Promise<IExecResult>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 执行镜像远端校验 Preflight
|
|
15
|
+
*
|
|
16
|
+
* @param config 规范化部署配置
|
|
17
|
+
* @param deployRegion 函数部署地域(可选,来源于 environment;未知时跳过地域校验)
|
|
18
|
+
* @param deps 可注入依赖,默认真实命令;测试可传 mock
|
|
19
|
+
* @returns scope 为 cloud 的检查报告
|
|
20
|
+
*/
|
|
21
|
+
export declare function runImageRemotePreflight(config: INormalizedDeployConfig, deployRegion?: string, deps?: IImagePreflightDeps): Promise<ICheckReport>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { INormalizedHttpLocalConfig } from '../types';
|
|
2
|
+
export interface ILocalBuildResult {
|
|
3
|
+
imageUri: string;
|
|
4
|
+
imageDigest?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface IExecResult {
|
|
7
|
+
ok: boolean;
|
|
8
|
+
stdout: string;
|
|
9
|
+
stderr: string;
|
|
10
|
+
}
|
|
11
|
+
/** 可注入依赖:命令执行与文件系统检查 */
|
|
12
|
+
export interface ILocalBuilderDeps {
|
|
13
|
+
runCommand: (command: string, args: string[]) => Promise<IExecResult>;
|
|
14
|
+
existsSync: (target: string) => boolean;
|
|
15
|
+
isDirectory: (target: string) => boolean;
|
|
16
|
+
isFile: (target: string) => boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 本地构建镜像并推送到目标仓库
|
|
20
|
+
*
|
|
21
|
+
* @param config 规范化的 local 部署配置
|
|
22
|
+
* @param onLog 可选日志回调,用于透出构建输出(不含凭证)
|
|
23
|
+
* @param deps 可注入依赖,默认真实命令与 fs;测试可传 mock
|
|
24
|
+
* @returns 最终镜像引用与 digest
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildAndPushImage(config: INormalizedHttpLocalConfig, onLog?: (line: string) => void, deps?: ILocalBuilderDeps): Promise<ILocalBuildResult>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { IFunctionInfo } from '../../function/types';
|
|
2
|
+
import { IFunctionCurrentState, IFunctionDeployPlan, INormalizedDeployConfig } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* 部署计划生成
|
|
5
|
+
*
|
|
6
|
+
* 纯函数实现,线上函数状态由调用方查询后传入,便于单独测试
|
|
7
|
+
*/
|
|
8
|
+
/** 将 SCF 返回的函数详情收敛为计划所需的状态摘要 */
|
|
9
|
+
export declare function toCurrentState(info: IFunctionInfo): IFunctionCurrentState;
|
|
10
|
+
/**
|
|
11
|
+
* 生成部署计划
|
|
12
|
+
* @param config 已规范化的部署配置
|
|
13
|
+
* @param current 线上函数详情,不存在时传 null
|
|
14
|
+
*/
|
|
15
|
+
export declare function createDeployPlan(config: INormalizedDeployConfig, current?: IFunctionInfo | null): IFunctionDeployPlan;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ICheckReport, INormalizedDeployConfig } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* 执行部署前本地检查
|
|
4
|
+
*
|
|
5
|
+
* HTTP zip 策略检查代码包条件;HTTP cloud 策略检查构建上下文和 Dockerfile。
|
|
6
|
+
* base64Code 来源无本地目录,跳过文件检查。
|
|
7
|
+
* @returns 本地检查报告,聚合全部问题
|
|
8
|
+
*/
|
|
9
|
+
export declare function runLocalPreflight(config: INormalizedDeployConfig): ICheckReport;
|