Skip to content
This repository has been archived by the owner on Mar 3, 2023. It is now read-only.

Commit

Permalink
Merge pull request #17862 from atom/dw-draft-releases
Browse files Browse the repository at this point in the history
Enable stable and beta draft release creation on VSTS
  • Loading branch information
daviwil committed Feb 8, 2019
2 parents e81f713 + 9264a66 commit af92156
Show file tree
Hide file tree
Showing 12 changed files with 1,634 additions and 421 deletions.
345 changes: 9 additions & 336 deletions script/package-lock.json

Large diffs are not rendered by default.

4 changes: 0 additions & 4 deletions script/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
"dependencies": {
"7zip-bin": "^4.0.2",
"async": "2.0.1",
"aws-sdk": "^2.5.2",
"babel-core": "5.8.38",
"coffeelint": "1.15.7",
"colors": "1.1.2",
Expand All @@ -28,10 +27,7 @@
"npm": "6.2.0",
"passwd-user": "2.1.0",
"pegjs": "0.9.0",
"publish-release": "^1.6.0",
"random-seed": "^0.3.0",
"request": "^2.87.0",
"request-promise-native": "^1.0.5",
"season": "5.3.0",
"semver": "5.3.0",
"standard": "8.4.0",
Expand Down
5 changes: 0 additions & 5 deletions script/publish-release.cmd

This file was deleted.

11 changes: 6 additions & 5 deletions script/vsts/get-release-version.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const argv = yargs
.argv

async function getReleaseVersion () {
let releaseVersion = appMetadata.version
let releaseVersion = process.env.ATOM_RELEASE_VERSION || appMetadata.version
if (argv.nightly) {
const releases = await request({
url: 'https://api.github.com/repos/atom/atom-nightly-releases/releases',
Expand Down Expand Up @@ -42,16 +42,17 @@ async function getReleaseVersion () {
if (!process.env.SYSTEM_PULLREQUEST_PULLREQUESTNUMBER) {
// Only set the build number on non-PR builds as it causes build errors when
// non-admins send PRs to the repo
console.log(`##vso[build.updatebuildnumber]${releaseVersion}+${process.env.BUILD_BUILDNUMBER}`)
console.log(`##vso[build.updatebuildnumber]${releaseVersion}+${process.env.BUILD_BUILDID}`)
}

// Write out some variables that indicate whether artifacts should be uploaded
const buildBranch = process.env.BUILD_SOURCEBRANCHNAME
const isReleaseBranch = process.env.IS_RELEASE_BRANCH || argv.nightly || buildBranch.match(/\d\.\d+-releases/) !== null
const isSignedZipBranch =
process.env.IS_SIGNED_ZIP_BRANCH ||
buildBranch.startsWith('electron-') ||
buildBranch === 'master' && !process.env.SYSTEM_PULLREQUEST_PULLREQUESTNUMBER
!isReleaseBranch &&
(process.env.IS_SIGNED_ZIP_BRANCH ||
buildBranch.startsWith('electron-') ||
buildBranch === 'master' && !process.env.SYSTEM_PULLREQUEST_PULLREQUESTNUMBER)
console.log(`##vso[task.setvariable variable=IsReleaseBranch;isOutput=true]${isReleaseBranch}`)
console.log(`##vso[task.setvariable variable=IsSignedZipBranch;isOutput=true]${isSignedZipBranch}`)
}
Expand Down
130 changes: 130 additions & 0 deletions script/vsts/lib/release-notes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
const semver = require('semver')
const octokit = require('@octokit/rest')()
const changelog = require('pr-changelog')
const childProcess = require('child_process')

module.exports.get = async function (releaseVersion, githubToken) {
if (githubToken) {
octokit.authenticate({
type: 'oauth',
token: githubToken
})
}

const releases = await octokit.repos.getReleases({owner: 'atom', repo: 'atom'})
const release = releases.data.find(r => semver.eq(r.name, releaseVersion))
return release ? release.body : undefined
}

module.exports.generateForVersion = async function (releaseVersion, githubToken, oldReleaseNotes) {
let oldVersion = null
let oldVersionName = null
const parsedVersion = semver.parse(releaseVersion)
const newVersionBranch = getBranchForVersion(parsedVersion)

if (githubToken) {
changelog.setGithubAccessToken(githubToken)
octokit.authenticate({
type: 'oauth',
token: githubToken
})
}

if (parsedVersion.prerelease && parsedVersion.prerelease[0] === 'beta0') {
// For beta0 releases, stable hasn't been released yet so compare against
// the stable version's release branch
oldVersion = `${parsedVersion.major}.${parsedVersion.minor - 1}-releases`
oldVersionName = `v${parsedVersion.major}.${parsedVersion.minor - 1}.0`
} else {
let releases = await octokit.repos.getReleases({owner: 'atom', repo: 'atom'})
oldVersion = 'v' + getPreviousRelease(releaseVersion, releases.data).name
oldVersionName = oldVersion
}

const allChangesText = await changelog.getChangelog({
owner: 'atom',
repo: 'atom',
fromTag: oldVersion,
toTag: newVersionBranch,
dependencyKey: 'packageDependencies',
changelogFormatter: function ({pullRequests, owner, repo, fromTag, toTag}) {
let prString = changelog.pullRequestsToString(pullRequests)
let title = repo
if (repo === 'atom') {
title = 'Atom Core'
fromTag = oldVersionName
toTag = releaseVersion
}
return `### [${title}](https://github.com/${owner}/${repo})\n\n${fromTag}...${toTag}\n\n${prString}`
}
})

const writtenReleaseNotes =
extractWrittenReleaseNotes(oldReleaseNotes) ||
'**TODO**: Pull relevant changes here!'

return `## Notable Changes\n
${writtenReleaseNotes}\n
<details>
<summary>All Changes</summary>\n
${allChangesText}
</details>
`
}

module.exports.generateForNightly = async function (releaseVersion, githubToken) {
const releases = await octokit.repos.getReleases({owner: 'atom', repo: 'atom-nightly-releases'})
const previousRelease = getPreviousRelease(releaseVersion, releases.data)
const oldReleaseNotes = previousRelease ? previousRelease.body : undefined

const latestCommitResult = childProcess.spawnSync('git', ['rev-parse', '--short', 'HEAD'])

if (latestCommitResult && oldReleaseNotes) {
const latestCommit = latestCommitResult.stdout.toString().trim()
const extractMatch = oldReleaseNotes.match(/atom\/atom\/compare\/([0-9a-f]{5,40})\.\.\.([0-9a-f]{5,40})/)
if (extractMatch) {
return `### Click [here](https://github.com/atom/atom/compare/${extractMatch[2]}...${latestCommit}) to see the changes included with this release! :atom: :night_with_stars:`
}
}

return undefined
}

function extractWrittenReleaseNotes (oldReleaseNotes) {
if (oldReleaseNotes) {
const extractMatch = oldReleaseNotes.match(/^## Notable Changes\r\n([\s\S]*)<details>/)
if (extractMatch && extractMatch[1]) {
return extractMatch[1].trim()
}
}

return undefined
}

function getPreviousRelease (version, allReleases) {
const versionIsStable = semver.prerelease(version) === null

// Make sure versions are sorted before using them
allReleases.sort((v1, v2) => semver.rcompare(v1.name, v2.name))

for (let release of allReleases) {
if (versionIsStable && semver.prerelease(release.name)) {
continue
}

if (semver.lt(release.name, version)) {
return release
}
}

return null
}

function getBranchForVersion (version) {
let parsedVersion = version
if (!(version instanceof semver.SemVer)) {
parsedVersion = semver.parse(version)
}

return `${parsedVersion.major}.${parsedVersion.minor}-releases`
}
File renamed without changes.
4 changes: 2 additions & 2 deletions script/vsts/nightly-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ jobs:
# This has to be done separately because VSTS inexplicably
# exits the script block after `npm install` completes.
- script: |
cd script
cd script\vsts
npm install
displayName: npm install
Expand All @@ -54,7 +54,7 @@ jobs:
displayName: Download Release Artifacts

- script: |
$(Build.SourcesDirectory)\script\publish-release.cmd --create-github-release --assets-path "$(System.ArtifactsDirectory)"
node $(Build.SourcesDirectory)\script\vsts\upload-artifacts.js --create-github-release --assets-path "$(System.ArtifactsDirectory)"
env:
GITHUB_TOKEN: $(GITHUB_TOKEN)
ATOM_RELEASE_VERSION: $(ReleaseVersion)
Expand Down
Loading

0 comments on commit af92156

Please sign in to comment.