cloudcc-cli 1.1.7 → 1.2.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/README.md +22 -0
- package/bin/buildtag.js +7 -0
- package/bin/publishh5.js +7 -0
- package/package.json +4 -2
- package/src/buildTag.js +75 -0
- package/src/publishProject.js +6 -7
- package/src/publishProjectH5.js +178 -0
- package/utils/askTool.js +14 -0
- package/utils/pushCode.js +27 -11
package/README.md
CHANGED
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
# ReleaseV1.2.0
|
|
2
|
+
#### 发布日期:2022-8-24
|
|
3
|
+
#### 发布范围:全量
|
|
4
|
+
#### 发布内容
|
|
5
|
+
* 修复
|
|
6
|
+
* 增加创建tag功能
|
|
7
|
+
|
|
8
|
+
# ReleaseV1.1.9
|
|
9
|
+
#### 发布日期:2022-8-23
|
|
10
|
+
#### 发布范围:全量
|
|
11
|
+
#### 发布内容
|
|
12
|
+
* 修复
|
|
13
|
+
* 增加h5打包逻辑
|
|
14
|
+
|
|
15
|
+
# ReleaseV1.1.8
|
|
16
|
+
#### 发布日期:2022-7-20
|
|
17
|
+
#### 发布范围:全量
|
|
18
|
+
#### 发布内容
|
|
19
|
+
* 修复
|
|
20
|
+
* 云发布时,如果线上不同步,那么强制更新代码
|
|
21
|
+
* 优化版本设置逻辑,版本号去掉tag信息
|
|
22
|
+
|
|
1
23
|
# ReleaseV1.1.7
|
|
2
24
|
#### 发布日期:2022-7-12
|
|
3
25
|
#### 发布范围:全量
|
package/bin/buildtag.js
ADDED
package/bin/publishh5.js
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cloudcc-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "cloudcc-cli",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cloudcc",
|
|
@@ -13,8 +13,10 @@
|
|
|
13
13
|
"cloudccCreate": "bin/create.js",
|
|
14
14
|
"cloudccBuild": "bin/build.js",
|
|
15
15
|
"cloudccPublic": "bin/publish.js",
|
|
16
|
+
"cloudccPublicH5": "bin/publishh5.js",
|
|
16
17
|
"cloudccBuildCCSDK": "bin/buildccsdk.js",
|
|
17
|
-
"cloudccBuildCCBaseSDK": "bin/buildccbasesdk.js"
|
|
18
|
+
"cloudccBuildCCBaseSDK": "bin/buildccbasesdk.js",
|
|
19
|
+
"cloudccBuildTag": "bin/buildtag.js"
|
|
18
20
|
},
|
|
19
21
|
"scripts": {
|
|
20
22
|
"publish-lib": "npm publish --registry https://registry.npmjs.org"
|
package/src/buildTag.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// 同步执行exe命令
|
|
2
|
+
const exec = require('child_process').execSync;
|
|
3
|
+
// 文件管理器
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
// 控制台输出样式控件
|
|
6
|
+
const chalk = require("chalk")
|
|
7
|
+
// 检查版本更新
|
|
8
|
+
const { checkUpdate } = require("../utils/checkVersion")
|
|
9
|
+
// 配置信息
|
|
10
|
+
const projectConfig = JSON.parse(fs.readFileSync('package.json', 'utf8'))
|
|
11
|
+
// 控制台交互
|
|
12
|
+
const { askTag } = require("../utils/askTool")
|
|
13
|
+
// 通知IM
|
|
14
|
+
const { notifyDingDing } = require("../utils/NotifyIM")
|
|
15
|
+
/**
|
|
16
|
+
* 打包基础SDK,并发布到NPM
|
|
17
|
+
*/
|
|
18
|
+
class Builder {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.user = exec("git config user.name").toString("utf8").trim();
|
|
21
|
+
}
|
|
22
|
+
async init() {
|
|
23
|
+
let res = await checkUpdate();
|
|
24
|
+
if (!res) {
|
|
25
|
+
let toTag = await askTag('请选择要创建的Tag:');
|
|
26
|
+
let fromTag = await askTag('基于哪个Tag创建:');
|
|
27
|
+
if (toTag.type == fromTag.type) {
|
|
28
|
+
console.log()
|
|
29
|
+
console.log(chalk.red("无法创建Tag:\n\n" + "from:" + fromTag.type + "\n" + "to:" + toTag.type))
|
|
30
|
+
console.log()
|
|
31
|
+
} else {
|
|
32
|
+
if (this.setTag(toTag.type, fromTag.type)) {
|
|
33
|
+
let version = exec(`git log ${fromTag.type} -1 --oneline`).toString("utf-8").split(" ")[1];
|
|
34
|
+
notifyDingDing(toTag.type, version, projectConfig, this.user)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 设置Tags
|
|
42
|
+
*/
|
|
43
|
+
setTag(toTag, fromTag) {
|
|
44
|
+
console.log(chalk.green('开始创建Tag,请稍后...'));
|
|
45
|
+
try {
|
|
46
|
+
// 更新tag
|
|
47
|
+
exec("git fetch --tags -f")
|
|
48
|
+
} catch (error) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
// 删除本地Tag
|
|
54
|
+
exec("git tag -d " + toTag)
|
|
55
|
+
} catch (error) {
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
// 删除远程Tag
|
|
60
|
+
exec("git push origin :refs/tags/" + toTag)
|
|
61
|
+
} catch (error) {
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 添加tag
|
|
65
|
+
exec("git tag " + toTag + " " + fromTag + " -f")
|
|
66
|
+
|
|
67
|
+
// 推送tag
|
|
68
|
+
exec("git push --tags")
|
|
69
|
+
|
|
70
|
+
console.log(chalk.green('Tag设置成功!'));
|
|
71
|
+
console.log();
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
module.exports = Builder;
|
package/src/publishProject.js
CHANGED
|
@@ -34,6 +34,7 @@ class Publish {
|
|
|
34
34
|
* language:是否更新多语言,'1'更新,'0'不更新
|
|
35
35
|
* buildType:打包方式,online-云打包,local-本地打包
|
|
36
36
|
* user:打包用户
|
|
37
|
+
* update:代码不同步的时候,是否强制更新代码
|
|
37
38
|
*/
|
|
38
39
|
this.args = new Map();
|
|
39
40
|
this.arguments = process.argv.splice(2).map((item) => {
|
|
@@ -41,14 +42,13 @@ class Publish {
|
|
|
41
42
|
this.args.set(arr[0], arr[1]);
|
|
42
43
|
});
|
|
43
44
|
this.user = this.args.get("user") || exec("git config user.name").toString("utf8").trim();
|
|
44
|
-
console.log(this.args);
|
|
45
|
-
|
|
46
45
|
}
|
|
47
46
|
/**
|
|
48
47
|
* 初始化
|
|
49
48
|
*/
|
|
50
49
|
async init() {
|
|
51
50
|
// 检查cli版本,提示用户更新:false:不更新,true:更新
|
|
51
|
+
// let update = false
|
|
52
52
|
let update = await checkUpdate();
|
|
53
53
|
if (!update) {
|
|
54
54
|
// 1:版本发布信息,包含发布版本类型信息
|
|
@@ -88,10 +88,9 @@ class Publish {
|
|
|
88
88
|
console.log();
|
|
89
89
|
console.log(chalk.green('待发布版本:' + version));
|
|
90
90
|
console.log();
|
|
91
|
-
|
|
92
91
|
// 3.1:将版本信息写入env文件中,公其他业务使用
|
|
93
92
|
try {
|
|
94
|
-
fs.writeFileSync(".env.production", "VUE_APP_PROJECT_VERSION = " + version, 'utf-8')
|
|
93
|
+
fs.writeFileSync(".env.production", "VUE_APP_PROJECT_VERSION = " + condition.type + "-" + version, 'utf-8')
|
|
95
94
|
} catch (error) {
|
|
96
95
|
}
|
|
97
96
|
|
|
@@ -135,7 +134,7 @@ class Publish {
|
|
|
135
134
|
}
|
|
136
135
|
|
|
137
136
|
// 8:发布代码并设置tags,触发发布,飞书提醒
|
|
138
|
-
if (pushCodeAndTags([condition.type])) {
|
|
137
|
+
if (pushCodeAndTags([condition.type], this.args.get("update"))) {
|
|
139
138
|
if (projectConfig && projectConfig.config) {
|
|
140
139
|
jenkins(projectConfig.config["jenkins-" + condition.type])
|
|
141
140
|
}
|
|
@@ -152,7 +151,7 @@ class Publish {
|
|
|
152
151
|
/**
|
|
153
152
|
* 编译代码
|
|
154
153
|
* @param {发布类型} types:Dev,uat,Release,GA,RC
|
|
155
|
-
* @param {发布版本} versions:
|
|
154
|
+
* @param {发布版本} versions:V12.0.0
|
|
156
155
|
* @returns
|
|
157
156
|
*/
|
|
158
157
|
async build() {
|
|
@@ -207,7 +206,7 @@ class Publish {
|
|
|
207
206
|
|
|
208
207
|
<body>
|
|
209
208
|
<div style="font-size: 20px">
|
|
210
|
-
<div
|
|
209
|
+
<div>${projectConfig.name}</div>
|
|
211
210
|
<div style="margin-left:48px">
|
|
212
211
|
<div>分支:${branch}</div>
|
|
213
212
|
<div>版本号:${version}</div>
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
const exec = require('child_process').execSync;
|
|
2
|
+
const chalk = require("chalk")
|
|
3
|
+
// 文件编辑对象
|
|
4
|
+
const fs = require("fs")
|
|
5
|
+
// 配置信息
|
|
6
|
+
const projectConfig = JSON.parse(fs.readFileSync('package.json', 'utf8'))
|
|
7
|
+
// 网页转换器
|
|
8
|
+
const { change } = require("../utils/md2html")
|
|
9
|
+
// 检查版本更新
|
|
10
|
+
const { checkUpdate } = require("../utils/checkVersion")
|
|
11
|
+
// 控制台交互
|
|
12
|
+
const { askType, askTypeOther, askBuildType } = require("../utils/askTool")
|
|
13
|
+
// 提交代码,设置Tag
|
|
14
|
+
const { getNewVersionName, pushCodeAndTags } = require("../utils/pushCode")
|
|
15
|
+
// 触发构建器
|
|
16
|
+
const { jenkins } = require("../utils/trigger")
|
|
17
|
+
// 通知飞书
|
|
18
|
+
const { notifyFeishu, notifyDingDing } = require("../utils/notifyIM")
|
|
19
|
+
// 时间库
|
|
20
|
+
const dayjs = require("dayjs")
|
|
21
|
+
/**
|
|
22
|
+
* 项目打包发布脚本
|
|
23
|
+
*/
|
|
24
|
+
class Publish {
|
|
25
|
+
constructor() {
|
|
26
|
+
/**
|
|
27
|
+
* 控制台参数:key=value
|
|
28
|
+
* type:发布的tag
|
|
29
|
+
* branch:使用的分支
|
|
30
|
+
* language:是否更新多语言,'1'更新,'0'不更新
|
|
31
|
+
* buildType:打包方式,online-云打包,local-本地打包
|
|
32
|
+
* user:打包用户
|
|
33
|
+
* update:代码不同步的时候,是否强制更新代码
|
|
34
|
+
*/
|
|
35
|
+
this.args = new Map();
|
|
36
|
+
this.arguments = process.argv.splice(2).map((item) => {
|
|
37
|
+
let arr = item.split("=");
|
|
38
|
+
this.args.set(arr[0], arr[1]);
|
|
39
|
+
});
|
|
40
|
+
this.user = this.args.get("user") || exec("git config user.name").toString("utf8").trim();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 初始化
|
|
44
|
+
*/
|
|
45
|
+
async init() {
|
|
46
|
+
// 检查cli版本,提示用户更新:false:不更新,true:更新
|
|
47
|
+
// let update = false
|
|
48
|
+
let update = await checkUpdate();
|
|
49
|
+
if (!update) {
|
|
50
|
+
// 1:版本发布信息,包含发布版本类型信息
|
|
51
|
+
let condition = {};
|
|
52
|
+
// 2:检查命令行是否输入了发布版本信息,如果没有包含,那么询问发布类型
|
|
53
|
+
if (this.args.get("type")) {
|
|
54
|
+
condition.type = this.args.get("type")
|
|
55
|
+
} else {
|
|
56
|
+
// 询问发布类型
|
|
57
|
+
condition = await askType();
|
|
58
|
+
if ("other" == condition.type) {
|
|
59
|
+
condition = await askTypeOther();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// 3:获取新的发布版本号
|
|
63
|
+
let version = getNewVersionName([condition.type])
|
|
64
|
+
console.log();
|
|
65
|
+
console.log(chalk.green('待发布版本:' + version));
|
|
66
|
+
console.log();
|
|
67
|
+
// 4:开始打包
|
|
68
|
+
if (await this.build()) {
|
|
69
|
+
// 5:将readme生成为html,并复制到dist中
|
|
70
|
+
let outPath = "dist"
|
|
71
|
+
// 读取配置,是否改变了输出路径
|
|
72
|
+
if (projectConfig.config && projectConfig.config["doc-path"]) {
|
|
73
|
+
outPath = projectConfig.config["doc-path"];
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
// 设置readme文件位置
|
|
77
|
+
change("README", outPath);
|
|
78
|
+
} catch (error) {
|
|
79
|
+
console.log(chalk.red("README写入异常:" + error))
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
// 6:写入版本信息
|
|
84
|
+
this.writeVersion(version, outPath);
|
|
85
|
+
} catch (error) {
|
|
86
|
+
console.log(chalk.red("版本信息写入异常:" + error))
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// 7:发布代码并设置tags,触发发布,飞书提醒
|
|
90
|
+
if (pushCodeAndTags([condition.type], this.args.get("update"))) {
|
|
91
|
+
if (projectConfig && projectConfig.config) {
|
|
92
|
+
jenkins(projectConfig.config["jenkins-" + condition.type])
|
|
93
|
+
}
|
|
94
|
+
notifyDingDing(condition.type, version, projectConfig, this.user)
|
|
95
|
+
console.log();
|
|
96
|
+
console.log(chalk.green('发布完成'));
|
|
97
|
+
console.log();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 编译代码
|
|
105
|
+
* @param {发布类型} types:Dev,uat,Release,GA,RC
|
|
106
|
+
* @param {发布版本} versions:V12.0.0
|
|
107
|
+
* @returns
|
|
108
|
+
*/
|
|
109
|
+
async build() {
|
|
110
|
+
console.log(chalk.green('开始编译,请稍后...'));
|
|
111
|
+
console.log();
|
|
112
|
+
// 打包命令
|
|
113
|
+
try {
|
|
114
|
+
exec('cli.exe publish --platform h5 --project ' + projectConfig.name);
|
|
115
|
+
console.log(chalk.green('编译成功!'));
|
|
116
|
+
console.log();
|
|
117
|
+
return true;
|
|
118
|
+
} catch (error) {
|
|
119
|
+
console.log(chalk.red('编译失败!' + error.toString()));
|
|
120
|
+
return false
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 将版本信息写入文件
|
|
126
|
+
* @param {版本信息} version
|
|
127
|
+
* @param {输出路径} outPath
|
|
128
|
+
*/
|
|
129
|
+
writeVersion(version, outPath = "dist") {
|
|
130
|
+
try {
|
|
131
|
+
// 获得分支信息
|
|
132
|
+
let branch = exec('git rev-parse --abbrev-ref HEAD');
|
|
133
|
+
branch = branch.toString("utf8").trim();
|
|
134
|
+
// 获得提交版本信息
|
|
135
|
+
var gitHEAD = fs.readFileSync('.git/HEAD', 'utf-8').trim()
|
|
136
|
+
var ref = gitHEAD.split(': ')[1]
|
|
137
|
+
var develop = gitHEAD.split('/')[2]
|
|
138
|
+
var gitVersion = fs.readFileSync('.git/' + ref, 'utf-8').trim()
|
|
139
|
+
var gitCommitVersion = '"' + develop + ': ' + gitVersion + '"'
|
|
140
|
+
|
|
141
|
+
let versionInfo =
|
|
142
|
+
`
|
|
143
|
+
<!DOCTYPE html>
|
|
144
|
+
<html lang="en">
|
|
145
|
+
|
|
146
|
+
<head>
|
|
147
|
+
<meta charset="UTF-8">
|
|
148
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
149
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
150
|
+
<title>版本信息</title>
|
|
151
|
+
</head>
|
|
152
|
+
|
|
153
|
+
<body>
|
|
154
|
+
<div style="font-size: 20px">
|
|
155
|
+
<div>${projectConfig.name}</div>
|
|
156
|
+
<div style="margin-left:48px">
|
|
157
|
+
<div>分支:${branch}</div>
|
|
158
|
+
<div>版本号:${version}</div>
|
|
159
|
+
<div>提交Hash:${gitCommitVersion}</div>
|
|
160
|
+
<div>发布时间:${dayjs().format('YYYY-MM-DD HH:mm:ss')}</div>
|
|
161
|
+
<div>发布人员:${this.user}</div>
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
</body>
|
|
165
|
+
|
|
166
|
+
</html>
|
|
167
|
+
`
|
|
168
|
+
fs.writeFileSync(outPath + "/version.html", versionInfo, 'utf-8');
|
|
169
|
+
return true
|
|
170
|
+
} catch (error) {
|
|
171
|
+
return false
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
module.exports = Publish;
|
|
177
|
+
|
|
178
|
+
|
package/utils/askTool.js
CHANGED
|
@@ -18,6 +18,20 @@ let choices = [
|
|
|
18
18
|
]
|
|
19
19
|
|
|
20
20
|
module.exports = {
|
|
21
|
+
/**
|
|
22
|
+
* 询问要创建的tag名称
|
|
23
|
+
* @returns 结果
|
|
24
|
+
*/
|
|
25
|
+
askTag: (message) => {
|
|
26
|
+
const prompt = [{
|
|
27
|
+
type: 'list',
|
|
28
|
+
message,
|
|
29
|
+
name: 'type',
|
|
30
|
+
choices: choices,
|
|
31
|
+
}
|
|
32
|
+
];
|
|
33
|
+
return inquirer.prompt(prompt)
|
|
34
|
+
},
|
|
21
35
|
/**
|
|
22
36
|
* 请求版本信息
|
|
23
37
|
* @returns 结果
|
package/utils/pushCode.js
CHANGED
|
@@ -19,20 +19,20 @@ function getNewVersionName(types) {
|
|
|
19
19
|
let versions = version.split("\n");
|
|
20
20
|
// 取出第一个包含-V的版本号
|
|
21
21
|
version = versions.find((item) => {
|
|
22
|
-
return item.includes("
|
|
22
|
+
return item.includes("V");
|
|
23
23
|
})
|
|
24
24
|
if (version) {
|
|
25
25
|
// 取版本号
|
|
26
|
-
version = version.split("
|
|
26
|
+
version = version.split("V")[1]
|
|
27
27
|
// 改变版本号
|
|
28
28
|
version = changeVersion.change(version, item)
|
|
29
29
|
// 生成最后的版本号
|
|
30
|
-
item =
|
|
30
|
+
item = "V" + version
|
|
31
31
|
} else {
|
|
32
|
-
item =
|
|
32
|
+
item = "V0.0.1"
|
|
33
33
|
}
|
|
34
34
|
} else {
|
|
35
|
-
item =
|
|
35
|
+
item = "V0.0.1"
|
|
36
36
|
}
|
|
37
37
|
return item;
|
|
38
38
|
})
|
|
@@ -40,8 +40,11 @@ function getNewVersionName(types) {
|
|
|
40
40
|
|
|
41
41
|
/**
|
|
42
42
|
* 将代码推送至gitlab
|
|
43
|
+
* @param {version} 版本号
|
|
44
|
+
* @param {update} 是否强制更新:1强制更新,0不强制更新
|
|
45
|
+
* @returns true 成功,false 失败
|
|
43
46
|
*/
|
|
44
|
-
function push(version) {
|
|
47
|
+
function push(version, update = "0") {
|
|
45
48
|
try {
|
|
46
49
|
// 添加改变文件
|
|
47
50
|
exec("git add .")
|
|
@@ -64,9 +67,14 @@ function push(version) {
|
|
|
64
67
|
console.log();
|
|
65
68
|
console.log(chalk.green('代码推送成功!'));
|
|
66
69
|
} catch (error) {
|
|
67
|
-
console.log(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
+
console.log("update", update);
|
|
71
|
+
if ("1" == update) {
|
|
72
|
+
exec(`git fetch --tags -f && git pull --force`)
|
|
73
|
+
} else {
|
|
74
|
+
console.log(chalk.red('代码推送失败,本地代码与线上不同步,请先 git pull 同步!'));
|
|
75
|
+
console.log();
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
70
78
|
}
|
|
71
79
|
return true
|
|
72
80
|
}
|
|
@@ -140,6 +148,13 @@ function deleteDist() {
|
|
|
140
148
|
|
|
141
149
|
}
|
|
142
150
|
|
|
151
|
+
try {
|
|
152
|
+
// 删除unpackage文件夹
|
|
153
|
+
exec("git rm -r unpackage")
|
|
154
|
+
} catch (error) {
|
|
155
|
+
|
|
156
|
+
}
|
|
157
|
+
|
|
143
158
|
try {
|
|
144
159
|
// 添加改变文件
|
|
145
160
|
exec("git add .")
|
|
@@ -163,9 +178,10 @@ function deleteDist() {
|
|
|
163
178
|
/**
|
|
164
179
|
* 发布代码同时设置Tags
|
|
165
180
|
* @param {types} 版本集合
|
|
181
|
+
* @param {update} 是否强制更新
|
|
166
182
|
*/
|
|
167
|
-
function pushCodeAndTags(types = []) {
|
|
183
|
+
function pushCodeAndTags(types = [], update = "0") {
|
|
168
184
|
let versions = getNewVersionName(types);
|
|
169
|
-
return push(versions[0]) && setTag(types, versions) && deleteDist(versions[0]);
|
|
185
|
+
return push(versions[0], update) && setTag(types, versions) && deleteDist(versions[0]);
|
|
170
186
|
}
|
|
171
187
|
module.exports = { pushCodeAndTags, push, getNewVersionName, setTag }
|