From dc018c92f47bd47f1f8d79de7f63860bb9ef062d Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 3 May 2023 13:31:54 +0100 Subject: [PATCH 01/12] test: adds tests for release of repos and monorepos To ensure we can perform releases, assert dry run releases can complete successfully. --- .../fixtures/projects/a-monorepo/package.json | 7 +- .../packages/a-workspace-project/package.json | 87 +++++++++++++++ .../another-workspace-project/package.json | 87 +++++++++++++++ .../projects/an-esm-project/package.json | 103 +++++++++++++++++- test/node.js | 1 + test/release.js | 43 ++++++++ test/utils/set-up-project.js | 12 ++ 7 files changed, 338 insertions(+), 2 deletions(-) create mode 100644 test/release.js diff --git a/test/fixtures/projects/a-monorepo/package.json b/test/fixtures/projects/a-monorepo/package.json index 43b96d9eb..08af46a9e 100644 --- a/test/fixtures/projects/a-monorepo/package.json +++ b/test/fixtures/projects/a-monorepo/package.json @@ -3,8 +3,13 @@ "version": "1.0.0", "description": "", "homepage": "https://github.com/ipfs/aegir#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/ipfs-shipyard/empty-repository.git" + }, "scripts": { - "docs": "aegir docs" + "docs": "aegir docs", + "release": "aegir run release" }, "workspaces": [ "packages/*" diff --git a/test/fixtures/projects/a-monorepo/packages/a-workspace-project/package.json b/test/fixtures/projects/a-monorepo/packages/a-workspace-project/package.json index 1f998e586..b632e59dc 100644 --- a/test/fixtures/projects/a-monorepo/packages/a-workspace-project/package.json +++ b/test/fixtures/projects/a-monorepo/packages/a-workspace-project/package.json @@ -13,5 +13,92 @@ "license": "ISC", "typedoc": { "entryPoint": "./src/index.js" + }, + "scripts": { + "release": "aegir release" + }, + "release": { + "branches": [ + "main" + ], + "plugins": [ + [ + "@semantic-release/commit-analyzer", + { + "preset": "conventionalcommits", + "releaseRules": [ + { + "breaking": true, + "release": "major" + }, + { + "revert": true, + "release": "patch" + }, + { + "type": "feat", + "release": "minor" + }, + { + "type": "fix", + "release": "patch" + }, + { + "type": "docs", + "release": "patch" + }, + { + "type": "test", + "release": "patch" + }, + { + "type": "deps", + "release": "patch" + }, + { + "scope": "no-release", + "release": false + } + ] + } + ], + [ + "@semantic-release/release-notes-generator", + { + "preset": "conventionalcommits", + "presetConfig": { + "types": [ + { + "type": "feat", + "section": "Features" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "chore", + "section": "Trivial Changes" + }, + { + "type": "docs", + "section": "Documentation" + }, + { + "type": "deps", + "section": "Dependencies" + }, + { + "type": "test", + "section": "Tests" + } + ] + } + } + ], + "@semantic-release/changelog", + "@semantic-release/npm", + "@semantic-release/git" + ] } } diff --git a/test/fixtures/projects/a-monorepo/packages/another-workspace-project/package.json b/test/fixtures/projects/a-monorepo/packages/another-workspace-project/package.json index 96d160f47..c8bfbfe52 100644 --- a/test/fixtures/projects/a-monorepo/packages/another-workspace-project/package.json +++ b/test/fixtures/projects/a-monorepo/packages/another-workspace-project/package.json @@ -13,5 +13,92 @@ "license": "ISC", "typedoc": { "entryPoint": "./src/index.js" + }, + "scripts": { + "release": "aegir release" + }, + "release": { + "branches": [ + "main" + ], + "plugins": [ + [ + "@semantic-release/commit-analyzer", + { + "preset": "conventionalcommits", + "releaseRules": [ + { + "breaking": true, + "release": "major" + }, + { + "revert": true, + "release": "patch" + }, + { + "type": "feat", + "release": "minor" + }, + { + "type": "fix", + "release": "patch" + }, + { + "type": "docs", + "release": "patch" + }, + { + "type": "test", + "release": "patch" + }, + { + "type": "deps", + "release": "patch" + }, + { + "scope": "no-release", + "release": false + } + ] + } + ], + [ + "@semantic-release/release-notes-generator", + { + "preset": "conventionalcommits", + "presetConfig": { + "types": [ + { + "type": "feat", + "section": "Features" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "chore", + "section": "Trivial Changes" + }, + { + "type": "docs", + "section": "Documentation" + }, + { + "type": "deps", + "section": "Dependencies" + }, + { + "type": "test", + "section": "Tests" + } + ] + } + } + ], + "@semantic-release/changelog", + "@semantic-release/npm", + "@semantic-release/git" + ] } } diff --git a/test/fixtures/projects/an-esm-project/package.json b/test/fixtures/projects/an-esm-project/package.json index 08b1db67d..1560e1d55 100644 --- a/test/fixtures/projects/an-esm-project/package.json +++ b/test/fixtures/projects/an-esm-project/package.json @@ -3,6 +3,10 @@ "version": "1.0.0", "description": "", "homepage": "https://github.com/ipfs/aegir#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/ipfs-shipyard/empty-repository.git" + }, "exports": { ".": { "import": "./src/index.js" @@ -10,7 +14,8 @@ }, "type": "module", "scripts": { - "test": "aegir test" + "test": "aegir test", + "release": "aegir release" }, "author": "", "license": "ISC", @@ -23,5 +28,101 @@ "devDependencies": { "@types/mocha": "^10.0.1", "mocha": "^10.0.0" + }, + "release": { + "branches": [ + "main" + ], + "plugins": [ + [ + "@semantic-release/commit-analyzer", + { + "preset": "conventionalcommits", + "releaseRules": [ + { + "breaking": true, + "release": "major" + }, + { + "revert": true, + "release": "patch" + }, + { + "type": "feat", + "release": "minor" + }, + { + "type": "fix", + "release": "patch" + }, + { + "type": "chore", + "release": "patch" + }, + { + "type": "docs", + "release": "patch" + }, + { + "type": "deps", + "release": "patch" + }, + { + "type": "test", + "release": "patch" + }, + { + "scope": "no-release", + "release": false + } + ] + } + ], + [ + "@semantic-release/release-notes-generator", + { + "preset": "conventionalcommits", + "presetConfig": { + "types": [ + { + "type": "feat", + "section": "Features" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "chore", + "section": "Trivial Changes" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "chore", + "section": "Trivial Changes" + }, + { + "type": "docs", + "section": "Documentation" + }, + { + "type": "deps", + "section": "Dependencies" + }, + { + "type": "test", + "section": "Tests" + } + ] + } + } + ], + "@semantic-release/changelog", + "@semantic-release/npm", + "@semantic-release/git" + ] } } diff --git a/test/node.js b/test/node.js index ec45a8de0..5b9f40944 100644 --- a/test/node.js +++ b/test/node.js @@ -8,3 +8,4 @@ import './utils/echo-server.js' import './utils/get-port.js' import './config/user.js' import './test.js' +import './release.js' diff --git a/test/release.js b/test/release.js new file mode 100644 index 000000000..75218594e --- /dev/null +++ b/test/release.js @@ -0,0 +1,43 @@ +/* eslint-env mocha */ + +import { execa } from 'execa' +import { expect } from '../utils/chai.js' +import { setUpProject } from './utils/set-up-project.js' + +describe('release', () => { + describe('regular repo', function () { + let projectDir = '' + + before(async () => { + projectDir = await setUpProject('an-esm-project') + }) + + it('should release an esm project', async function () { + this.timeout(120 * 1000) // slow ci is slow + + const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run'], { + cwd: projectDir + }) + + expect(output.stdout).to.include('Published release 1.0.0 on default channel') + }) + }) + + describe('monorepo', function () { + let projectDir = '' + + before(async () => { + projectDir = await setUpProject('a-monorepo') + }) + + it('should release a monorepo project', async function () { + this.timeout(120 * 1000) // slow ci is slow + + const output = await execa('npm', ['run', 'release', '--', '--', '--', '--dry-run'], { + cwd: projectDir + }) + + expect(output.stdout).to.include('Published release 1.0.0 on default channel') + }) + }) +}) diff --git a/test/utils/set-up-project.js b/test/utils/set-up-project.js index 32613d7c4..09bf45e49 100644 --- a/test/utils/set-up-project.js +++ b/test/utils/set-up-project.js @@ -2,6 +2,7 @@ import path, { join } from 'path' import { fileURLToPath } from 'url' +import { execa } from 'execa' import fs, { copy } from 'fs-extra' import * as tempy from 'tempy' @@ -13,6 +14,9 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url)) export async function setUpProject (project) { const projectDir = tempy.temporaryDirectory() + // clone an empty repo + await execa('git', ['clone', 'https://github.com/ipfs-shipyard/empty-repository.git', projectDir]) + await copy(join(__dirname, '..', 'fixtures', 'projects', project), projectDir) const nodeModulesPath = path.resolve(__dirname, '../../node_modules') const projectNodeModulesPath = path.join(projectDir, 'node_modules') @@ -33,5 +37,13 @@ export async function setUpProject (project) { await fs.createSymlink(aegirPath, path.join(projectNodeModulesPath, 'aegir'), 'dir') await fs.createSymlink(path.join(aegirPath, 'src', 'index.js'), path.join(projectNodeModulesPath, '.bin', 'aegir'), 'file') + // add files and make sure we are at the tip of the tree + await execa('git', ['add', '-A'], { + cwd: projectDir + }) + await execa('git', ['commit', '-m', 'feat: initial import'], { + cwd: projectDir + }) + return projectDir } From 36b474017b4c0d073e81ae1a38db282e2825d5be Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 3 May 2023 13:36:55 +0100 Subject: [PATCH 02/12] chore: set up user --- test/utils/set-up-project.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/utils/set-up-project.js b/test/utils/set-up-project.js index 09bf45e49..d11467c5c 100644 --- a/test/utils/set-up-project.js +++ b/test/utils/set-up-project.js @@ -41,6 +41,12 @@ export async function setUpProject (project) { await execa('git', ['add', '-A'], { cwd: projectDir }) + await execa('config', ['user.email', 'you@example.com'], { + cwd: projectDir + }) + await execa('config', ['user.name', 'Your Name'], { + cwd: projectDir + }) await execa('git', ['commit', '-m', 'feat: initial import'], { cwd: projectDir }) From 3177024df49ef32a12c11fcc2be4d0fc30f1a2df Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 3 May 2023 14:38:37 +0100 Subject: [PATCH 03/12] chore: fix command --- test/utils/set-up-project.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/utils/set-up-project.js b/test/utils/set-up-project.js index d11467c5c..2f266adc0 100644 --- a/test/utils/set-up-project.js +++ b/test/utils/set-up-project.js @@ -41,10 +41,10 @@ export async function setUpProject (project) { await execa('git', ['add', '-A'], { cwd: projectDir }) - await execa('config', ['user.email', 'you@example.com'], { + await execa('git', ['config', 'user.email', 'you@example.com'], { cwd: projectDir }) - await execa('config', ['user.name', 'Your Name'], { + await execa('git', ['config', 'user.name', 'Your Name'], { cwd: projectDir }) await execa('git', ['commit', '-m', 'feat: initial import'], { From 6479e1acb47619e88e71c584085213f0bd0c0d00 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 3 May 2023 14:57:22 +0100 Subject: [PATCH 04/12] chore: add logging --- test/release.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/release.js b/test/release.js index 75218594e..79a19e4ee 100644 --- a/test/release.js +++ b/test/release.js @@ -19,6 +19,8 @@ describe('release', () => { cwd: projectDir }) + console.info('output.stdout', output.stdout) // eslint-disable-line no-console + console.info('output.stderr', output.stderr) // eslint-disable-line no-console expect(output.stdout).to.include('Published release 1.0.0 on default channel') }) }) @@ -37,6 +39,8 @@ describe('release', () => { cwd: projectDir }) + console.info('output.stdout', output.stdout) // eslint-disable-line no-console + console.info('output.stderr', output.stderr) // eslint-disable-line no-console expect(output.stdout).to.include('Published release 1.0.0 on default channel') }) }) From 6aac4b013f7a7688c6338aa3889d5685e4d18371 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 3 May 2023 15:31:39 +0100 Subject: [PATCH 05/12] chore: add no-ci flag --- test/release.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/release.js b/test/release.js index 79a19e4ee..6b11bde7f 100644 --- a/test/release.js +++ b/test/release.js @@ -15,7 +15,7 @@ describe('release', () => { it('should release an esm project', async function () { this.timeout(120 * 1000) // slow ci is slow - const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run'], { + const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci'], { cwd: projectDir }) @@ -35,7 +35,7 @@ describe('release', () => { it('should release a monorepo project', async function () { this.timeout(120 * 1000) // slow ci is slow - const output = await execa('npm', ['run', 'release', '--', '--', '--', '--dry-run'], { + const output = await execa('npm', ['run', 'release', '--', '--', '--', '--dry-run', '--no-ci'], { cwd: projectDir }) From dc7df0fcdfe1413aee15146c92aa5ef5a5d2a590 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 3 May 2023 15:37:06 +0100 Subject: [PATCH 06/12] chore: override actions var --- test/release.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/test/release.js b/test/release.js index 6b11bde7f..409f572e7 100644 --- a/test/release.js +++ b/test/release.js @@ -16,7 +16,11 @@ describe('release', () => { this.timeout(120 * 1000) // slow ci is slow const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci'], { - cwd: projectDir + cwd: projectDir, + env: { + ...process.env, + GITHUB_ACTIONS: '' + } }) console.info('output.stdout', output.stdout) // eslint-disable-line no-console @@ -36,7 +40,11 @@ describe('release', () => { this.timeout(120 * 1000) // slow ci is slow const output = await execa('npm', ['run', 'release', '--', '--', '--', '--dry-run', '--no-ci'], { - cwd: projectDir + cwd: projectDir, + env: { + ...process.env, + GITHUB_ACTIONS: '' + } }) console.info('output.stdout', output.stdout) // eslint-disable-line no-console From 2ec2b97e7f254db6f49f7414efcf09fb13192dfc Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 3 May 2023 15:42:55 +0100 Subject: [PATCH 07/12] chore: override release branches --- test/release.js | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/test/release.js b/test/release.js index 409f572e7..aa3bddda5 100644 --- a/test/release.js +++ b/test/release.js @@ -15,12 +15,9 @@ describe('release', () => { it('should release an esm project', async function () { this.timeout(120 * 1000) // slow ci is slow - const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci'], { - cwd: projectDir, - env: { - ...process.env, - GITHUB_ACTIONS: '' - } + const branchName = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD']) + const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', '--branches', branchName.stdout.trim()], { + cwd: projectDir }) console.info('output.stdout', output.stdout) // eslint-disable-line no-console @@ -39,12 +36,9 @@ describe('release', () => { it('should release a monorepo project', async function () { this.timeout(120 * 1000) // slow ci is slow - const output = await execa('npm', ['run', 'release', '--', '--', '--', '--dry-run', '--no-ci'], { - cwd: projectDir, - env: { - ...process.env, - GITHUB_ACTIONS: '' - } + const branchName = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD']) + const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', '--branches', branchName.stdout.trim()], { + cwd: projectDir }) console.info('output.stdout', output.stdout) // eslint-disable-line no-console From 9c8c0f4f686d59d928a5524871ce5366c7a9ade1 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 3 May 2023 15:51:52 +0100 Subject: [PATCH 08/12] chore: get branch name from env --- test/release.js | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/test/release.js b/test/release.js index aa3bddda5..90dc5a597 100644 --- a/test/release.js +++ b/test/release.js @@ -4,7 +4,7 @@ import { execa } from 'execa' import { expect } from '../utils/chai.js' import { setUpProject } from './utils/set-up-project.js' -describe('release', () => { +describe.only('release', () => { describe('regular repo', function () { let projectDir = '' @@ -15,8 +15,14 @@ describe('release', () => { it('should release an esm project', async function () { this.timeout(120 * 1000) // slow ci is slow - const branchName = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD']) - const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', '--branches', branchName.stdout.trim()], { + const args = [] + + // necessary for CI + if (process.env.GITHUB_HEAD_REF != null) { + args.push('--branches', process.env.GITHUB_HEAD_REF) + } + + const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', ...args], { cwd: projectDir }) @@ -36,8 +42,14 @@ describe('release', () => { it('should release a monorepo project', async function () { this.timeout(120 * 1000) // slow ci is slow - const branchName = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD']) - const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', '--branches', branchName.stdout.trim()], { + const args = [] + + // necessary for CI + if (process.env.GITHUB_HEAD_REF != null) { + args.push('--branches', process.env.GITHUB_HEAD_REF) + } + + const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', ...args], { cwd: projectDir }) From 06018bc6a61813728f03f76a9274ef4258570e96 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 3 May 2023 16:04:07 +0100 Subject: [PATCH 09/12] chore: linting --- test/release.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/release.js b/test/release.js index 90dc5a597..8fea31a8e 100644 --- a/test/release.js +++ b/test/release.js @@ -4,7 +4,7 @@ import { execa } from 'execa' import { expect } from '../utils/chai.js' import { setUpProject } from './utils/set-up-project.js' -describe.only('release', () => { +describe('release', () => { describe('regular repo', function () { let projectDir = '' From f39f294e41274f414a0dd741c8c2138303968e29 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 3 May 2023 16:15:02 +0100 Subject: [PATCH 10/12] chore: wildcard branches --- test/release.js | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/test/release.js b/test/release.js index 8fea31a8e..e3ebf2e2c 100644 --- a/test/release.js +++ b/test/release.js @@ -15,14 +15,7 @@ describe('release', () => { it('should release an esm project', async function () { this.timeout(120 * 1000) // slow ci is slow - const args = [] - - // necessary for CI - if (process.env.GITHUB_HEAD_REF != null) { - args.push('--branches', process.env.GITHUB_HEAD_REF) - } - - const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', ...args], { + const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', '--branches', '*'], { cwd: projectDir }) @@ -42,14 +35,7 @@ describe('release', () => { it('should release a monorepo project', async function () { this.timeout(120 * 1000) // slow ci is slow - const args = [] - - // necessary for CI - if (process.env.GITHUB_HEAD_REF != null) { - args.push('--branches', process.env.GITHUB_HEAD_REF) - } - - const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', ...args], { + const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', '--branches', '*'], { cwd: projectDir }) From 9eafeae929f68fee44a276ee693ec702227e4646 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 3 May 2023 16:20:21 +0100 Subject: [PATCH 11/12] chore: override ci env var --- test/release.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/test/release.js b/test/release.js index e3ebf2e2c..fe3ebc00c 100644 --- a/test/release.js +++ b/test/release.js @@ -16,7 +16,11 @@ describe('release', () => { this.timeout(120 * 1000) // slow ci is slow const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', '--branches', '*'], { - cwd: projectDir + cwd: projectDir, + env: { + ...process.env, + GITHUB_ACTIONS: '' + } }) console.info('output.stdout', output.stdout) // eslint-disable-line no-console @@ -36,7 +40,11 @@ describe('release', () => { this.timeout(120 * 1000) // slow ci is slow const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', '--branches', '*'], { - cwd: projectDir + cwd: projectDir, + env: { + ...process.env, + GITHUB_ACTIONS: '' + } }) console.info('output.stdout', output.stdout) // eslint-disable-line no-console From 11a014bd264a03a7bbc0472f23b9fa63307f08fb Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 3 May 2023 16:29:22 +0100 Subject: [PATCH 12/12] chore: override ci var --- test/release.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/release.js b/test/release.js index fe3ebc00c..916ce3cfb 100644 --- a/test/release.js +++ b/test/release.js @@ -15,11 +15,12 @@ describe('release', () => { it('should release an esm project', async function () { this.timeout(120 * 1000) // slow ci is slow - const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', '--branches', '*'], { + const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run'], { cwd: projectDir, env: { ...process.env, - GITHUB_ACTIONS: '' + GITHUB_ACTIONS: '', + CI: '' } }) @@ -39,11 +40,12 @@ describe('release', () => { it('should release a monorepo project', async function () { this.timeout(120 * 1000) // slow ci is slow - const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run', '--no-ci', '--branches', '*'], { + const output = await execa('npm', ['run', 'release', '--', '--', '--dry-run'], { cwd: projectDir, env: { ...process.env, - GITHUB_ACTIONS: '' + GITHUB_ACTIONS: '', + CI: '' } })