Skip to content

Commit b8ec791

Browse files
committed
fix(cns): optimize cns deploy flow
1 parent 9c77383 commit b8ec791

File tree

2 files changed

+65
-72
lines changed

2 files changed

+65
-72
lines changed

src/modules/cns/index.js

Lines changed: 56 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const { cns } = require('tencent-cloud-sdk');
22
const { TypeError } = require('../../utils/error');
3+
const { getRealType } = require('../../utils');
34

45
class Cns {
56
constructor(credentials = {}, region = 'ap-guangzhou') {
@@ -9,21 +10,19 @@ class Cns {
910
}
1011

1112
haveRecord(newRecord, historyRcords) {
12-
for (let i = 0; i < historyRcords.length; i++) {
13-
if (newRecord.recordType == 'CNAME' && newRecord.value.slice(-1) != '.') {
14-
newRecord.value = `${newRecord.value}.`;
15-
}
16-
if (
17-
newRecord.domain == historyRcords[i].domain &&
18-
newRecord.subDomain == historyRcords[i].subDomain &&
19-
newRecord.recordType == historyRcords[i].recordType &&
20-
newRecord.value == historyRcords[i].value &&
21-
newRecord.recordLine == historyRcords[i].recordLine
22-
) {
23-
return historyRcords[i];
24-
}
13+
if (newRecord.recordType === 'CNAME' && newRecord.value.slice(-1) !== '.') {
14+
newRecord.value = `${newRecord.value}.`;
2515
}
26-
return false;
16+
const [exist] = historyRcords.filter((item) => {
17+
return (
18+
newRecord.domain === item.domain &&
19+
newRecord.subDomain === item.subDomain &&
20+
newRecord.recordType === item.recordType &&
21+
newRecord.value === item.value &&
22+
newRecord.recordLine === item.recordLine
23+
);
24+
});
25+
return exist;
2726
}
2827

2928
async deploy(inputs = {}) {
@@ -35,7 +34,7 @@ class Cns {
3534
const output = { records: [] };
3635

3736
// 获取线上的域名记录列表
38-
console.log(`Getting release domain records ... `);
37+
console.log(`Getting release domain records`);
3938
try {
4039
while (domainLength == 100) {
4140
const statusInputs = {
@@ -45,40 +44,30 @@ class Cns {
4544
length: domainLength,
4645
domain: inputs.domain,
4746
};
48-
let recordReleaseList = await this.cnsClient.request(statusInputs);
49-
if (recordReleaseList.code != 0) {
50-
// 如果没找到Domain,则尝试添加Domain
51-
try {
52-
console.log(`Get release domain error.`);
53-
console.log(`Adding domain ...`);
54-
await this.cnsClient.request({
55-
Action: 'DomainCreate',
56-
Region: this.region,
57-
domain: inputs.domain,
58-
});
59-
output.DNS = 'Please set your domain DNS: f1g1ns1.dnspod.net, f1g1ns1.dnspod.net';
60-
console.log(`Added domain`);
61-
} catch (e) {
62-
console.log(`Add domain error`);
63-
console.log(`Trying to deploy ...`);
64-
}
47+
const res = await this.cnsClient.request(statusInputs);
48+
if (res.code !== 0) {
49+
console.log(`${res.code}: ${res.message}`);
6550
break;
6651
}
67-
recordReleaseList = recordReleaseList['data'];
68-
if (recordReleaseList['records']) {
69-
for (let i = 0; i < recordReleaseList['records'].length; i++) {
52+
53+
const {
54+
data: { records },
55+
} = res;
56+
if (records) {
57+
for (let i = 0; i < records.length; i++) {
58+
const curRecord = records[i];
7059
recordRelease.push({
7160
domain: inputs.domain,
72-
subDomain: recordReleaseList['records'][i].name,
73-
recordType: recordReleaseList['records'][i].type,
74-
value: recordReleaseList['records'][i].value,
75-
recordId: recordReleaseList['records'][i].id,
76-
mx: recordReleaseList['records'][i].mx,
77-
ttl: recordReleaseList['records'][i].ttl,
78-
recordLine: recordReleaseList['records'][i].line,
61+
subDomain: curRecord.name,
62+
recordType: curRecord.type,
63+
value: curRecord.value,
64+
recordId: curRecord.id,
65+
mx: curRecord.mx,
66+
ttl: curRecord.ttl,
67+
recordLine: curRecord.line,
7968
});
8069
}
81-
domainLength = recordReleaseList['records'].length;
70+
domainLength = records.length;
8271
} else {
8372
domainLength = 0;
8473
}
@@ -88,30 +77,28 @@ class Cns {
8877
} catch (e) {}
8978

9079
const records = [];
91-
for (let recordNum = 0; recordNum < inputs.records.length; recordNum++) {
80+
for (let i = 0; i < inputs.records.length; i++) {
81+
const curRecord = inputs.records[i];
9282
const tempSubDomain =
93-
typeof inputs.records[recordNum].subDomain == 'string'
94-
? [inputs.records[recordNum].subDomain]
95-
: inputs.records[recordNum].subDomain;
83+
getRealType(curRecord.subDomain) === 'String' ? [curRecord.subDomain] : curRecord.subDomain;
9684
const tempRecordLine =
97-
typeof inputs.records[recordNum].recordLine == 'string'
98-
? [inputs.records[recordNum].recordLine]
99-
: inputs.records[recordNum].recordLine;
85+
getRealType(curRecord.recordLine) === 'String'
86+
? [curRecord.recordLine]
87+
: curRecord.recordLine;
10088

101-
for (let subDomainNum = 0; subDomainNum < tempSubDomain.length; subDomainNum++) {
89+
for (let j = 0; j < tempSubDomain.length; j++) {
10290
for (let recordLineNum = 0; recordLineNum < tempRecordLine.length; recordLineNum++) {
103-
const tempRecord = JSON.parse(JSON.stringify(inputs.records[recordNum]));
104-
tempRecord.subDomain = tempSubDomain[subDomainNum];
91+
const tempRecord = JSON.parse(JSON.stringify(curRecord));
92+
tempRecord.subDomain = tempSubDomain[j];
10593
tempRecord.recordLine = tempRecordLine[recordLineNum];
10694
records.push(tempRecord);
10795
}
10896
}
10997
}
11098

111-
// 增加/修改记录
112-
console.log(`Doing action about domain records ... `);
113-
for (let recordNum = 0; recordNum < records.length; recordNum++) {
114-
const tempInputs = JSON.parse(JSON.stringify(records[recordNum]));
99+
for (let i = 0; i < records.length; i++) {
100+
const curRecord = records[i];
101+
const tempInputs = JSON.parse(JSON.stringify(curRecord));
115102
tempInputs.domain = inputs.domain;
116103
tempInputs.Region = this.region;
117104
if (!tempInputs.status) {
@@ -125,7 +112,7 @@ class Cns {
125112
tempInputs.recordId = releseHistory.recordId;
126113
}
127114
tempInputs.recordId = Number(tempInputs.recordId);
128-
console.log(`Modifying (recordId is ${tempInputs.recordId})... `);
115+
console.log(`Modifying dns record ${tempInputs.recordId}`);
129116
tempInputs.Action = 'RecordModify';
130117
try {
131118
const modifyResult = await this.cnsClient.request(tempInputs);
@@ -135,10 +122,10 @@ class Cns {
135122
} catch (e) {
136123
throw new TypeError(`API_CNS_RecordModify`, e.message, e.stack);
137124
}
138-
console.log(`Modified (recordId is ${tempInputs.recordId}) `);
125+
console.log(`Modified dns record ${tempInputs.recordId} success`);
139126
} else {
140127
// 新建
141-
console.log(`Creating ... `);
128+
console.log(`Creating dns record`);
142129
tempInputs.Action = 'RecordCreate';
143130
try {
144131
let createOutputs = await this.cnsClient.request(tempInputs);
@@ -150,7 +137,7 @@ class Cns {
150137
} catch (e) {
151138
throw e;
152139
}
153-
console.log(`Created (recordId is ${tempInputs.recordId}) `);
140+
console.log(`Created dns record ${tempInputs.recordId}`);
154141
}
155142
recordList.push(tempInputs);
156143
output.records.push({
@@ -163,7 +150,7 @@ class Cns {
163150
domain: inputs.domain,
164151
});
165152
// 改状态
166-
console.log(`Modifying status to ${tempInputs.status} `);
153+
console.log(`Modifying status to ${tempInputs.status}`);
167154
const statusInputs = {
168155
Action: 'RecordStatus',
169156
Region: this.region,
@@ -179,7 +166,7 @@ class Cns {
179166
} catch (e) {
180167
throw new TypeError(`API_CNS_RecordStatus`, e.message, e.stack);
181168
}
182-
console.log(`Modified status to ${tempInputs.status} `);
169+
console.log(`Modified status to ${tempInputs.status}`);
183170
}
184171
return output;
185172
}
@@ -189,15 +176,14 @@ class Cns {
189176

190177
if (deleteList.length > 0) {
191178
console.log(`Removing records which deployed by this project, but not in this records list`);
192-
for (let recordNum = 0; recordNum < deleteList.length; recordNum++) {
193-
console.log(
194-
`Removing record ${deleteList[recordNum].subDomain} ${deleteList[recordNum].recordId} `,
195-
);
179+
for (let i = 0; i < deleteList.length; i++) {
180+
const curRecord = deleteList[i];
181+
console.log(`Removing record ${curRecord.subDomain} ${curRecord.recordId}`);
196182
const deleteInputs = {
197183
Action: 'RecordDelete',
198184
Region: this.region,
199-
domain: deleteList[recordNum].domain,
200-
recordId: deleteList[recordNum].recordId,
185+
domain: curRecord.domain,
186+
recordId: curRecord.recordId,
201187
};
202188
try {
203189
const deleteResult = await this.cnsClient.request(deleteInputs);
@@ -207,9 +193,7 @@ class Cns {
207193
} catch (e) {
208194
console.log(`Error API_CNS_RecordDelete: ${e.message}`);
209195
}
210-
console.log(
211-
`Remove record ${deleteList[recordNum].subDomain} ${deleteList[recordNum].recordId} success`,
212-
);
196+
console.log(`Remove record ${curRecord.subDomain} ${curRecord.recordId} success`);
213197
}
214198
}
215199
return true;

src/utils/index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
const path = require('path');
22
const fs = require('fs');
33

4+
/**
5+
* return variable real type
6+
* @param {any} obj input variable
7+
*/
8+
function getRealType(obj) {
9+
return Object.prototype.toString.call(obj).slice(8, -1);
10+
}
11+
412
/**
513
* is array
614
* @param obj object
@@ -162,4 +170,5 @@ module.exports = {
162170
camelCaseProperty,
163171
strip,
164172
traverseDirSync,
173+
getRealType,
165174
};

0 commit comments

Comments
 (0)