-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathautojitpack.js
224 lines (201 loc) · 7.3 KB
/
autojitpack.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
// 你只管修改代码,git提交 tag++ jitpack发布均由该脚本完成
/*
基于nodejs自动发布jitpack
使用
复制当前js脚本至项目根目录 [自定义域名需要手动添加]
[export NODE_PATH=$(npm root -g)]
npm install -g shelljs axios
node autojitpack.js
脚本执行过程
进入仓库工程目录
读取基础配置
判断文件是否修改**
增加版本号/名
增加tag
push代码
pushtag
同步代码至jitpack
触发jitpack build
轮询查看build结果
[自定义域名同步 编译]
*/
'use strict'
var cfg = {
root: '', // 根目录
groupId: '', // zwping
artifactId: '', // alibx
vname: '',
vcode: '',
newVName: '', // 值等于tag值
newVCode: '',
cusGroupId: 'com.zwping', // 自定义域名, 需要单独配置
}
if (!cfg.root) cfg.root = __dirname
var fs = require('fs')
var axios = require('axios')
var shell = require('shelljs')
function echo(msg) { // 日志输出
// shell.echo(msg)
console.log('[log]: ' + msg)
}
if (shell.cd(cfg.root).code !== 0) {
echo(`工程根目录错误${cfg.root}`); return
}
echo(`进入工程根目录成功 ${cfg.root}`)
if (!shell.which('git')) {
echo('sorry, 当前环境不支持git')
shell.exit(1)
return
}
var remotev = shell.exec('git remote -v').split(' ')[0].split('\t')[1]
echo(`远程仓库地址: ${remotev}`)
if (remotev.startsWith('git@')) {
cfg.groupId = remotev.split(':')[1].split('/')[0]
cfg.artifactId = remotev.split('/')[1].replace('.git', '')
}
// echo(getDomainName())
// return
var status = shell.exec('git status')
// echo(status)
if (status.indexOf('nothing to commit') !== -1 &&
status.indexOf('git push') === -1 // commit过后未push | push失败
) {
echo('未有代码更改 end'); return
}
var mFileNum = shell.exec('git status -s -uno | wc -l').trim()
echo(`已修改 ${mFileNum} 处文件`)
function autoAddLibVersion() {
var dirs = shell.ls('').filter(f => fs.lstatSync(`${cfg.root}/${f}`).isDirectory())
// echo(`根目录下有以下文件夹${dirs}`)
dirs = dirs.map(f => `${cfg.root}/${f}`).filter(f => shell.ls(f).indexOf('build.gradle') !== -1)
for (var f of dirs) {
var file = `${f}/build.gradle`
var content = fs.readFileSync(file, 'utf-8')
if (content.indexOf('com.android.library') !== -1) {
echo(`依赖库 ${f}`)
var code, code1, name, name1
var lines = content.split('\n')
for (var line of lines) {
if (!cfg.vcode && line.indexOf('versionCode') !== -1) {
cfg.vcode = line.replace('versionCode', '').trim()
cfg.newVCode = cfg.vcode*1 + 1
code = line
code1 = line.replace(cfg.vcode, cfg.newVCode)
continue
}
if (!cfg.vname && line.indexOf('versionName "') !== -1) {
cfg.vname = line.replace('versionName', '').replace(/\"/g, '').trim()
var n = cfg.vname.split('.')
// n = (n[0]*100 + n[1]*10 + n[2]*1)*1 + 1 // x.y.z
// cfg.newVName = n.toString().padStart(3, '0').split('').join('.')
var x = n[0]*1
var y = n[1]*1
var z = n[2]*1 + 1 // zz
if (z > 99) {
z = 0; y += 1
}
if (y > 9) {
y = 0; x += 1
}
cfg.newVName = `${x}.${y}.${z.toString().padStart(2, '0')}`
name = line
name1 = line.replace(cfg.vname, cfg.newVName)
continue
}
}
echo(`版本号: ${cfg.vcode} -> ${cfg.newVCode}`)
echo(`版本名: ${cfg.vname} -> ${cfg.newVName}`)
content = content.replace(code, code1).replace(name, name1)
fs.writeFileSync(file, content, err => {
echo(`文件修改失败 ${err} ${file}`); return
})
echo(`文件修改成功${file}`)
}
}
}
autoAddLibVersion()
// return
shell.exec('git add .')
shell.exec("git commit -m 'auto sync code'")
echo('code push...')
var branch = shell.exec('git branch').split('\n').filter(it => it.indexOf('*') !== -1)[0]
branch = branch.replace('*', '').trim() // 手动获取当前分支 main/master
shell.exec(`git push origin ${branch}`)
echo('code push成功')
shell.exec(`git tag ${cfg.newVName}`)
echo('tag push...')
shell.exec(`git push origin ${cfg.newVName}`)
echo('tag push成功')
echo(`cfg对象 ${JSON.stringify(cfg)}`)
var errNum = 0
function get_builds() {
var url = `https://jitpack.io/api/builds/${getDomainName()}/${cfg.artifactId}/${cfg.newVName}`
echo(`${getCusBuildTag()}正在查询jitpack build结果`)
axios.get(url)
.then(r => {
echo(JSON.stringify(r.data))
if (!r.data.status ) {
echo(`${getCusBuildTag()}查询异常 ${url} ${JSON.stringify(r.data)}`); return
}
if (r.data.status === 'ok') {
echo(`${getCusBuildTag()}恭喜您, 自动发布jitpack成功 /撒花`)
echo(`${getCusBuildTag()}maven { url 'https://jitpack.io' }`)
var multi = r.data.modules.length>0 ? `:[${r.data.modules}]` : '' // 多lib
echo(`${getCusBuildTag()}implementation '${getDomainName()}:${cfg.artifactId}${multi}:${cfg.newVName}'`)
get_downs()
if (cfg.cusGroupId) {
errNum=0; cfg.cusGroupId = ''; get_refs(); // 第二轮同步编译
}
return
}
get_builds()
})
.catch(err => {
if (++errNum > 60*3) {
echo(`${getCusBuildTag()}jitpack 编译失败 ${err}`)
echo(url)
return
}
if (errNum%10 === 0) echo(`${getCusBuildTag()}正在重查(${errNum})jitpack build`)
setTimeout(() => get_builds(), 1000)
})
}
function get_downs() {
var url = `https://jitpack.io/api/downloads/${getDomainName()}/${cfg.artifactId}`
echo(`${getCusBuildTag()}正在查询用户使用情况`)
axios.get(url)
.then(r => {
echo(`${getCusBuildTag()}${JSON.stringify(r.data)}`)
})
.catch(err => {
echo(`${getCusBuildTag()}${err} ${url}`)
})
}
var refsNum = 0
function get_refs() {
echo(`${getCusBuildTag()}正在同步 jitpack from github`)
var url = `https://jitpack.io/api/refs/${getDomainName()}/${cfg.artifactId}`
axios.get(url)
.then(r => {
// echo(JSON.stringify(r.data))
++refsNum
var hasTag = r.data.tags.filter(it => it.tag_name === cfg.newVName)
if (hasTag.length === 0) {
setTimeout(() => get_refs(), 1000); return
}
if (refsNum > 30) {
echo(`${getCusBuildTag()}同步失败 ${url}`); return
}
get_builds()
})
.catch(err => {
echo(`${getCusBuildTag()}get_refs ${err} ${url}`)
})
}
get_refs()
function getDomainName() {
return cfg.cusGroupId ? `${cfg.cusGroupId}` : `com.github.${cfg.groupId}`
}
function getCusBuildTag() {
return cfg.cusGroupId ? '[自定义域名] ' : ''
}