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..916ce3cfb --- /dev/null +++ b/test/release.js @@ -0,0 +1,57 @@ +/* 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, + env: { + ...process.env, + GITHUB_ACTIONS: '', + CI: '' + } + }) + + 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') + }) + }) + + 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, + env: { + ...process.env, + GITHUB_ACTIONS: '', + CI: '' + } + }) + + 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') + }) + }) +}) diff --git a/test/utils/set-up-project.js b/test/utils/set-up-project.js index 32613d7c4..2f266adc0 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,19 @@ 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', ['config', 'user.email', 'you@example.com'], { + cwd: projectDir + }) + await execa('git', ['config', 'user.name', 'Your Name'], { + cwd: projectDir + }) + await execa('git', ['commit', '-m', 'feat: initial import'], { + cwd: projectDir + }) + return projectDir }