chore: refactor scripts for octokit update (#16284)

* chore: refactor scripts for octokit

* update release script

* update more octokit scripts

* cleanup

* remove unecessary refactor

* fixup package lock
This commit is contained in:
Shelley Vohr 2019-01-08 12:05:58 -08:00 committed by GitHub
parent 434f1368a0
commit 000be5d1d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 444 additions and 280 deletions

View file

@ -1,7 +1,6 @@
if (!process.env.CI) require('dotenv-safe').load()
const GitHub = require('github')
const github = new GitHub()
const octokit = require('@octokit/rest')()
if (process.argv.length < 3) {
console.log('Usage: find-release version')
@ -11,14 +10,14 @@ if (process.argv.length < 3) {
const version = process.argv[2]
async function findRelease () {
github.authenticate({ type: 'token', token: process.env.ELECTRON_GITHUB_TOKEN })
const releases = await github.repos.getReleases({
octokit.authenticate({ type: 'token', token: process.env.ELECTRON_GITHUB_TOKEN })
const releases = await octokit.repos.listReleases({
owner: 'electron',
repo: version.indexOf('nightly') > 0 ? 'nightlies' : 'electron'
})
const targetRelease = releases.data.find(release => {
return release.tag_name === version
})
const targetRelease = releases.data.find(release => release.tag_name === version)
let returnObject = {}
if (targetRelease) {

View file

@ -5,7 +5,7 @@ const args = require('minimist')(process.argv.slice(2), {
boolean: ['automaticRelease', 'notesOnly', 'stable']
})
const ciReleaseBuild = require('./ci-release-build')
const GitHub = require('github')
const octokit = require('@octokit/rest')()
const { execSync } = require('child_process')
const { GitProcess } = require('dugite')
@ -20,18 +20,14 @@ require('colors')
const pass = '\u2713'.green
const fail = '\u2717'.red
// TODO (future) automatically determine version based on conventional commits
// via conventional-recommended-bump
if (!bumpType && !args.notesOnly) {
console.log(`Usage: prepare-release [stable | beta | nightly]` +
` (--stable) (--notesOnly) (--automaticRelease) (--branch)`)
process.exit(1)
}
const github = new GitHub()
const gitDir = path.resolve(__dirname, '..')
github.authenticate({ type: 'token', token: process.env.ELECTRON_GITHUB_TOKEN })
octokit.authenticate({ type: 'token', token: process.env.ELECTRON_GITHUB_TOKEN })
async function getNewVersion (dryRun) {
if (!dryRun) {
@ -70,15 +66,15 @@ async function createRelease (branchToTarget, isBeta) {
const releaseNotes = await getReleaseNotes(branchToTarget)
const newVersion = await getNewVersion()
await tagRelease(newVersion)
const githubOpts = {
console.log(`Checking for existing draft release.`)
const releases = await octokit.repos.listReleases({
owner: 'electron',
repo: targetRepo
}
console.log(`Checking for existing draft release.`)
const releases = await github.repos.getReleases(githubOpts)
.catch(err => {
console.log(`${fail} Could not get releases. Error was: `, err)
})
}).catch(err => {
console.log(`${fail} Could not get releases. Error was: `, err)
})
const drafts = releases.data.filter(release => release.draft &&
release.tag_name === newVersion)
if (drafts.length > 0) {
@ -87,32 +83,40 @@ async function createRelease (branchToTarget, isBeta) {
process.exit(1)
}
console.log(`${pass} A draft release does not exist; creating one.`)
githubOpts.draft = true
githubOpts.name = `electron ${newVersion}`
let releaseBody
let releaseIsPrelease = false
if (isBeta) {
if (newVersion.indexOf('nightly') > 0) {
githubOpts.body = `Note: This is a nightly release. Please file new issues ` +
releaseBody = `Note: This is a nightly release. Please file new issues ` +
`for any bugs you find in it.\n \n This release is published to npm ` +
`under the nightly tag and can be installed via npm install electron@nightly, ` +
`or npm i electron@${newVersion.substr(1)}.\n \n ${releaseNotes.text}`
} else {
githubOpts.body = `Note: This is a beta release. Please file new issues ` +
releaseBody = `Note: This is a beta release. Please file new issues ` +
`for any bugs you find in it.\n \n This release is published to npm ` +
`under the beta tag and can be installed via npm install electron@beta, ` +
`or npm i electron@${newVersion.substr(1)}.\n \n ${releaseNotes.text}`
}
githubOpts.name = `${githubOpts.name}`
githubOpts.prerelease = true
releaseIsPrelease = true
} else {
githubOpts.body = releaseNotes
releaseBody = releaseNotes
}
githubOpts.tag_name = newVersion
githubOpts.target_commitish = newVersion.indexOf('nightly') !== -1 ? 'master' : branchToTarget
const release = await github.repos.createRelease(githubOpts)
.catch(err => {
console.log(`${fail} Error creating new release: `, err)
process.exit(1)
})
const release = await octokit.repos.createRelease({
owner: 'electron',
repo: targetRepo,
tag_name: newVersion,
draft: true,
name: `electron ${newVersion}`,
body: releaseBody,
prerelease: releaseIsPrelease,
target_commitish: newVersion.indexOf('nightly') !== -1 ? 'master' : branchToTarget
}).catch(err => {
console.log(`${fail} Error creating new release: `, err)
process.exit(1)
})
console.log(`Release has been created with id: ${release.data.id}.`)
console.log(`${pass} Draft release for ${newVersion} successful.`)
}
@ -123,8 +127,7 @@ async function pushRelease (branch) {
console.log(`${pass} Successfully pushed the release. Wait for ` +
`release builds to finish before running "npm run release".`)
} else {
console.log(`${fail} Error pushing the release: ` +
`${pushDetails.stderr}`)
console.log(`${fail} Error pushing the release: ${pushDetails.stderr}`)
process.exit(1)
}
}

View file

@ -2,23 +2,19 @@ const temp = require('temp')
const fs = require('fs')
const path = require('path')
const childProcess = require('child_process')
const GitHubApi = require('github')
const { getCurrentBranch } = require('./lib/utils.js')
const request = require('request')
const semver = require('semver')
const rootPackageJson = require('../package.json')
const octokit = require('@octokit/rest')({
headers: { 'User-Agent': 'electron-npm-publisher' }
})
if (!process.env.ELECTRON_NPM_OTP) {
console.error('Please set ELECTRON_NPM_OTP')
process.exit(1)
}
const github = new GitHubApi({
// debug: true,
headers: { 'User-Agent': 'electron-npm-publisher' },
followRedirects: false
})
let tempDir
temp.track() // track and cleanup files at exit
@ -72,7 +68,7 @@ new Promise((resolve, reject) => {
JSON.stringify(packageJson, null, 2)
)
return github.repos.getReleases({
return octokit.repos.listReleases({
owner: 'electron',
repo: rootPackageJson.version.indexOf('nightly') > 0 ? 'nightlies' : 'electron'
})

View file

@ -12,13 +12,12 @@ const { execSync } = require('child_process')
const { GitProcess } = require('dugite')
const { getCurrentBranch } = require('./lib/utils.js')
const GitHub = require('github')
const octokit = require('@octokit/rest')()
const path = require('path')
const github = new GitHub()
const gitDir = path.resolve(__dirname, '..')
github.authenticate({
octokit.authenticate({
type: 'token',
token: process.env.ELECTRON_GITHUB_TOKEN
})
@ -44,17 +43,17 @@ async function revertBumpCommit (tag) {
async function deleteDraft (releaseId, targetRepo) {
try {
const result = await github.repos.getRelease({
const result = await octokit.repos.getRelease({
owner: 'electron',
repo: targetRepo,
id: parseInt(releaseId, 10)
release_id: parseInt(releaseId, 10)
})
console.log(result)
if (!result.data.draft) {
console.log(`${fail} published releases cannot be deleted.`)
return false
} else {
await github.repos.deleteRelease({
await octokit.repos.deleteRelease({
owner: 'electron',
repo: targetRepo,
release_id: result.data.id
@ -70,7 +69,7 @@ async function deleteDraft (releaseId, targetRepo) {
async function deleteTag (tag, targetRepo) {
try {
await github.gitdata.deleteReference({
await octokit.git.deleteRef({
owner: 'electron',
repo: targetRepo,
ref: tag

View file

@ -13,7 +13,6 @@ const args = require('minimist')(process.argv.slice(2), {
})
const fs = require('fs')
const { execSync } = require('child_process')
const GitHub = require('github')
const nugget = require('nugget')
const pkg = require('../package.json')
const pkgVersion = `v${pkg.version}`
@ -23,25 +22,27 @@ const fail = '\u2717'.red
const sumchecker = require('sumchecker')
const temp = require('temp').track()
const { URL } = require('url')
const octokit = require('@octokit/rest')()
octokit.authenticate({
type: 'token',
token: process.env.ELECTRON_GITHUB_TOKEN
})
const targetRepo = pkgVersion.indexOf('nightly') > 0 ? 'nightlies' : 'electron'
let failureCount = 0
const github = new GitHub({
followRedirects: false
})
github.authenticate({ type: 'token', token: process.env.ELECTRON_GITHUB_TOKEN })
async function getDraftRelease (version, skipValidation) {
const releaseInfo = await github.repos.getReleases({ owner: 'electron', repo: targetRepo })
let versionToCheck
if (version) {
versionToCheck = version
} else {
versionToCheck = pkgVersion
}
const drafts = releaseInfo.data
.filter(release => release.tag_name === versionToCheck &&
release.draft === true)
const releaseInfo = await octokit.repos.listReleases({
owner: 'electron',
repo: targetRepo
})
const versionToCheck = version || pkgVersion
const drafts = releaseInfo.data.filter(release => {
return release.tag_name === versionToCheck && release.draft === true
})
const draft = drafts[0]
if (!skipValidation) {
failureCount = 0
@ -165,9 +166,7 @@ function runScript (scriptName, scriptArgs, cwd) {
const scriptOptions = {
encoding: 'UTF-8'
}
if (cwd) {
scriptOptions.cwd = cwd
}
if (cwd) scriptOptions.cwd = cwd
try {
return execSync(scriptCommand, scriptOptions)
} catch (err) {
@ -195,10 +194,10 @@ async function createReleaseShasums (release) {
const existingAssets = release.assets.filter(asset => asset.name === fileName)
if (existingAssets.length > 0) {
console.log(`${fileName} already exists on GitHub; deleting before creating new file.`)
await github.repos.deleteAsset({
await octokit.repos.deleteReleaseAsset({
owner: 'electron',
repo: targetRepo,
id: existingAssets[0].id
asset_id: existingAssets[0].id
}).catch(err => {
console.log(`${fail} Error deleting ${fileName} on GitHub:`, err)
})
@ -206,26 +205,30 @@ async function createReleaseShasums (release) {
console.log(`Creating and uploading the release ${fileName}.`)
const scriptPath = path.join(__dirname, 'merge-electron-checksums.py')
const checksums = runScript(scriptPath, ['-v', pkgVersion])
console.log(`${pass} Generated release SHASUMS.`)
const filePath = await saveShaSumFile(checksums, fileName)
console.log(`${pass} Created ${fileName} file.`)
await uploadShasumFile(filePath, fileName, release)
await uploadShasumFile(filePath, fileName, release.id)
console.log(`${pass} Successfully uploaded ${fileName} to GitHub.`)
}
async function uploadShasumFile (filePath, fileName, release) {
const githubOpts = {
owner: 'electron',
repo: targetRepo,
id: release.id,
filePath,
async function uploadShasumFile (filePath, fileName, releaseId) {
const uploadUrl = `https://uploads.github.com/repos/electron/${targetRepo}/releases/${releaseId}/assets{?name,label}`
return octokit.repos.uploadReleaseAsset({
url: uploadUrl,
headers: {
'content-type': 'text/plain',
'content-size': fs.statSync(filePath).size
},
file: fs.createReadStream(filePath),
name: fileName
}
return github.repos.uploadAsset(githubOpts)
.catch(err => {
console.log(`${fail} Error uploading ${filePath} to GitHub:`, err)
process.exit(1)
})
}).catch(err => {
console.log(`${fail} Error uploading ${filePath} to GitHub:`, err)
process.exit(1)
})
}
function saveShaSumFile (checksums, fileName) {
@ -249,18 +252,16 @@ function saveShaSumFile (checksums, fileName) {
}
async function publishRelease (release) {
const githubOpts = {
return octokit.repos.updateRelease({
owner: 'electron',
repo: targetRepo,
id: release.id,
release_id: release.id,
tag_name: release.tag_name,
draft: false
}
return github.repos.editRelease(githubOpts)
.catch(err => {
console.log(`${fail} Error publishing release:`, err)
process.exit(1)
})
}).catch(err => {
console.log(`${fail} Error publishing release:`, err)
process.exit(1)
})
}
async function makeRelease (releaseToValidate) {
@ -280,6 +281,7 @@ async function makeRelease (releaseToValidate) {
uploadIndexJson()
await createReleaseShasums(draftRelease)
// Fetch latest version of release before verifying
draftRelease = await getDraftRelease(pkgVersion, true)
await validateReleaseAssets(draftRelease)
@ -303,24 +305,26 @@ async function makeTempDir () {
async function verifyAssets (release) {
const downloadDir = await makeTempDir()
const githubOpts = {
owner: 'electron',
repo: targetRepo,
headers: {
Accept: 'application/octet-stream'
}
}
console.log(`Downloading files from GitHub to verify shasums`)
const shaSumFile = 'SHASUMS256.txt'
let filesToCheck = await Promise.all(release.assets.map(async (asset) => {
githubOpts.id = asset.id
const assetDetails = await github.repos.getAsset(githubOpts)
let filesToCheck = await Promise.all(release.assets.map(async asset => {
const assetDetails = await octokit.repos.getReleaseAsset({
owner: 'electron',
repo: targetRepo,
asset_id: asset.id,
headers: {
Accept: 'application/octet-stream'
}
})
await downloadFiles(assetDetails.meta.location, downloadDir, asset.name)
return asset.name
})).catch(err => {
console.log(`${fail} Error downloading files from GitHub`, err)
process.exit(1)
})
filesToCheck = filesToCheck.filter(fileName => fileName !== shaSumFile)
let checkerOpts
await validateChecksums({

View file

@ -1,7 +1,5 @@
const cp = require('child_process')
const utils = require('./lib/utils')
const electronPath = utils.getAbsoluteElectronExec()
const child = cp.spawn(electronPath, process.argv.slice(2), { stdio: 'inherit' })

View file

@ -1,48 +1,68 @@
if (!process.env.CI) require('dotenv-safe').load()
const GitHub = require('github')
const github = new GitHub()
github.authenticate({ type: 'token', token: process.env.ELECTRON_GITHUB_TOKEN })
const fs = require('fs')
const octokit = require('@octokit/rest')()
octokit.authenticate({ type: 'token', token: process.env.ELECTRON_GITHUB_TOKEN })
if (process.argv.length < 6) {
console.log('Usage: upload-to-github filePath fileName releaseId')
process.exit(1)
}
const filePath = process.argv[2]
const fileName = process.argv[3]
const releaseId = process.argv[4]
const releaseVersion = process.argv[5]
const targetRepo = releaseVersion.indexOf('nightly') > 0 ? 'nightlies' : 'electron'
const getHeaders = (filePath, fileName) => {
const extension = fileName.split('.').pop()
const size = fs.statSync(filePath).size
const options = {
'json': 'text/json',
'zip': 'application/zip',
'txt': 'text/plain'
}
const githubOpts = {
owner: 'electron',
repo: targetRepo,
id: releaseId,
filePath: filePath,
name: fileName
return {
'content-type': options[extension],
'content-length': size
}
}
const targetRepo = releaseVersion.indexOf('nightly') > 0 ? 'nightlies' : 'electron'
const uploadUrl = `https://uploads.github.com/repos/electron/${targetRepo}/releases/${releaseId}/assets{?name,label}`
let retry = 0
function uploadToGitHub () {
github.repos.uploadAsset(githubOpts).then(() => {
octokit.repos.uploadReleaseAsset({
url: uploadUrl,
headers: getHeaders(filePath, fileName),
file: fs.createReadStream(filePath),
name: fileName
}).then(() => {
console.log(`Successfully uploaded ${fileName} to GitHub.`)
process.exit()
}).catch((err) => {
if (retry < 4) {
console.log(`Error uploading ${fileName} to GitHub, will retry. Error was:`, err)
retry++
github.repos.getRelease(githubOpts).then(release => {
octokit.repos.listAssetsForRelease({
owner: 'electron',
repo: targetRepo,
release_id: releaseId
}).then(assets => {
console.log('Got list of assets for existing release:')
console.log(JSON.stringify(release.data.assets, null, ' '))
const existingAssets = release.data.assets.filter(asset => asset.name === fileName)
console.log(JSON.stringify(assets.data, null, ' '))
const existingAssets = assets.data.filter(asset => asset.name === fileName)
if (existingAssets.length > 0) {
console.log(`${fileName} already exists; will delete before retrying upload.`)
github.repos.deleteAsset({
octokit.repos.deleteReleaseAsset({
owner: 'electron',
repo: targetRepo,
id: existingAssets[0].id
asset_id: existingAssets[0].id
}).catch((deleteErr) => {
console.log(`Failed to delete existing asset ${fileName}. Error was:`, deleteErr)
}).then(uploadToGitHub)