Skip to content

Commit 8ce5c17

Browse files
committed
Add uploading and publish to release script
1 parent cbf0d46 commit 8ce5c17

File tree

1 file changed

+138
-1
lines changed

1 file changed

+138
-1
lines changed

script/release

Lines changed: 138 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,146 @@
11
#!/usr/bin/env node
22

3+
const childProcess = require('child_process')
4+
const fs = require('fs')
35
const request = require('request')
6+
const path = require('path')
7+
const util = require('util')
48

5-
if (!process.env.ELECTRON_API_DEMO_GITHUB_TOKEN) {
9+
const token = process.env.ELECTRON_API_DEMO_GITHUB_TOKEN
10+
const version = require('../package').version
11+
12+
if (!token) {
613
console.error('ELECTRON_API_DEMO_GITHUB_TOKEN environment variable not set')
714
console.error('Set it to a token with repo scope created from https://github.com/settings/tokens/new')
815
process.exit(1)
916
}
17+
18+
const zipAsset = (asset) => {
19+
return new Promise((resolve, reject) => {
20+
const assetBase = path.basename(asset.path)
21+
const assetDirectory = path.dirname(asset.path)
22+
console.log(`Zipping ${assetBase} to ${asset.name}`)
23+
const zipCommand = `zip --recurse-paths --symlinks '${asset.name}' '${assetBase}'`
24+
const options = {cwd: assetDirectory, maxBuffer: Infinity}
25+
childProcess.exec(zipCommand, options, (error) => {
26+
if (error) {
27+
reject(error)
28+
} else {
29+
asset.zip = path.join(assetDirectory, asset.name)
30+
resolve(asset)
31+
}
32+
})
33+
})
34+
}
35+
36+
const zipAssets = () => {
37+
const assets = [{
38+
name: 'electron-api-demos-mac.zip',
39+
path: path.join(__dirname, '..', 'out', 'Electron API Demos-darwin-x64', 'Electron API Demos.app')
40+
}]
41+
return Promise.all(assets.map(zipAsset))
42+
}
43+
44+
const createRelease = (assets) => {
45+
console.log('Creating new draft release')
46+
47+
const options = {
48+
uri: 'https://api.github.com/repos/electron/electron-api-demos/releases',
49+
headers: {
50+
Authorization: `token ${token}`,
51+
'User-Agent': `node/${process.versions.node}`
52+
},
53+
json: {
54+
tag_name: `v${version}`,
55+
target_commitish: 'master',
56+
name: version,
57+
body: 'An awesome new release :tada:',
58+
draft: true,
59+
prerelease: true
60+
}
61+
}
62+
63+
return new Promise((resolve, reject) => {
64+
request.post(options, (error, response, body) => {
65+
if (error) {
66+
return reject(Error(`Request failed: ${error.message || error}`))
67+
}
68+
if (response.statusCode !== 201) {
69+
return reject(Error(`Non-201 response: ${response.statusCode}\n${util.inspect(body)}`))
70+
}
71+
72+
resolve({assets: assets, draft: body})
73+
})
74+
})
75+
}
76+
77+
const uploadAsset = (release, asset) => {
78+
console.log(`Uploading ${asset.name} as release asset`)
79+
80+
const options = {
81+
uri: release.upload_url.replace(/\{.*$/, `?name=${asset.name}`),
82+
headers: {
83+
Authorization: `token ${token}`,
84+
'Content-Type': 'application/zip',
85+
'Content-Length': fs.statSync(asset.zip).size,
86+
'User-Agent': `node/${process.versions.node}`
87+
}
88+
}
89+
90+
return new Promise((resolve, reject) => {
91+
const assetRequest = request.post(options, (error, response, body) => {
92+
if (error) {
93+
return reject(Error(`Uploading asset failed: ${error.message || error}`))
94+
}
95+
if (response.statusCode >= 400) {
96+
return reject(Error(`400+ response: ${response.statusCode}\n${util.inspect(body)}`))
97+
}
98+
resolve(asset)
99+
})
100+
fs.createReadStream(asset.zip).pipe(assetRequest)
101+
})
102+
}
103+
104+
const uploadAssets = (release) => {
105+
return Promise.all(release.assets.map((asset) => {
106+
return uploadAsset(release.draft, asset)
107+
})).then(() => release)
108+
}
109+
110+
const publishRelease = (release) => {
111+
console.log('Publishing release')
112+
113+
const options = {
114+
uri: release.draft.url,
115+
headers: {
116+
Authorization: `token ${token}`,
117+
'User-Agent': `node/${process.versions.node}`
118+
},
119+
json: {
120+
draft: false
121+
}
122+
}
123+
124+
return new Promise((resolve, reject) => {
125+
request.post(options, (error, response, body) => {
126+
if (error) {
127+
return reject(Error(`Request failed: ${error.message || error}`))
128+
}
129+
if (response.statusCode !== 200) {
130+
return reject(Error(`Non-200 response: ${response.statusCode}\n${util.inspect(body)}`))
131+
}
132+
133+
console.log(body.html_url)
134+
resolve(body)
135+
})
136+
})
137+
}
138+
139+
zipAssets()
140+
.then(createRelease)
141+
.then(uploadAssets)
142+
.then(publishRelease)
143+
.catch((error) => {
144+
console.error(error.message || error)
145+
process.exit(1)
146+
})

0 commit comments

Comments
 (0)