From 2a4fd6bd887b0773f7ffa1b35d8c0256c15a7f1a Mon Sep 17 00:00:00 2001 From: Michael Sambol Date: Fri, 10 Nov 2023 07:29:12 -0600 Subject: [PATCH 1/4] feat(docker): add --no-cache option for docker build --- packages/aws-cdk-lib/aws-ecr-assets/README.md | 11 +++++ .../aws-ecr-assets/lib/image-asset.ts | 15 +++++++ .../test/build-image-cache.test.ts | 20 +++++++++ .../lib/assets/docker-image-asset.ts | 7 +++ .../lib/cloud-assembly/metadata-schema.ts | 7 +++ .../schema/assets.schema.json | 4 ++ .../schema/cloud-assembly.schema.json | 4 ++ packages/aws-cdk-lib/core/lib/assets.ts | 7 +++ packages/aws-cdk-lib/core/lib/bundling.ts | 8 ++++ .../asset-manifest-builder.ts | 1 + .../core/lib/stack-synthesizers/legacy.ts | 1 + .../aws-cdk-lib/core/test/bundling.test.ts | 37 ++++++++++++++++ packages/aws-cdk-lib/cx-api/lib/assets.ts | 1 + packages/cdk-assets/lib/private/docker.ts | 2 + .../lib/private/handlers/container-images.ts | 1 + .../cdk-assets/test/docker-images.test.ts | 43 +++++++++++++++++++ 16 files changed, 169 insertions(+) diff --git a/packages/aws-cdk-lib/aws-ecr-assets/README.md b/packages/aws-cdk-lib/aws-ecr-assets/README.md index ee69166717734..1bc1a2b468251 100644 --- a/packages/aws-cdk-lib/aws-ecr-assets/README.md +++ b/packages/aws-cdk-lib/aws-ecr-assets/README.md @@ -127,6 +127,17 @@ const asset = new DockerImageAsset(this, 'MyBuildImage', { }) ``` +You can optionally disable the cache: + +```ts +import { DockerImageAsset, Platform } from 'aws-cdk-lib/aws-ecr-assets'; + +const asset = new DockerImageAsset(this, 'MyBuildImage', { + directory: path.join(__dirname, 'my-image'), + cacheDisabled: true, +}) +``` + ## Images from Tarball Images are loaded from a local tarball, uploaded to ECR by the CDK toolkit and/or your app's CI-CD pipeline, and can be diff --git a/packages/aws-cdk-lib/aws-ecr-assets/lib/image-asset.ts b/packages/aws-cdk-lib/aws-ecr-assets/lib/image-asset.ts index c8475ce037873..26507566278ec 100644 --- a/packages/aws-cdk-lib/aws-ecr-assets/lib/image-asset.ts +++ b/packages/aws-cdk-lib/aws-ecr-assets/lib/image-asset.ts @@ -307,6 +307,13 @@ export interface DockerImageAssetOptions extends FingerprintOptions, FileFingerp * @see https://docs.docker.com/build/cache/backends/ */ readonly cacheTo?: DockerCacheOption; + + /** + * Disable the cache and pass `--no-cache` to the `docker build` command. + * + * @default - cache is used + */ + readonly cacheDisabled?: boolean; } /** @@ -409,6 +416,11 @@ export class DockerImageAsset extends Construct implements IAsset { */ private readonly dockerCacheTo?: DockerCacheOption; + /** + * Disable the cache and pass `--no-cache` to the `docker build` command. + */ + private readonly dockerCacheDisabled?: boolean; + /** * Docker target to build to */ @@ -505,6 +517,7 @@ export class DockerImageAsset extends Construct implements IAsset { this.dockerOutputs = props.outputs; this.dockerCacheFrom = props.cacheFrom; this.dockerCacheTo = props.cacheTo; + this.dockerCacheDisabled = props.cacheDisabled; const location = stack.synthesizer.addDockerImageAsset({ directoryName: this.assetPath, @@ -520,6 +533,7 @@ export class DockerImageAsset extends Construct implements IAsset { dockerOutputs: this.dockerOutputs, dockerCacheFrom: this.dockerCacheFrom, dockerCacheTo: this.dockerCacheTo, + dockerCacheDisabled: this.dockerCacheDisabled, }); this.repository = ecr.Repository.fromRepositoryName(this, 'Repository', location.repositoryName); @@ -561,6 +575,7 @@ export class DockerImageAsset extends Construct implements IAsset { resource.cfnOptions.metadata[cxapi.ASSET_RESOURCE_METADATA_DOCKER_OUTPUTS_KEY] = this.dockerOutputs; resource.cfnOptions.metadata[cxapi.ASSET_RESOURCE_METADATA_DOCKER_CACHE_FROM_KEY] = this.dockerCacheFrom; resource.cfnOptions.metadata[cxapi.ASSET_RESOURCE_METADATA_DOCKER_CACHE_TO_KEY] = this.dockerCacheTo; + resource.cfnOptions.metadata[cxapi.ASSET_RESOURCE_METADATA_DOCKER_CACHE_DISABLED_KEY] = this.dockerCacheDisabled; } } diff --git a/packages/aws-cdk-lib/aws-ecr-assets/test/build-image-cache.test.ts b/packages/aws-cdk-lib/aws-ecr-assets/test/build-image-cache.test.ts index 3c4655e0453e6..96a0126bfb3e7 100644 --- a/packages/aws-cdk-lib/aws-ecr-assets/test/build-image-cache.test.ts +++ b/packages/aws-cdk-lib/aws-ecr-assets/test/build-image-cache.test.ts @@ -51,6 +51,26 @@ describe('build cache', () => { }); }); + test('manifest contains cache disabled', () => { + // GIVEN + const app = new App(); + const stack = new Stack(app); + const asset = new DockerImageAsset(stack, 'DockerImage6', { + directory: path.join(__dirname, 'demo-image'), + cacheDisabled: true, + }); + + // WHEN + const asm = app.synth(); + + // THEN + const manifestArtifact = getAssetManifest(asm); + const manifest = readAssetManifest(manifestArtifact); + + expect(Object.keys(manifest.dockerImages ?? {}).length).toBe(1); + expect(manifest.dockerImages?.[asset.assetHash]?.source.cacheDisabled).toBeTruthy(); + }); + test('manifest does not contain options when not specified', () => { // GIVEN const app = new App(); diff --git a/packages/aws-cdk-lib/cloud-assembly-schema/lib/assets/docker-image-asset.ts b/packages/aws-cdk-lib/cloud-assembly-schema/lib/assets/docker-image-asset.ts index 4c1ad6d426a55..70c9761f47c70 100644 --- a/packages/aws-cdk-lib/cloud-assembly-schema/lib/assets/docker-image-asset.ts +++ b/packages/aws-cdk-lib/cloud-assembly-schema/lib/assets/docker-image-asset.ts @@ -122,6 +122,13 @@ export interface DockerImageSource { * @see https://docs.docker.com/build/cache/backends/ */ readonly cacheTo?: DockerCacheOption; + + /** + * Disable the cache and pass `--no-cache` to the `docker build` command. + * + * @default - cache is used + */ + readonly cacheDisabled?: boolean; } /** diff --git a/packages/aws-cdk-lib/cloud-assembly-schema/lib/cloud-assembly/metadata-schema.ts b/packages/aws-cdk-lib/cloud-assembly-schema/lib/cloud-assembly/metadata-schema.ts index 9354300baa1ba..35b619ddaa780 100644 --- a/packages/aws-cdk-lib/cloud-assembly-schema/lib/cloud-assembly/metadata-schema.ts +++ b/packages/aws-cdk-lib/cloud-assembly-schema/lib/cloud-assembly/metadata-schema.ts @@ -226,6 +226,13 @@ export interface ContainerImageAssetMetadataEntry extends BaseAssetMetadataEntry * @see https://docs.docker.com/build/cache/backends/ */ readonly cacheTo?: ContainerImageAssetCacheOption; + + /** + * Disable the cache and pass `--no-cache` to the `docker build` command. + * + * @default - cache is used + */ + readonly cacheDisabled?: boolean; } /** diff --git a/packages/aws-cdk-lib/cloud-assembly-schema/schema/assets.schema.json b/packages/aws-cdk-lib/cloud-assembly-schema/schema/assets.schema.json index f34adb5ef24f5..194c2ae23b885 100644 --- a/packages/aws-cdk-lib/cloud-assembly-schema/schema/assets.schema.json +++ b/packages/aws-cdk-lib/cloud-assembly-schema/schema/assets.schema.json @@ -191,6 +191,10 @@ "cacheTo": { "description": "Cache to options to pass to the `docker build` command. (Default - no cache to options are passed to the build command)", "$ref": "#/definitions/DockerCacheOption" + }, + "cacheDisabled": { + "description": "Disable the cache and pass `--no-cache` to the `docker build` command. (Default - cache is used)", + "$ref": "#/definitions/DockerCacheDisabled" } } }, diff --git a/packages/aws-cdk-lib/cloud-assembly-schema/schema/cloud-assembly.schema.json b/packages/aws-cdk-lib/cloud-assembly-schema/schema/cloud-assembly.schema.json index bfb369cfd2100..d819113764b8f 100644 --- a/packages/aws-cdk-lib/cloud-assembly-schema/schema/cloud-assembly.schema.json +++ b/packages/aws-cdk-lib/cloud-assembly-schema/schema/cloud-assembly.schema.json @@ -261,6 +261,10 @@ "description": "Cache to options to pass to the `docker build` command. (Default - no cache to options are passed to the build command)", "$ref": "#/definitions/ContainerImageAssetCacheOption" }, + "cacheDisabled": { + "description": "Disable the cache and pass `--no-cache` to the `docker build` command. (Default - cache is used)", + "$ref": "#/definitions/ContainerImageAssetCacheDisabled" + }, "id": { "description": "Logical identifier for the asset", "type": "string" diff --git a/packages/aws-cdk-lib/core/lib/assets.ts b/packages/aws-cdk-lib/core/lib/assets.ts index c9a7d47d98672..d1fc760ad0eba 100644 --- a/packages/aws-cdk-lib/core/lib/assets.ts +++ b/packages/aws-cdk-lib/core/lib/assets.ts @@ -286,6 +286,13 @@ export interface DockerImageAssetSource { * @default - no cache to args are passed */ readonly dockerCacheTo?: DockerCacheOption; + + /** + * Disable the cache and pass `--no-cache` to the `docker build` command. + * + * @default - cache is used + */ + readonly dockerCacheDisabled?: boolean; } /** diff --git a/packages/aws-cdk-lib/core/lib/bundling.ts b/packages/aws-cdk-lib/core/lib/bundling.ts index e4500bf213d3f..b9967ce190842 100644 --- a/packages/aws-cdk-lib/core/lib/bundling.ts +++ b/packages/aws-cdk-lib/core/lib/bundling.ts @@ -358,6 +358,7 @@ export class DockerImage extends BundlingDockerImage { ...(options.targetStage ? ['--target', options.targetStage] : []), ...(options.cacheFrom ? [...options.cacheFrom.map(cacheFrom => ['--cache-from', this.cacheOptionToFlag(cacheFrom)]).flat()] : []), ...(options.cacheTo ? ['--cache-to', this.cacheOptionToFlag(options.cacheTo)] : []), + ...(options.cacheDisabled ? ['--no-cache'] : []), ...flatten(Object.entries(buildArgs).map(([k, v]) => ['--build-arg', `${k}=${v}`])), path, ]; @@ -627,6 +628,13 @@ export interface DockerBuildOptions { * @default - no cache to args are passed */ readonly cacheTo?: DockerCacheOption; + + /** + * Disable the cache and pass `--no-cache` to the `docker build` command. + * + * @default - cache is used + */ + readonly cacheDisabled?: boolean; } function flatten(x: string[][]) { diff --git a/packages/aws-cdk-lib/core/lib/stack-synthesizers/asset-manifest-builder.ts b/packages/aws-cdk-lib/core/lib/stack-synthesizers/asset-manifest-builder.ts index 515573bfca5c1..3cd3924872995 100644 --- a/packages/aws-cdk-lib/core/lib/stack-synthesizers/asset-manifest-builder.ts +++ b/packages/aws-cdk-lib/core/lib/stack-synthesizers/asset-manifest-builder.ts @@ -75,6 +75,7 @@ export class AssetManifestBuilder { dockerOutputs: asset.dockerOutputs, cacheFrom: asset.dockerCacheFrom, cacheTo: asset.dockerCacheTo, + cacheDisabled: asset.dockerCacheDisabled, }, { repositoryName: target.repositoryName, imageTag, diff --git a/packages/aws-cdk-lib/core/lib/stack-synthesizers/legacy.ts b/packages/aws-cdk-lib/core/lib/stack-synthesizers/legacy.ts index 887b32ee5a7c0..29a553486663c 100644 --- a/packages/aws-cdk-lib/core/lib/stack-synthesizers/legacy.ts +++ b/packages/aws-cdk-lib/core/lib/stack-synthesizers/legacy.ts @@ -152,6 +152,7 @@ export class LegacyStackSynthesizer extends StackSynthesizer implements IReusabl outputs: asset.dockerOutputs, cacheFrom: asset.dockerCacheFrom, cacheTo: asset.dockerCacheTo, + cacheDisabled: asset.dockerCacheDisabled, }; this.boundStack.node.addMetadata(cxschema.ArtifactMetadataEntryType.ASSET, metadata); diff --git a/packages/aws-cdk-lib/core/test/bundling.test.ts b/packages/aws-cdk-lib/core/test/bundling.test.ts index a9a2eb2abcf7e..9e074c992efed 100644 --- a/packages/aws-cdk-lib/core/test/bundling.test.ts +++ b/packages/aws-cdk-lib/core/test/bundling.test.ts @@ -88,6 +88,43 @@ describe('bundling', () => { ])).toEqual(true); }); + test('bundling with image from asset with cache disabled', () => { + const spawnSyncStub = sinon.stub(child_process, 'spawnSync').returns({ + status: 0, + stderr: Buffer.from('stderr'), + stdout: Buffer.from('stdout'), + pid: 123, + output: ['stdout', 'stderr'], + signal: null, + }); + + const imageHash = '123456abcdef'; + const fingerprintStub = sinon.stub(FileSystem, 'fingerprint'); + fingerprintStub.callsFake(() => imageHash); + + const image = DockerImage.fromBuild('docker-path', { + cacheDisabled: true, + }); + image.run(); + + const tagHash = crypto.createHash('sha256').update(JSON.stringify({ + path: 'docker-path', + cacheDisabled: true, + })).digest('hex'); + const tag = `cdk-${tagHash}`; + + expect(spawnSyncStub.firstCall.calledWith(dockerCmd, [ + 'build', '-t', tag, + '--no-cache', + 'docker-path', + ])).toEqual(true); + + expect(spawnSyncStub.secondCall.calledWith(dockerCmd, [ + 'run', '--rm', + tag, + ])).toEqual(true); + }); + test('bundling with image from asset with platform', () => { const spawnSyncStub = sinon.stub(child_process, 'spawnSync').returns({ status: 0, diff --git a/packages/aws-cdk-lib/cx-api/lib/assets.ts b/packages/aws-cdk-lib/cx-api/lib/assets.ts index ca6581548df63..ad67cfec62f62 100644 --- a/packages/aws-cdk-lib/cx-api/lib/assets.ts +++ b/packages/aws-cdk-lib/cx-api/lib/assets.ts @@ -20,6 +20,7 @@ export const ASSET_RESOURCE_METADATA_IS_BUNDLED_KEY = 'aws:asset:is-bundled'; export const ASSET_RESOURCE_METADATA_DOCKER_OUTPUTS_KEY = 'aws:asset:docker-outputs'; export const ASSET_RESOURCE_METADATA_DOCKER_CACHE_FROM_KEY = 'aws:asset:docker-cache-from'; export const ASSET_RESOURCE_METADATA_DOCKER_CACHE_TO_KEY = 'aws:asset:docker-cache-to'; +export const ASSET_RESOURCE_METADATA_DOCKER_CACHE_DISABLED_KEY = 'aws:asset:docker-cache-disabled'; /** * Separator string that separates the prefix separator from the object key separator. diff --git a/packages/cdk-assets/lib/private/docker.ts b/packages/cdk-assets/lib/private/docker.ts index 12b8ab53a213e..56c223e991504 100644 --- a/packages/cdk-assets/lib/private/docker.ts +++ b/packages/cdk-assets/lib/private/docker.ts @@ -22,6 +22,7 @@ interface BuildOptions { readonly outputs?: string[]; readonly cacheFrom?: DockerCacheOption[]; readonly cacheTo?: DockerCacheOption; + readonly cacheDisabled?: boolean; readonly quiet?: boolean; } @@ -107,6 +108,7 @@ export class Docker { ...options.outputs ? options.outputs.map(output => [`--output=${output}`]) : [], ...options.cacheFrom ? [...options.cacheFrom.map(cacheFrom => ['--cache-from', this.cacheOptionToFlag(cacheFrom)]).flat()] : [], ...options.cacheTo ? ['--cache-to', this.cacheOptionToFlag(options.cacheTo)] : [], + ...options.cacheDisabled ? ['--no-cache'] : [], '.', ]; await this.execute(buildCommand, { diff --git a/packages/cdk-assets/lib/private/handlers/container-images.ts b/packages/cdk-assets/lib/private/handlers/container-images.ts index 381c1c3e635b0..8764b1e9c41b3 100644 --- a/packages/cdk-assets/lib/private/handlers/container-images.ts +++ b/packages/cdk-assets/lib/private/handlers/container-images.ts @@ -197,6 +197,7 @@ class ContainerImageBuilder { outputs: source.dockerOutputs, cacheFrom: source.cacheFrom, cacheTo: source.cacheTo, + cacheDisabled: source.cacheDisabled, quiet: this.options.quiet, }); } diff --git a/packages/cdk-assets/test/docker-images.test.ts b/packages/cdk-assets/test/docker-images.test.ts index 561e37c823916..c396853576c3e 100644 --- a/packages/cdk-assets/test/docker-images.test.ts +++ b/packages/cdk-assets/test/docker-images.test.ts @@ -205,6 +205,25 @@ beforeEach(() => { }, }, }), + '/nocache/cdk.out/assets.json': JSON.stringify({ + version: Manifest.version(), + dockerImages: { + theAsset: { + source: { + directory: 'dockerdir', + cacheDisabled: true, + }, + destinations: { + theDestination: { + region: 'us-north-50', + assumeRoleArn: 'arn:aws:role', + repositoryName: 'repo', + imageTag: 'nopqr', + }, + }, + }, + }, + }), '/platform-arm64/cdk.out/dockerdir/Dockerfile': 'FROM scratch', }); @@ -370,6 +389,30 @@ describe('with a complete manifest', () => { expect(true).toBeTruthy(); // Expect no exception, satisfy linter }); + test('build with cache disabled', async () => { + pub = new AssetPublishing(AssetManifest.fromPath('/nocache/cdk.out'), { aws }); + const defaultNetworkDockerpath = '/nocache/cdk.out/dockerdir'; + aws.mockEcr.describeImages = mockedApiFailure('ImageNotFoundException', 'File does not exist'); + aws.mockEcr.getAuthorizationToken = mockedApiResult({ + authorizationData: [ + { authorizationToken: 'dXNlcjpwYXNz', proxyEndpoint: 'https://proxy.com/' }, + ], + }); + + const expectAllSpawns = mockSpawn( + { commandLine: ['docker', 'login', '--username', 'user', '--password-stdin', 'https://proxy.com/'] }, + { commandLine: ['docker', 'inspect', 'cdkasset-theasset'], exitCode: 1 }, + { commandLine: ['docker', 'build', '--tag', 'cdkasset-theasset', '--no-cache', '.'], cwd: defaultNetworkDockerpath }, + { commandLine: ['docker', 'tag', 'cdkasset-theasset', '12345.amazonaws.com/repo:nopqr'] }, + { commandLine: ['docker', 'push', '12345.amazonaws.com/repo:nopqr'] }, + ); + + await pub.publish(); + + expectAllSpawns(); + expect(true).toBeTruthy(); // Expect no exception, satisfy linter + }); + test('build with multiple cache from option', async () => { pub = new AssetPublishing(AssetManifest.fromPath('/cache-from-multiple/cdk.out'), { aws }); const defaultNetworkDockerpath = '/cache-from-multiple/cdk.out/dockerdir'; From a14b3dbc414ff8c879a3d01aa66915eca2dd1dbc Mon Sep 17 00:00:00 2001 From: Michael Sambol Date: Sun, 3 Dec 2023 14:06:33 -0800 Subject: [PATCH 2/4] add int test --- .../Dockerfile | 5 +- .../index.py | 0 .../integ.assets-docker.js.snapshot/cdk.out | 2 +- .../integ-assets-docker.assets.json | 13 +- .../integ-assets-docker.template.json | 7 +- .../integ.json | 2 +- .../manifest.json | 11 +- .../integ.assets-docker.js.snapshot/tree.json | 180 +++++++++++------- .../test/integ.assets-docker.ts | 7 + 9 files changed, 142 insertions(+), 85 deletions(-) rename packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/{asset.6308cecadfac022764e8f3e3272baeab95b48a260cae3978b7ef93bd3ff2be17 => asset.615e365307bd4811880256cf541a7d05b5d4a752ee76ac03863a0a39631607a6}/Dockerfile (73%) rename packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/{asset.6308cecadfac022764e8f3e3272baeab95b48a260cae3978b7ef93bd3ff2be17 => asset.615e365307bd4811880256cf541a7d05b5d4a752ee76ac03863a0a39631607a6}/index.py (100%) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/asset.6308cecadfac022764e8f3e3272baeab95b48a260cae3978b7ef93bd3ff2be17/Dockerfile b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/asset.615e365307bd4811880256cf541a7d05b5d4a752ee76ac03863a0a39631607a6/Dockerfile similarity index 73% rename from packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/asset.6308cecadfac022764e8f3e3272baeab95b48a260cae3978b7ef93bd3ff2be17/Dockerfile rename to packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/asset.615e365307bd4811880256cf541a7d05b5d4a752ee76ac03863a0a39631607a6/Dockerfile index 0071fd74d1cea..1eed2e5bafea9 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/asset.6308cecadfac022764e8f3e3272baeab95b48a260cae3978b7ef93bd3ff2be17/Dockerfile +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/asset.615e365307bd4811880256cf541a7d05b5d4a752ee76ac03863a0a39631607a6/Dockerfile @@ -3,5 +3,8 @@ RUN yum makecache fast RUN yum install -y openssh-clients RUN ssh-keygen -t rsa -b 2048 -f /root/.ssh/id_rsa -q -N "" RUN ssh-keygen -y -f /root/.ssh/id_rsa > /root/.ssh/id_rsa.pub +RUN cat /root/.ssh/id_rsa.pub >> out.pub WORKDIR /app -CMD python3 index.py \ No newline at end of file +EXPOSE 8000 +ADD . /app +CMD python3 index.py diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/asset.6308cecadfac022764e8f3e3272baeab95b48a260cae3978b7ef93bd3ff2be17/index.py b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/asset.615e365307bd4811880256cf541a7d05b5d4a752ee76ac03863a0a39631607a6/index.py similarity index 100% rename from packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/asset.6308cecadfac022764e8f3e3272baeab95b48a260cae3978b7ef93bd3ff2be17/index.py rename to packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/asset.615e365307bd4811880256cf541a7d05b5d4a752ee76ac03863a0a39631607a6/index.py diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/cdk.out index 560dae10d018f..c5cb2e5de6344 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/cdk.out +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"33.0.0"} \ No newline at end of file +{"version":"35.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/integ-assets-docker.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/integ-assets-docker.assets.json index fa5d0aa9091a1..b3691341c6d14 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/integ-assets-docker.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/integ-assets-docker.assets.json @@ -1,7 +1,7 @@ { - "version": "33.0.0", + "version": "35.0.0", "files": { - "edc1ba041db81671404e8a861496095ba07bd672d374473e59818e6cb877af42": { + "dc6c330d80747fedea628640e7c21c876ca149b8dac5aa89f5a0ad046e584a71": { "source": { "path": "integ-assets-docker.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "edc1ba041db81671404e8a861496095ba07bd672d374473e59818e6cb877af42.json", + "objectKey": "dc6c330d80747fedea628640e7c21c876ca149b8dac5aa89f5a0ad046e584a71.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } @@ -71,14 +71,15 @@ } } }, - "6308cecadfac022764e8f3e3272baeab95b48a260cae3978b7ef93bd3ff2be17": { + "615e365307bd4811880256cf541a7d05b5d4a752ee76ac03863a0a39631607a6": { "source": { - "directory": "asset.6308cecadfac022764e8f3e3272baeab95b48a260cae3978b7ef93bd3ff2be17" + "directory": "asset.615e365307bd4811880256cf541a7d05b5d4a752ee76ac03863a0a39631607a6", + "dockerBuildSsh": "default" }, "destinations": { "current_account-current_region": { "repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}", - "imageTag": "6308cecadfac022764e8f3e3272baeab95b48a260cae3978b7ef93bd3ff2be17", + "imageTag": "615e365307bd4811880256cf541a7d05b5d4a752ee76ac03863a0a39631607a6", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/integ-assets-docker.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/integ-assets-docker.template.json index 2605676354e1c..0c5d264d788e6 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/integ-assets-docker.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/integ-assets-docker.template.json @@ -89,7 +89,12 @@ }, "ImageUri7": { "Value": { - "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:6308cecadfac022764e8f3e3272baeab95b48a260cae3978b7ef93bd3ff2be17" + "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:615e365307bd4811880256cf541a7d05b5d4a752ee76ac03863a0a39631607a6" + } + }, + "ImageUri8": { + "Value": { + "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14" } } }, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/integ.json index e01a0b89535ed..a51131fb859e3 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/integ.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/integ.json @@ -1,5 +1,5 @@ { - "version": "33.0.0", + "version": "35.0.0", "testCases": { "integ.assets-docker": { "stacks": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/manifest.json index b9200ffed8e84..345ca3c45d8c0 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/manifest.json @@ -1,5 +1,5 @@ { - "version": "33.0.0", + "version": "35.0.0", "artifacts": { "integ-assets-docker.assets": { "type": "cdk:asset-manifest", @@ -14,10 +14,11 @@ "environment": "aws://unknown-account/unknown-region", "properties": { "templateFile": "integ-assets-docker.template.json", + "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/edc1ba041db81671404e8a861496095ba07bd672d374473e59818e6cb877af42.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/dc6c330d80747fedea628640e7c21c876ca149b8dac5aa89f5a0ad046e584a71.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -87,6 +88,12 @@ "data": "ImageUri7" } ], + "/integ-assets-docker/ImageUri8": [ + { + "type": "aws:cdk:logicalId", + "data": "ImageUri8" + } + ], "/integ-assets-docker/BootstrapVersion": [ { "type": "aws:cdk:logicalId", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/tree.json index 2db7b2e5e5f20..8631bddb6cbb7 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.js.snapshot/tree.json @@ -16,22 +16,22 @@ "id": "Staging", "path": "integ-assets-docker/DockerImage/Staging", "constructInfo": { - "fqn": "aws-cdk-lib.AssetStaging", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "Repository": { "id": "Repository", "path": "integ-assets-docker/DockerImage/Repository", "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "DockerImage2": { @@ -42,22 +42,22 @@ "id": "Staging", "path": "integ-assets-docker/DockerImage2/Staging", "constructInfo": { - "fqn": "aws-cdk-lib.AssetStaging", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "Repository": { "id": "Repository", "path": "integ-assets-docker/DockerImage2/Repository", "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "DockerImage3": { @@ -68,22 +68,22 @@ "id": "Staging", "path": "integ-assets-docker/DockerImage3/Staging", "constructInfo": { - "fqn": "aws-cdk-lib.AssetStaging", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "Repository": { "id": "Repository", "path": "integ-assets-docker/DockerImage3/Repository", "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "DockerImage4": { @@ -94,22 +94,22 @@ "id": "Staging", "path": "integ-assets-docker/DockerImage4/Staging", "constructInfo": { - "fqn": "aws-cdk-lib.AssetStaging", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "Repository": { "id": "Repository", "path": "integ-assets-docker/DockerImage4/Repository", "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "DockerImage5": { @@ -120,22 +120,22 @@ "id": "Staging", "path": "integ-assets-docker/DockerImage5/Staging", "constructInfo": { - "fqn": "aws-cdk-lib.AssetStaging", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "Repository": { "id": "Repository", "path": "integ-assets-docker/DockerImage5/Repository", "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "DockerImage6": { @@ -146,22 +146,22 @@ "id": "Staging", "path": "integ-assets-docker/DockerImage6/Staging", "constructInfo": { - "fqn": "aws-cdk-lib.AssetStaging", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "Repository": { "id": "Repository", "path": "integ-assets-docker/DockerImage6/Repository", "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "DockerImage7": { @@ -172,22 +172,48 @@ "id": "Staging", "path": "integ-assets-docker/DockerImage7/Staging", "constructInfo": { - "fqn": "aws-cdk-lib.AssetStaging", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "Repository": { "id": "Repository", "path": "integ-assets-docker/DockerImage7/Repository", "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" + } + }, + "DockerImage8": { + "id": "DockerImage8", + "path": "integ-assets-docker/DockerImage8", + "children": { + "Staging": { + "id": "Staging", + "path": "integ-assets-docker/DockerImage8/Staging", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" + } + }, + "Repository": { + "id": "Repository", + "path": "integ-assets-docker/DockerImage8/Repository", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "MyUser": { @@ -202,8 +228,8 @@ "aws:cdk:cloudformation:props": {} }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.CfnUser", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "DefaultPolicy": { @@ -266,98 +292,106 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.Policy", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.User", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "ImageUri": { "id": "ImageUri", "path": "integ-assets-docker/ImageUri", "constructInfo": { - "fqn": "aws-cdk-lib.CfnOutput", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "ImageUri2": { "id": "ImageUri2", "path": "integ-assets-docker/ImageUri2", "constructInfo": { - "fqn": "aws-cdk-lib.CfnOutput", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "ImageUri3": { "id": "ImageUri3", "path": "integ-assets-docker/ImageUri3", "constructInfo": { - "fqn": "aws-cdk-lib.CfnOutput", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "ImageUri4": { "id": "ImageUri4", "path": "integ-assets-docker/ImageUri4", "constructInfo": { - "fqn": "aws-cdk-lib.CfnOutput", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "ImageUri5": { "id": "ImageUri5", "path": "integ-assets-docker/ImageUri5", "constructInfo": { - "fqn": "aws-cdk-lib.CfnOutput", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "ImageUri6": { "id": "ImageUri6", "path": "integ-assets-docker/ImageUri6", "constructInfo": { - "fqn": "aws-cdk-lib.CfnOutput", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "ImageUri7": { "id": "ImageUri7", "path": "integ-assets-docker/ImageUri7", "constructInfo": { - "fqn": "aws-cdk-lib.CfnOutput", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" + } + }, + "ImageUri8": { + "id": "ImageUri8", + "path": "integ-assets-docker/ImageUri8", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "BootstrapVersion": { "id": "BootstrapVersion", "path": "integ-assets-docker/BootstrapVersion", "constructInfo": { - "fqn": "aws-cdk-lib.CfnParameter", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "CheckBootstrapVersion": { "id": "CheckBootstrapVersion", "path": "integ-assets-docker/CheckBootstrapVersion", "constructInfo": { - "fqn": "aws-cdk-lib.CfnRule", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.Stack", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } }, "Tree": { @@ -365,13 +399,13 @@ "path": "Tree", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.2.69" + "version": "10.3.0" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.App", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.3.0" } } } \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.ts index 3981b408577a0..e6f64809aab9c 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecr-assets/test/integ.assets-docker.ts @@ -41,6 +41,11 @@ const asset7 = new assets.DockerImageAsset(stack, 'DockerImage7', { buildSsh: 'default', }); +const asset8 = new assets.DockerImageAsset(stack, 'DockerImage8', { + directory: path.join(__dirname, 'demo-image'), + cacheDisabled: true, +}); + const user = new iam.User(stack, 'MyUser'); asset.repository.grantPull(user); asset2.repository.grantPull(user); @@ -49,6 +54,7 @@ asset4.repository.grantPull(user); asset5.repository.grantPull(user); asset6.repository.grantPull(user); asset7.repository.grantPull(user); +asset8.repository.grantPull(user); new cdk.CfnOutput(stack, 'ImageUri', { value: asset.imageUri }); new cdk.CfnOutput(stack, 'ImageUri2', { value: asset2.imageUri }); @@ -57,5 +63,6 @@ new cdk.CfnOutput(stack, 'ImageUri4', { value: asset4.imageUri }); new cdk.CfnOutput(stack, 'ImageUri5', { value: asset5.imageUri }); new cdk.CfnOutput(stack, 'ImageUri6', { value: asset6.imageUri }); new cdk.CfnOutput(stack, 'ImageUri7', { value: asset7.imageUri }); +new cdk.CfnOutput(stack, 'ImageUri8', { value: asset8.imageUri }); app.synth(); From e16b8c3c51a38ca34a4972e92d112a0afcecc2cb Mon Sep 17 00:00:00 2001 From: Michael Sambol Date: Sun, 3 Dec 2023 14:09:59 -0800 Subject: [PATCH 3/4] update schema --- .../aws-cdk-lib/cloud-assembly-schema/schema/assets.schema.json | 2 +- .../cloud-assembly-schema/schema/cloud-assembly.schema.json | 2 +- .../cloud-assembly-schema/schema/cloud-assembly.version.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aws-cdk-lib/cloud-assembly-schema/schema/assets.schema.json b/packages/aws-cdk-lib/cloud-assembly-schema/schema/assets.schema.json index 194c2ae23b885..980fbaf0d86de 100644 --- a/packages/aws-cdk-lib/cloud-assembly-schema/schema/assets.schema.json +++ b/packages/aws-cdk-lib/cloud-assembly-schema/schema/assets.schema.json @@ -194,7 +194,7 @@ }, "cacheDisabled": { "description": "Disable the cache and pass `--no-cache` to the `docker build` command. (Default - cache is used)", - "$ref": "#/definitions/DockerCacheDisabled" + "type": "boolean" } } }, diff --git a/packages/aws-cdk-lib/cloud-assembly-schema/schema/cloud-assembly.schema.json b/packages/aws-cdk-lib/cloud-assembly-schema/schema/cloud-assembly.schema.json index d819113764b8f..279dfbe369073 100644 --- a/packages/aws-cdk-lib/cloud-assembly-schema/schema/cloud-assembly.schema.json +++ b/packages/aws-cdk-lib/cloud-assembly-schema/schema/cloud-assembly.schema.json @@ -263,7 +263,7 @@ }, "cacheDisabled": { "description": "Disable the cache and pass `--no-cache` to the `docker build` command. (Default - cache is used)", - "$ref": "#/definitions/ContainerImageAssetCacheDisabled" + "type": "boolean" }, "id": { "description": "Logical identifier for the asset", diff --git a/packages/aws-cdk-lib/cloud-assembly-schema/schema/cloud-assembly.version.json b/packages/aws-cdk-lib/cloud-assembly-schema/schema/cloud-assembly.version.json index c5cb2e5de6344..1f0068d32659a 100644 --- a/packages/aws-cdk-lib/cloud-assembly-schema/schema/cloud-assembly.version.json +++ b/packages/aws-cdk-lib/cloud-assembly-schema/schema/cloud-assembly.version.json @@ -1 +1 @@ -{"version":"35.0.0"} \ No newline at end of file +{"version":"36.0.0"} \ No newline at end of file From 81317bad41ff3ffcaf7c8a921ceda5901ae14cbd Mon Sep 17 00:00:00 2001 From: Michael Sambol Date: Thu, 14 Dec 2023 17:04:10 -0600 Subject: [PATCH 4/4] add feedback from luca --- .../aws-cdk-lib/aws-lambda/test/code.test.ts | 37 +++++++++++++++++++ packages/aws-cdk-lib/core/test/assets.test.ts | 25 +++++++++++++ 2 files changed, 62 insertions(+) diff --git a/packages/aws-cdk-lib/aws-lambda/test/code.test.ts b/packages/aws-cdk-lib/aws-lambda/test/code.test.ts index 4cb41a1078555..7fcc937ed7ee3 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/code.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/code.test.ts @@ -383,6 +383,43 @@ describe('code', () => { }); }); + test('cache disabled', () => { + // given + const stack = new cdk.Stack(); + stack.node.setContext(cxapi.ASSET_RESOURCE_METADATA_ENABLED_CONTEXT, true); + + const dockerfilePath = 'Dockerfile'; + const dockerBuildTarget = 'stage'; + const dockerBuildArgs = { arg1: 'val1', arg2: 'val2' }; + const dockerBuildSsh = 'default'; + + // when + new lambda.Function(stack, 'Fn', { + code: lambda.Code.fromAssetImage(path.join(__dirname, 'docker-lambda-handler'), { + file: dockerfilePath, + target: dockerBuildTarget, + buildArgs: dockerBuildArgs, + buildSsh: dockerBuildSsh, + cacheDisabled: true, + }), + handler: lambda.Handler.FROM_IMAGE, + runtime: lambda.Runtime.FROM_IMAGE, + }); + + // then + Template.fromStack(stack).hasResource('AWS::Lambda::Function', { + Metadata: { + [cxapi.ASSET_RESOURCE_METADATA_PATH_KEY]: 'asset.da491b551a48a7aaf33f41a3bfe7eb269112a87ba24651a2ff8f2d526ca4466c', + [cxapi.ASSET_RESOURCE_METADATA_DOCKERFILE_PATH_KEY]: dockerfilePath, + [cxapi.ASSET_RESOURCE_METADATA_DOCKER_BUILD_ARGS_KEY]: dockerBuildArgs, + [cxapi.ASSET_RESOURCE_METADATA_DOCKER_BUILD_SSH_KEY]: dockerBuildSsh, + [cxapi.ASSET_RESOURCE_METADATA_DOCKER_BUILD_TARGET_KEY]: dockerBuildTarget, + [cxapi.ASSET_RESOURCE_METADATA_PROPERTY_KEY]: 'Code.ImageUri', + [cxapi.ASSET_RESOURCE_METADATA_DOCKER_CACHE_DISABLED_KEY]: true, + }, + }); + }); + test('fails if asset is bound with a second stack', () => { // given const app = new cdk.App(); diff --git a/packages/aws-cdk-lib/core/test/assets.test.ts b/packages/aws-cdk-lib/core/test/assets.test.ts index 10b51a66dbdda..e17bd22a49efd 100644 --- a/packages/aws-cdk-lib/core/test/assets.test.ts +++ b/packages/aws-cdk-lib/core/test/assets.test.ts @@ -143,4 +143,29 @@ describe('assets', () => { expect(toCloudFormation(stack)).toEqual({ }); }); + + test('cached disabled', () => { + // WHEN + stack.synthesizer.addDockerImageAsset({ + sourceHash: 'source-hash', + directoryName: 'directory-name', + dockerCacheDisabled: true, + }); + + // THEN + const assetMetadata = stack.node.metadata.find(({ type }) => type === cxschema.ArtifactMetadataEntryType.ASSET); + + expect(assetMetadata && assetMetadata.data).toBeDefined(); + + if (assetMetadata && assetMetadata.data) { + const data = assetMetadata.data as cxschema.ContainerImageAssetMetadataEntry; + expect(data.packaging).toEqual('container-image'); + expect(data.path).toEqual('directory-name'); + expect(data.sourceHash).toEqual('source-hash'); + expect(data.imageTag).toEqual('source-hash'); + expect(data.cacheDisabled).toEqual(true); + } + + expect(toCloudFormation(stack)).toEqual({ }); + }); });