diff --git a/src/modules/apigw/entities/application.ts b/src/modules/apigw/entities/application.ts index c26f8224..1e3bc239 100644 --- a/src/modules/apigw/entities/application.ts +++ b/src/modules/apigw/entities/application.ts @@ -70,14 +70,38 @@ export default class AppEntity { // 2. bind api to app console.log(`Binding api(${apiId}) to application(${appDetail.id})`); - await this.request({ - Action: 'BindApiApp', - ApiAppId: appDetail.id, - ApiId: apiId, - Environment: environment, + // 绑定应用到API接口不支持可重入,第二次绑定会报错。 + // 解决方法是查询Api绑定的应用列表 已经绑定直接跳过,未绑定执行绑定流程 + const apiAppRes: { + ApiAppApiSet: { + ApiAppId: string; + ApiAppName: string; + ApiId: string; + ServiceId: string; + ApiRegion: string; + EnvironmentName: string; + AuthorizedTime: string; + }[]; + } = await this.request({ + Action: 'DescribeApiBindApiAppsStatus', ServiceId: serviceId, + ApiIds: [apiId], + }); + const isBinded = apiAppRes.ApiAppApiSet.find((item) => { + return item.ApiAppId === appDetail.id; }); + if (!isBinded) { + await this.request({ + Action: 'BindApiApp', + ApiAppId: appDetail.id, + ApiId: apiId, + Environment: environment, + ServiceId: serviceId, + }); + console.log('BindApiApp success'); + } + return appDetail; } diff --git a/src/modules/cos/index.ts b/src/modules/cos/index.ts index f96bc4e9..f59581a8 100644 --- a/src/modules/cos/index.ts +++ b/src/modules/cos/index.ts @@ -524,8 +524,9 @@ export default class Cos { const items = traverseDirSync(inputs.dir); let key; - const promises: Promise[] = []; - items.forEach((item) => { + let promises: Promise[] = []; + for (let i = 0; i < items.length; i++) { + const item = items[i]; // 如果是文件夹跳过 if (item.stats.isDirectory()) { return; @@ -547,11 +548,25 @@ export default class Cos { Body: fs.createReadStream(item.path), }; promises.push(this.cosClient.putObject(itemParams)); - }); - try { - await Promise.all(promises); - } catch (err) { - throw constructCosError(`API_COS_putObject`, err); + // fs.createReadStream(item.path) 会一直打开文件,当文件超过1024会报错 + // 解决方案是分段请求,超过100请求一次,请求后会自动关闭文件 + if (promises.length >= 100) { + try { + await Promise.all(promises); + promises = []; + } catch (err) { + throw constructCosError(`API_COS_putObject`, err); + } + } + } + // 循环结束后可能还有不足100的文件,此时需要单独再上传 + if (promises.length >= 1) { + try { + await Promise.all(promises); + promises = []; + } catch (err) { + throw constructCosError(`API_COS_putObject`, err); + } } } else if (inputs.file && (await fs.existsSync(inputs.file))) { /** 上传文件 */ diff --git a/src/modules/tag/index.ts b/src/modules/tag/index.ts index 22a5b77c..3907f06b 100644 --- a/src/modules/tag/index.ts +++ b/src/modules/tag/index.ts @@ -247,6 +247,10 @@ export default class Tag { const oldTagVal = item.TagValue; if (String(inputTag.TagValue) !== String(oldTagVal)) { + // yml中 tagKey一样,tagVaule变化了 部署时会报错,解决方法是先解绑再绑定新的标签 + detachTags.push({ + TagKey: item.TagKey, + }); attachTags.push(inputTag); } else { leftTags.push(item);