diff --git a/packages/core/src/shared/sam/build.ts b/packages/core/src/shared/sam/build.ts index 233c6f6d7ae..81179177b83 100644 --- a/packages/core/src/shared/sam/build.ts +++ b/packages/core/src/shared/sam/build.ts @@ -29,6 +29,7 @@ import { } from './utils' import { getConfigFileUri, validateSamBuildConfig } from './config' import { runInTerminal } from './processTerminal' +import { SemVer } from 'semver' const buildMementoRootKey = 'samcli.build.params' export interface BuildParams { @@ -210,10 +211,13 @@ export async function runBuild(arg?: TreeNode): Promise { const projectRoot = params.projectRoot const defaultFlags: string[] = ['--cached', '--parallel', '--save-params', '--use-container'] + + const { path: samCliPath, parsedVersion } = await getSamCliPathAndVersion() + // refactor const buildFlags: string[] = params.paramsSource === ParamsSource.Specify && params.buildFlags - ? JSON.parse(params.buildFlags) + ? await resolveBuildFlags(JSON.parse(params.buildFlags), parsedVersion) : await getBuildFlags(params.paramsSource, projectRoot, defaultFlags) // todo remove @@ -229,8 +233,6 @@ export async function runBuild(arg?: TreeNode): Promise { await updateRecentResponse(buildMementoRootKey, 'global', 'templatePath', templatePath) try { - const { path: samCliPath } = await getSamCliPathAndVersion() - // Create a child process to run the SAM build command const buildProcess = new ChildProcess(samCliPath, ['build', ...buildFlags], { spawnOptions: await addTelemetryEnvVar({ @@ -281,3 +283,13 @@ function resolveBuildArgConflict(boundArgs: string[]): string[] { // } return Array.from(boundArgsSet) } +export async function resolveBuildFlags(buildFlags: string[], samCliVersion: SemVer | null): Promise { + // --no-use-container was not added until v1.133.0 + if (samCliVersion?.compare('1.133.0') ?? -1 < 0) { + return buildFlags + } + if (!buildFlags.includes('--use-container')) { + buildFlags.push('--no-use-container') + } + return buildFlags +} diff --git a/packages/core/src/test/shared/sam/build.test.ts b/packages/core/src/test/shared/sam/build.test.ts index 4375f792987..a7663788205 100644 --- a/packages/core/src/test/shared/sam/build.test.ts +++ b/packages/core/src/test/shared/sam/build.test.ts @@ -16,6 +16,7 @@ import { createParamsSourcePrompter, getBuildFlags, ParamsSource, + resolveBuildFlags, runBuild, } from '../../../shared/sam/build' import { TreeNode } from '../../../shared/treeview/resourceTreeDataProvider' @@ -26,12 +27,14 @@ import { getProjectRootUri } from '../../../shared/sam/utils' import sinon from 'sinon' import { createMultiPick, DataQuickPickItem } from '../../../shared/ui/pickerPrompter' import * as config from '../../../shared/sam/config' +import * as utils from '../../../shared/sam/utils' import { PrompterTester } from '../wizards/prompterTester' import { getWorkspaceFolder, TestFolder } from '../../testUtil' import { samconfigCompleteData, validTemplateData } from './samTestUtils' import { CloudFormationTemplateRegistry } from '../../../shared/fs/templateRegistry' import { getTestWindow } from '../vscode/window' import { CancellationError } from '../../../shared/utilities/timeoutUtils' +import { SemVer } from 'semver' describe('SAM BuildWizard', async function () { const createTester = async (params?: Partial, arg?: TreeNode | undefined) => @@ -229,6 +232,38 @@ describe('SAM build helper functions', () => { assert.deepStrictEqual(quickPick.items, expectedItems) }) }) + + describe('resolveBuildFlags', () => { + let sandbox: sinon.SinonSandbox + beforeEach(() => { + sandbox = sinon.createSandbox() + }) + + afterEach(() => { + sandbox.restore() + }) + + it('uses --no-use-container when --use-container is absent', async () => { + const normalVersion = new SemVer('1.133.0') + const buildFlags = ['--cached', '--debug', '--parallel'] + const expectedBuildFlags = ['--cached', '--debug', '--parallel', '--no-use-container'] + return testResolveBuildFlags(sandbox, normalVersion, buildFlags, expectedBuildFlags) + }) + + it('preserves buildFlags when SAM CLI version < 1.133', async () => { + const lowerVersion = new SemVer('1.110.0') + const buildFlags = ['--cached', '--parallel', '--save-params'] + const expectedBuildFlags = ['--cached', '--parallel', '--save-params'] + return testResolveBuildFlags(sandbox, lowerVersion, buildFlags, expectedBuildFlags) + }) + + it('respects existing --use-container flag', async () => { + const normalVersion = new SemVer('1.110.0') + const buildFlags = ['--cached', '--parallel', '--save-params', '--use-container'] + const expectedBuildFlags = ['--cached', '--parallel', '--save-params', '--use-container'] + return testResolveBuildFlags(sandbox, normalVersion, buildFlags, expectedBuildFlags) + }) + }) }) describe('SAM runBuild', () => { @@ -551,3 +586,16 @@ describe('SAM runBuild', () => { }) }) }) + +function testResolveBuildFlags( + sandbox: sinon.SinonSandbox, + parsedVersion: SemVer, + buildFlags: string[], + expectedBuildFlags: string[] +) { + const pathAndVersionStub = sandbox.stub().resolves({ path: 'file:///path/to/cli', parsedVersion }) + sandbox.stub(utils, 'getSamCliPathAndVersion').callsFake(pathAndVersionStub) + return resolveBuildFlags(buildFlags, parsedVersion).then((resolvedBuildFlags) => { + assert.deepEqual(resolvedBuildFlags, expectedBuildFlags) + }) +} diff --git a/packages/toolkit/.changes/next-release/Bug Fix-f7a3ecad-06a7-48cd-896b-2285ea95bd84.json b/packages/toolkit/.changes/next-release/Bug Fix-f7a3ecad-06a7-48cd-896b-2285ea95bd84.json new file mode 100644 index 00000000000..80e69eae92a --- /dev/null +++ b/packages/toolkit/.changes/next-release/Bug Fix-f7a3ecad-06a7-48cd-896b-2285ea95bd84.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "appBuilder: pass '--no-use-container' when '--use-container' is not selected in quickpick" +}