Skip to content

ci: use current minimum Node.js v16 version to test snapshot builds #23143

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -204,10 +204,8 @@ jobs:
- browser-tools/install-chrome
- run:
name: Initialize Environment
# npm 7 currently does not properly publish the packages locally
command: |
./.circleci/env.sh
sudo npm install --global npm@6
- run:
name: Execute CLI E2E Tests
command: |
Expand Down Expand Up @@ -354,6 +352,7 @@ workflows:
- build
- e2e-cli:
name: e2e-cli-ng-snapshots
nodeversion: '16.10'
snapshots: true
requires:
- build
Expand Down
8 changes: 4 additions & 4 deletions packages/angular_devkit/build_angular/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,11 @@
"esbuild": "0.14.38"
},
"peerDependencies": {
"@angular/compiler-cli": "^14.0.0 || ^14.0.0-next",
"@angular/localize": "^14.0.0 || ^14.0.0-next",
"@angular/service-worker": "^14.0.0 || ^14.0.0-next",
"@angular/compiler-cli": "^14.0.0 || ^14.0.0-next || ^14.1.0-next",
"@angular/localize": "^14.0.0 || ^14.0.0-next || ^14.1.0-next",
"@angular/service-worker": "^14.0.0 || ^14.0.0-next || ^14.1.0-next",
"karma": "^6.3.0",
"ng-packagr": "^14.0.0 || ^14.0.0-next",
"ng-packagr": "^14.0.0 || ^14.0.0-next || ^14.1.0-next",
"protractor": "^7.0.0",
"tailwindcss": "^2.0.0 || ^3.0.0",
"typescript": ">=4.6.2 <4.8"
Expand Down
2 changes: 1 addition & 1 deletion packages/ngtools/webpack/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"homepage": "https://github.com/angular/angular-cli/tree/main/packages/ngtools/webpack",
"dependencies": {},
"peerDependencies": {
"@angular/compiler-cli": "^14.0.0 || ^14.0.0-next",
"@angular/compiler-cli": "^14.0.0 || ^14.0.0-next || ^14.1.0-next",
"typescript": ">=4.6.2 <4.8",
"webpack": "^5.54.0"
},
Expand Down
32 changes: 16 additions & 16 deletions tests/legacy-cli/e2e/ng-snapshot/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@
"description": "snapshot versions of Angular for e2e testing",
"private": true,
"dependencies": {
"@angular/animations": "github:angular/animations-builds#c51039c79459d89d9c1cb37d03650f1c27f4c73a",
"@angular/cdk": "github:angular/cdk-builds#e313adc4ec0a6b4ce4a9e54fcb6940da897dba7b",
"@angular/common": "github:angular/common-builds#4a574ecd7f4f926aedf37caf5c236d972a70cd58",
"@angular/compiler": "github:angular/compiler-builds#84d5a262885fb9b45cfae764ce87bbb316156408",
"@angular/compiler-cli": "github:angular/compiler-cli-builds#ddf20b9e25eeda3c8663050a8cb4da56f69c1e88",
"@angular/core": "github:angular/core-builds#4f83abb0614bddb4782d901c72b33660b6c6a260",
"@angular/forms": "github:angular/forms-builds#76abdfe1f2b9dcf5c609a46deeaac2565ba6e5a8",
"@angular/language-service": "github:angular/language-service-builds#e8e1e1bfd69c6bc793de5925fe012eb9102e80f5",
"@angular/localize": "github:angular/localize-builds#7c7412067e7ab47e2b9db5f8931b5d8666bc7c94",
"@angular/material": "github:angular/material-builds#3c9831b30dbe1d3b8b4a0bb540775e5b5a1e91b9",
"@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#428f8b7bf3219900a4582e2c522ba6c2ebbc9dae",
"@angular/platform-browser": "github:angular/platform-browser-builds#1ca47c1990ec000ce7fe8a6c44c06025f27ca145",
"@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#eee37a0728324b9aed7df56dc79861a9805a2dde",
"@angular/platform-server": "github:angular/platform-server-builds#ea262a7296b6eb039f6a16b63db53d7517c013c0",
"@angular/router": "github:angular/router-builds#4f1b9c07933efaa658d4edf1871076f64f94f0d8",
"@angular/service-worker": "github:angular/service-worker-builds#4f0881bc26e1b4b4bb17d36c6ba563b79eb80027"
"@angular/animations": "github:angular/animations-builds#901309992e6f3614130e136c0e3f67fa30537d33",
"@angular/cdk": "github:angular/cdk-builds#e647c3afecf4c41f8b2347325ade9425753d1fcd",
"@angular/common": "github:angular/common-builds#803ef76ef02fa36a9fe8ae7618925ab449ebe85b",
"@angular/compiler": "github:angular/compiler-builds#15a712a1b81f241e2ca52d0ba315371967552c19",
"@angular/compiler-cli": "github:angular/compiler-cli-builds#633bfed62ac5b1cae5dacf9128a52f032df31545",
"@angular/core": "github:angular/core-builds#0b0b0988007554e4dad15d1a5d0a3bcd56417c2f",
"@angular/forms": "github:angular/forms-builds#64233866e5ae0aaed85c4bdfcddb49972a05d728",
"@angular/language-service": "github:angular/language-service-builds#08589e1bfdb0c804e5d2391a81860c1a3c1d0ff7",
"@angular/localize": "github:angular/localize-builds#d57ea1221af85a0f22df38113de0928ff8f9a38b",
"@angular/material": "github:angular/material-builds#92599d199359f885c473fbc4f42c72a595149793",
"@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#1b8aa537b485122cc0121d5d2f436edf0d45523c",
"@angular/platform-browser": "github:angular/platform-browser-builds#9934c441a9689f23bbc3da34590eb56d46a58608",
"@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#d036997c6e0ce768dbe6a69b803debbe564002d8",
"@angular/platform-server": "github:angular/platform-server-builds#27fbfe1811342e70bf0e8337158c2d35376df7f9",
"@angular/router": "github:angular/router-builds#9c27232aff16fd8fe9d4f5be1bde51a041b3f9e1",
"@angular/service-worker": "github:angular/service-worker-builds#d0103132b2d0d355c148a749a10b5dbdc9e4f8ce"
}
}
31 changes: 20 additions & 11 deletions tests/legacy-cli/e2e/setup/010-local-publish.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
import { getGlobalVariable } from '../utils/env';
import { npm } from '../utils/process';
import { execWithEnv } from '../utils/process';
import { isPrereleaseCli } from '../utils/project';

export default async function () {
const testRegistry = getGlobalVariable('package-registry');
await npm(
'run',
'admin',
'--',
'publish',
'--no-versionCheck',
'--no-branchCheck',
`--registry=${testRegistry}`,
'--tag',
isPrereleaseCli() ? 'next' : 'latest',
await execWithEnv(
'npm',
[
'run',
'admin',
'--',
'publish',
'--no-versionCheck',
'--no-branchCheck',
`--registry=${testRegistry}`,
'--tag',
isPrereleaseCli() ? 'next' : 'latest',
],
{
...process.env,
// Also set an auth token value for the local test registry which is required by npm 7+
// even though it is never actually used.
'NPM_CONFIG__AUTH': 'e2e-testing',
},
);
}
37 changes: 18 additions & 19 deletions tests/legacy-cli/e2e/tests/misc/invalid-schematic-dependencies.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,14 @@
import { expectFileToMatch } from '../../utils/fs';
import { ng, silentNpm } from '../../utils/process';
import { execWithEnv, ng, silentNpm } from '../../utils/process';
import { installPackage, uninstallPackage } from '../../utils/packages';
import { isPrereleaseCli } from '../../utils/project';

export default async function () {
// Must publish old version to local registry to allow install. This is especially important
// for release commits as npm will try to request tooling packages that are not on the npm registry yet
const { stdout: stdoutPack1 } = await silentNpm(
'pack',
'@schematics/angular@7',
'--registry=https://registry.npmjs.org',
);
await silentNpm('publish', stdoutPack1.trim(), '--tag=outdated');
const { stdout: stdoutPack2 } = await silentNpm(
'pack',
'@angular-devkit/core@7',
'--registry=https://registry.npmjs.org',
);
await silentNpm('publish', stdoutPack2.trim(), '--tag=outdated');
const { stdout: stdoutPack3 } = await silentNpm(
'pack',
'@angular-devkit/schematics@7',
'--registry=https://registry.npmjs.org',
);
await silentNpm('publish', stdoutPack3.trim(), '--tag=outdated');
await publishOutdated('@schematics/angular@7');
await publishOutdated('@angular-devkit/core@7');
await publishOutdated('@angular-devkit/schematics@7');

// Install outdated and incompatible version
await installPackage('@schematics/angular@7');
Expand All @@ -36,3 +21,17 @@ export default async function () {
// Not doing so can cause adding material to fail if an incompatible cdk is present
await uninstallPackage('@angular/cdk');
}

async function publishOutdated(npmSpecifier: string): Promise<void> {
const { stdout: stdoutPack } = await silentNpm(
'pack',
npmSpecifier,
'--registry=https://registry.npmjs.org',
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

--registry shouldn't be needed here.

Suggested change
'--registry=https://registry.npmjs.org',

);
await execWithEnv('npm', ['publish', stdoutPack.trim(), '--tag=outdated'], {
...process.env,
// Also set an auth token value for the local test registry which is required by npm 7+
// even though it is never actually used.
'NPM_CONFIG__AUTH': 'e2e-testing',
});
}
24 changes: 22 additions & 2 deletions tests/legacy-cli/e2e/tests/misc/npm-7.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import * as assert from 'assert';
import { execSync } from 'child_process';
import { valid as validSemVer } from 'semver';
import { rimraf } from '../../utils/fs';
import { getActivePackageManager } from '../../utils/packages';
import { ng, npm } from '../../utils/process';
Expand All @@ -17,6 +20,23 @@ export default async function () {
return;
}

// Get current package manager version to restore after tests
const initialVersionText = execSync('npm --version', {
encoding: 'utf8',
stdio: ['ignore', 'pipe', 'ignore'],
env: {
...process.env,
// NPM updater notifier will prevent the child process from closing until it timeouts after 3 minutes.
NO_UPDATE_NOTIFIER: '1',
NPM_CONFIG_UPDATE_NOTIFIER: 'false',
},
}).trim();
const initialVersion = validSemVer(initialVersionText);
assert.ok(
initialVersion,
`Invalid npm version string returned from "npm --version" [${initialVersionText}]`,
);

const currentDirectory = process.cwd();

const extraArgs = [];
Expand Down Expand Up @@ -89,7 +109,7 @@ export default async function () {
// Change directory back
process.chdir(currentDirectory);

// Reset version back to 6.x
await npm('install', '--global', 'npm@6');
// Reset version back to initial version
await npm('install', '--global', `npm@${initialVersion}`);
}
}
4 changes: 3 additions & 1 deletion tests/legacy-cli/e2e/tests/misc/third-party-decorators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ export default async function () {
packageJson['devDependencies']['typescript'] = '~4.6.2';
});

await installWorkspacePackages();
// Force is need to prevent npm 7+ from failing due to potential peer dependency resolution range errors.
// This is especially common when testing snapshot builds for new prereleases.
await installWorkspacePackages({ force: true });

// Create an app that uses ngrx decorators and has e2e tests.
await writeMultipleFiles({
Expand Down
17 changes: 14 additions & 3 deletions tests/legacy-cli/e2e/utils/packages.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { getGlobalVariable } from './env';
import { writeFile } from './fs';
import { ProcessOutput, npm, silentNpm, silentYarn } from './process';

export function getActivePackageManager(): 'npm' | 'yarn' {
Expand All @@ -11,10 +10,14 @@ export function getActivePackageManager(): 'npm' | 'yarn' {
return value || 'npm';
}

export async function installWorkspacePackages(): Promise<void> {
export async function installWorkspacePackages(options?: { force?: boolean }): Promise<void> {
switch (getActivePackageManager()) {
case 'npm':
await silentNpm('install');
const npmArgs = ['install'];
if (options?.force) {
npmArgs.push('--force');
}
await silentNpm(...npmArgs);
break;
case 'yarn':
await silentYarn();
Expand Down Expand Up @@ -47,6 +50,7 @@ export async function setRegistry(useTestRegistry: boolean): Promise<void> {
: 'https://registry.npmjs.org';

const isCI = getGlobalVariable('ci');
const isSnapshotBuild = getGlobalVariable('argv')['ng-snapshots'];

// Ensure local test registry is used when outside a project
if (isCI) {
Expand All @@ -56,4 +60,11 @@ export async function setRegistry(useTestRegistry: boolean): Promise<void> {
// Yarn supports both `NPM_CONFIG_REGISTRY` and `YARN_REGISTRY`.
process.env['NPM_CONFIG_REGISTRY'] = url;
}

// Snapshot builds may contain versions that are not yet released (e.g., RC phase main branch).
// In this case peer dependency ranges may not resolve causing npm 7+ to fail during tests.
// To support this case, legacy peer dependency mode is enabled for snapshot builds.
if (isSnapshotBuild) {
process.env['NPM_CONFIG_legacy_peer_deps'] = 'true';
}
}