diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b49e9b8d42e..e5dc80638d9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,7 +36,10 @@ jobs: repo }) - const previousRelease = releases.find((r) => r.tag_name.startsWith('v7')) + const currentMajor = versionTag.match(/^v\d+/)?.[0] + const previousRelease = releases.find((r) => { + return r.tag_name !== versionTag && r.tag_name.startsWith(`${currentMajor}.`) + }) if (versionTag !== previousRelease?.tag_name) { return versionTag diff --git a/scripts/release.js b/scripts/release.js index 7ca72d8dd3d..111b1daac93 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -2,13 +2,26 @@ // Called from .github/workflows +const getMajorTagPrefix = (versionTag) => { + const match = /^v(\d+)\./.exec(versionTag) + return match ? `v${match[1]}` : versionTag +} + +const getPreviousRelease = ({ releases, versionTag }) => { + const majorTagPrefix = getMajorTagPrefix(versionTag) + + return releases.find((release) => { + return release.tag_name !== versionTag && release.tag_name.startsWith(`${majorTagPrefix}.`) + }) +} + const generateReleaseNotes = async ({ github, owner, repo, versionTag, commitHash }) => { const { data: releases } = await github.rest.repos.listReleases({ owner, repo }) - const previousRelease = releases.find((r) => r.tag_name.startsWith('v7')) + const previousRelease = getPreviousRelease({ releases, versionTag }) const { data: { body } } = await github.rest.repos.generateReleaseNotes({ owner, @@ -69,5 +82,6 @@ const release = async ({ github, context, versionTag, commitHash }) => { module.exports = { generatePr, + getPreviousRelease, release } diff --git a/test/release.js b/test/release.js new file mode 100644 index 00000000000..12d5c66b33a --- /dev/null +++ b/test/release.js @@ -0,0 +1,41 @@ +'use strict' + +const { strictEqual } = require('node:assert') +const { test } = require('node:test') +const { getPreviousRelease } = require('../scripts/release') + +test('getPreviousRelease uses the latest release from the current major line', () => { + const previousRelease = getPreviousRelease({ + versionTag: 'v8.0.1', + releases: [ + { tag_name: 'v8.0.0' }, + { tag_name: 'v7.16.0' } + ] + }) + + strictEqual(previousRelease?.tag_name, 'v8.0.0') +}) + +test('getPreviousRelease ignores the current version tag', () => { + const previousRelease = getPreviousRelease({ + versionTag: 'v8.0.1', + releases: [ + { tag_name: 'v8.0.1' }, + { tag_name: 'v8.0.0' }, + { tag_name: 'v7.16.0' } + ] + }) + + strictEqual(previousRelease?.tag_name, 'v8.0.0') +}) + +test('getPreviousRelease returns undefined when the current major has no previous releases', () => { + const previousRelease = getPreviousRelease({ + versionTag: 'v8.0.0', + releases: [ + { tag_name: 'v7.16.0' } + ] + }) + + strictEqual(previousRelease, undefined) +})