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
		
			
				
	
	
		
			43 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.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 {ActiveReleaseTrains} from '../../versioning/active-release-trains';
 | |
| import {semverInc} from '../../versioning/inc-semver';
 | |
| import {ReleaseAction} from '../actions';
 | |
| 
 | |
| /**
 | |
|  * Cuts the first release candidate for a release-train currently in the
 | |
|  * feature-freeze phase. The version is bumped from `next` to `rc.0`.
 | |
|  */
 | |
| export class CutReleaseCandidateAction extends ReleaseAction {
 | |
|   private _newVersion = semverInc(this.active.releaseCandidate!.version, 'prerelease', 'rc');
 | |
| 
 | |
|   async getDescription() {
 | |
|     const newVersion = this._newVersion;
 | |
|     return `Cut a first release-candidate for the feature-freeze branch (v${newVersion}).`;
 | |
|   }
 | |
| 
 | |
|   async perform() {
 | |
|     const {branchName} = this.active.releaseCandidate!;
 | |
|     const newVersion = this._newVersion;
 | |
| 
 | |
|     const {id} = await this.checkoutBranchAndStageVersion(newVersion, branchName);
 | |
| 
 | |
|     await this.waitForPullRequestToBeMerged(id);
 | |
|     await this.buildAndPublish(newVersion, branchName, 'next');
 | |
|     await this.cherryPickChangelogIntoNextBranch(newVersion, branchName);
 | |
|   }
 | |
| 
 | |
|   static async isActive(active: ActiveReleaseTrains) {
 | |
|     // A release-candidate can be cut for an active release-train currently
 | |
|     // in the feature-freeze phase.
 | |
|     return active.releaseCandidate !== null &&
 | |
|         active.releaseCandidate.version.prerelease[0] === 'next';
 | |
|   }
 | |
| }
 |