diff --git a/packages/aws-cdk/lib/cli.ts b/packages/aws-cdk/lib/cli.ts index b41bbb1731a54..32dfb3e0dc32f 100644 --- a/packages/aws-cdk/lib/cli.ts +++ b/packages/aws-cdk/lib/cli.ts @@ -25,6 +25,7 @@ import { Command, Configuration, Settings } from '../lib/settings'; import * as version from '../lib/version'; import { DeploymentMethod } from './api'; import { enableTracing } from './util/tracing'; +import { checkForPlatformWarnings } from './platform-warnings'; // https://github.com/yargs/yargs/issues/1929 // https://github.com/evanw/esbuild/issues/1492 @@ -294,6 +295,13 @@ async function initCommandLine() { if (argv.ci) { setCI(true); } + + try { + await checkForPlatformWarnings(); + } catch (e) { + debug(`Error while checking for platform warnings: ${e}`); + } + debug('CDK toolkit version:', version.DISPLAY_VERSION); debug('Command line arguments:', argv); diff --git a/packages/aws-cdk/lib/platform-warnings.ts b/packages/aws-cdk/lib/platform-warnings.ts new file mode 100644 index 0000000000000..4b364e52969d9 --- /dev/null +++ b/packages/aws-cdk/lib/platform-warnings.ts @@ -0,0 +1,41 @@ +import * as os from 'os'; +import * as logging from './logging'; +import * as fs from 'fs-extra'; + +export async function checkForPlatformWarnings() { + if (await hasDockerCopyBug()) { + logging.warning('`cdk synth` may hang in Docker on Linux 5.6-5.10. See https://github.com/aws/aws-cdk/issues/21379 for workarounds.'); + } +} + +async function hasDockerCopyBug() { + return await runningInDocker() && os.platform() === 'linux' && isVersionBetween(os.release(), '5.6', '5.10'); +} + +async function runningInDocker() { + return fs.pathExists('/.dockerenv'); +} + +export function isVersionBetween(version: string, lower: string, upper: string) { + const ver = splitVersion(version); + const lo = splitVersion(lower); + const up = splitVersion(upper); + + while (lo.length < ver.length) { lo.push(0); } + while (up.length < ver.length) { up.push(9999999); } + + let n = ver.length; + for (let i = 0; i < n; i++) { + if (lo[i] < ver[i] && ver[i] < up[i]) { return true; } + if (lo[i] > ver[i] || ver[i] > up[i]) { return false; } + } + + return false; + +} + +function splitVersion(version: string): number[] { + return `${version}`.split('.') + .map(x => parseInt(x, 10)) + .map(x => isNaN(x) ? 0 : x); +} diff --git a/packages/aws-cdk/test/platform-warnings.test.ts b/packages/aws-cdk/test/platform-warnings.test.ts new file mode 100644 index 0000000000000..f2199c2dc7e11 --- /dev/null +++ b/packages/aws-cdk/test/platform-warnings.test.ts @@ -0,0 +1,15 @@ +import { isVersionBetween } from '../lib/platform-warnings'; + + +test.each([ + ['2.1', false], + ['2.2', true], + ['2', false], + ['3', true], + ['4', false], + ['4.3', true], + ['4.3', true], + ['4.2.294-220.533.amzn2.x86_64', true], +])('%p is in range: %p', (version, expected) => { + expect(isVersionBetween(version, '2.1.0.6', '4.9.2')).toEqual(expected); +}); \ No newline at end of file