Skip to content

Commit 1e17b33

Browse files
committed
implement branch-based variant releases and update deps
1 parent 862b01d commit 1e17b33

File tree

5 files changed

+1285
-734
lines changed

5 files changed

+1285
-734
lines changed

gulp.d/tasks/release.js

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,62 @@
11
'use strict'
22

3+
const File = require('vinyl')
34
const fs = require('fs-extra')
5+
const { obj: map } = require('through2')
46
const Octokit = require('@octokit/rest')
57
const path = require('path')
8+
const zip = require('gulp-vinyl-zip')
69

7-
module.exports = (dest, bundleName, owner, repo, token, updateMaster) => async () => {
10+
function getNextReleaseNumber ({ octokit, owner, repo, variant }) {
11+
const prefix = `${variant}-`
12+
const filter = (entry) => entry.name.startsWith(prefix)
13+
return collectReleases({ octokit, owner, repo, filter }).then((releases) => {
14+
if (releases.length) {
15+
releases.sort((a, b) => -1 * a.name.localeCompare(b.name, 'en', { numeric: true }))
16+
const latestName = releases[0].name
17+
return Number(latestName.slice(prefix.length)) + 1
18+
} else {
19+
return 1
20+
}
21+
})
22+
}
23+
24+
function collectReleases ({ octokit, owner, repo, filter, page = 1, accum = [] }) {
25+
return octokit.repos.listReleases({ owner, repo, page, per_page: 100 }).then((result) => {
26+
const releases = result.data.filter(filter)
27+
const links = result.headers.link
28+
if (links && links.includes('; rel="next"')) {
29+
return collectReleases({ octokit, owner, repo, filter, page: page + 1, accum: accum.concat(releases) })
30+
} else {
31+
return accum.concat(releases)
32+
}
33+
})
34+
}
35+
36+
function versionBundle (bundleFile, tagName) {
37+
return new Promise((resolve, reject) =>
38+
zip.src(bundleFile)
39+
.on('error', reject)
40+
.pipe((() => {
41+
const meta = new File({ path: 'ui.yml', contents: Buffer.from(`version: ${tagName}\n`) })
42+
const stream = map((file, _, next) => file.path === meta.path && file !== meta ? next() : next(null, file))
43+
stream.write(meta)
44+
return stream
45+
})())
46+
.pipe(zip.dest(bundleFile))
47+
.on('finish', () => resolve(bundleFile))
48+
)
49+
}
50+
51+
module.exports = (dest, bundleName, owner, repo, token, updateBranch) => async () => {
852
const octokit = new Octokit({ auth: `token ${token}` })
9-
const {
10-
data: { tag_name: lastTagName },
11-
} = await octokit.repos.getLatestRelease({ owner, repo }).catch(() => ({ data: { tag_name: 'v0' } }))
12-
const tagName = `v${Number(lastTagName.substr(1)) + 1}`
13-
const ref = 'heads/master'
53+
const branchName = process.env.GIT_BRANCH || 'master'
54+
const variant = branchName === 'master' ? 'prod' : branchName
55+
const ref = `heads/${branchName}`
56+
const tagName = `${variant}-${await getNextReleaseNumber({ octokit, owner, repo, variant })}`
1457
const message = `Release ${tagName}`
1558
const bundleFileBasename = `${bundleName}-bundle.zip`
16-
const bundleFile = path.join(dest, bundleFileBasename)
59+
const bundleFile = await versionBundle(path.join(dest, bundleFileBasename), tagName)
1760
let commit = await octokit.gitdata.getRef({ owner, repo, ref }).then((result) => result.data.object.sha)
1861
const readmeContent = await fs
1962
.readFile('README.adoc', 'utf-8')
@@ -35,7 +78,7 @@ module.exports = (dest, bundleName, owner, repo, token, updateMaster) => async (
3578
commit = await octokit.gitdata
3679
.createCommit({ owner, repo, message, tree, parents: [commit] })
3780
.then((result) => result.data.sha)
38-
if (updateMaster) await octokit.gitdata.updateRef({ owner, repo, ref, sha: commit })
81+
if (updateBranch) await octokit.gitdata.updateRef({ owner, repo, ref, sha: commit })
3982
const uploadUrl = await octokit.repos
4083
.createRelease({
4184
owner,

gulp.d/tasks/serve.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ function decorateLog (_, app) {
2727
}
2828

2929
function getLocalIp () {
30-
for (let records of Object.values(os.networkInterfaces())) {
31-
for (let record of records) {
30+
for (const records of Object.values(os.networkInterfaces())) {
31+
for (const record of records) {
3232
if (!record.internal && record.family === 'IPv4') return record.address
3333
}
3434
}

gulpfile.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ const packTask = createTask({
8383
})
8484

8585
const releasePublishTask = createTask({
86+
desc: 'Publish the release to GitHub by attaching it to a new tag',
8687
name: 'release:publish',
8788
call: task.release(buildDir, bundleName, owner, repo, process.env.GITHUB_API_TOKEN, true),
8889
})

0 commit comments

Comments
 (0)