Creates a tool for staging and publishing releases as per the new branching and versioning that has been outlined in the following document. The tool is intended to be used across the organization to ensure consistent branching/versioning and labeling: https://docs.google.com/document/d/197kVillDwx-RZtSVOBtPb4BBIAw0E9RT3q3v6DZkykU/edit#heading=h.s3qlps8f4zq7dd The tool implements the actions as outlined in the following initial plan: https://hackmd.io/2Le8leq0S6G_R5VEVTNK9A. The implementation slightly diverged in so far that it performs staging and publishing together so that releasing is a single convenient command. In case of errors for which re-running the full command is not sufficient, we want to consider adding recover functionality. e.g. when the staging completed, but the actual NPM publishing aborted unexpectedly due to build errors. PR Close #38656
79 lines
3.5 KiB
TypeScript
79 lines
3.5 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
import {matchesVersion} from '../../../utils/testing/semver-matchers';
|
|
import {ReleaseTrain} from '../../versioning/release-trains';
|
|
import {CutStableAction} from '../actions/cut-stable';
|
|
import * as externalCommands from '../external-commands';
|
|
|
|
import {expectStagingAndPublishWithCherryPick, parse, setupReleaseActionForTesting} from './test-utils';
|
|
|
|
describe('cut stable action', () => {
|
|
it('should not activate if a feature-freeze release-train is active', async () => {
|
|
expect(await CutStableAction.isActive({
|
|
releaseCandidate: new ReleaseTrain('10.1.x', parse('10.1.0-next.1')),
|
|
next: new ReleaseTrain('master', parse('10.2.0-next.0')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
})).toBe(false);
|
|
});
|
|
|
|
it('should activate if release-candidate release-train is active', async () => {
|
|
expect(await CutStableAction.isActive({
|
|
// No longer in feature-freeze but in release-candidate phase.
|
|
releaseCandidate: new ReleaseTrain('10.1.x', parse('10.1.0-rc.0')),
|
|
next: new ReleaseTrain('master', parse('10.2.0-next.0')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
})).toBe(true);
|
|
});
|
|
|
|
it('should not activate if no FF/RC release-train is active', async () => {
|
|
expect(await CutStableAction.isActive({
|
|
releaseCandidate: null,
|
|
next: new ReleaseTrain('master', parse('10.1.0-next.0')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
})).toBe(false);
|
|
});
|
|
|
|
it('should create a proper new version and select correct branch', async () => {
|
|
const action = setupReleaseActionForTesting(CutStableAction, {
|
|
// No longer in feature-freeze but in release-candidate phase.
|
|
releaseCandidate: new ReleaseTrain('10.1.x', parse('10.1.0-rc.0')),
|
|
next: new ReleaseTrain('master', parse('10.2.0-next.0')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
});
|
|
|
|
await expectStagingAndPublishWithCherryPick(action, '10.1.x', '10.1.0', 'latest');
|
|
});
|
|
|
|
it('should not tag the previous latest release-train if a minor has been cut', async () => {
|
|
const action = setupReleaseActionForTesting(CutStableAction, {
|
|
// No longer in feature-freeze but in release-candidate phase.
|
|
releaseCandidate: new ReleaseTrain('10.1.x', parse('10.1.0-rc.0')),
|
|
next: new ReleaseTrain('master', parse('10.2.0-next.0')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
});
|
|
|
|
await expectStagingAndPublishWithCherryPick(action, '10.1.x', '10.1.0', 'latest');
|
|
expect(externalCommands.invokeSetNpmDistCommand).toHaveBeenCalledTimes(0);
|
|
});
|
|
|
|
it('should tag the previous latest release-train if a major has been cut', async () => {
|
|
const action = setupReleaseActionForTesting(CutStableAction, {
|
|
// No longer in feature-freeze but in release-candidate phase.
|
|
releaseCandidate: new ReleaseTrain('11.0.x', parse('11.0.0-rc.0')),
|
|
next: new ReleaseTrain('master', parse('10.2.0-next.0')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
});
|
|
|
|
await expectStagingAndPublishWithCherryPick(action, '11.0.x', '11.0.0', 'latest');
|
|
expect(externalCommands.invokeSetNpmDistCommand).toHaveBeenCalledTimes(1);
|
|
expect(externalCommands.invokeSetNpmDistCommand)
|
|
.toHaveBeenCalledWith('v10-lts', matchesVersion('10.0.3'));
|
|
});
|
|
});
|