diff --git a/layer-publisher/package-lock.json b/layer-publisher/package-lock.json index 5b2e764f8e..d11142aec9 100644 --- a/layer-publisher/package-lock.json +++ b/layer-publisher/package-lock.json @@ -11,7 +11,8 @@ "aws-cdk-lib": "2.25.0", "constructs": "^10.0.0", "if-node-version": "^1.1.1", - "source-map-support": "^0.5.16" + "source-map-support": "^0.5.16", + "ts-md5": "^1.3.1" }, "bin": { "layer-publisher": "bin/layer-publisher.js" @@ -6345,6 +6346,14 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/ts-md5": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.3.1.tgz", + "integrity": "sha512-DiwiXfwvcTeZ5wCE0z+2A9EseZsztaiZtGrtSaY5JOD7ekPnR/GoIVD5gXZAlK9Na9Kvpo9Waz5rW64WKAWApg==", + "engines": { + "node": ">=12" + } + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -11784,6 +11793,11 @@ } } }, + "ts-md5": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.3.1.tgz", + "integrity": "sha512-DiwiXfwvcTeZ5wCE0z+2A9EseZsztaiZtGrtSaY5JOD7ekPnR/GoIVD5gXZAlK9Na9Kvpo9Waz5rW64WKAWApg==" + }, "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", diff --git a/layer-publisher/package.json b/layer-publisher/package.json index 2d8040c4f5..e9a8b96f21 100644 --- a/layer-publisher/package.json +++ b/layer-publisher/package.json @@ -30,6 +30,7 @@ "aws-cdk-lib": "2.25.0", "constructs": "^10.0.0", "if-node-version": "^1.1.1", - "source-map-support": "^0.5.16" + "source-map-support": "^0.5.16", + "ts-md5": "^1.3.1" } } diff --git a/layer-publisher/src/powertools-typescript-layer.ts b/layer-publisher/src/powertools-typescript-layer.ts index 62620eba4d..029925aa65 100644 --- a/layer-publisher/src/powertools-typescript-layer.ts +++ b/layer-publisher/src/powertools-typescript-layer.ts @@ -2,6 +2,7 @@ import * as path from 'path'; import { aws_lambda as lambda } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { execSync } from 'child_process'; +import { Md5 } from 'ts-md5'; export interface PowerToolsTypeScriptLayerProps { /** @@ -17,10 +18,28 @@ export interface PowerToolsTypeScriptLayerProps { export class PowerToolsTypeScriptLayer extends lambda.LayerVersion { public constructor(scope: Construct, id: string, props?: PowerToolsTypeScriptLayerProps) { + const version = props?.version ?? 'latest'; + console.log(`publishing layer ${props?.layerVersionName} version : ${version}`); + + const commands = [ + 'mkdir nodejs', + 'cd nodejs', + 'npm init -y', + `npm install --save \ + @aws-lambda-powertools/commons@${version} \ + @aws-lambda-powertools/logger@${version} \ + @aws-lambda-powertools/metrics@${version} \ + @aws-lambda-powertools/tracer@${version}`, + 'rm package.json package-lock.json', + ]; + const commandJoined = commands.join(' && '); + super(scope, id, { layerVersionName: props?.layerVersionName, + description: `Lambda Powertools for TypeScript version ${props?.version}`, compatibleRuntimes: [ lambda.Runtime.NODEJS_12_X, lambda.Runtime.NODEJS_14_X, lambda.Runtime.NODEJS_16_X ], code: lambda.Code.fromAsset(path.join(__dirname, '.'), { + assetHash: Md5.hashStr(commandJoined), bundling: { image: lambda.Runtime.NODEJS_12_X.bundlingImage, local: { @@ -31,21 +50,7 @@ export class PowerToolsTypeScriptLayer extends lambda.LayerVersion { return false; } - const commands = [ - 'mkdir nodejs && cd nodejs', - 'npm init -y', - `npm install @aws-lambda-powertools/commons@${ - props?.version ?? 'latest' - } @aws-lambda-powertools/logger@${props?.version ?? 'latest'} @aws-lambda-powertools/metrics@${ - props?.version ?? 'latest' - } @aws-lambda-powertools/tracer@${props?.version ?? 'latest'}`, - 'rm package.json package-lock.json', - 'cd ..', - `cp -a nodejs ${outputDir}`, - `rm -rf nodejs`, - ]; - - execSync(commands.join(' && ')); + execSync(commandJoined, { cwd: outputDir }); return true; }, diff --git a/layer-publisher/tests/e2e/happy-case.test.lambda.ts b/layer-publisher/tests/e2e/happy-case.test.lambda.ts index db91d2724b..f454713f79 100644 --- a/layer-publisher/tests/e2e/happy-case.test.lambda.ts +++ b/layer-publisher/tests/e2e/happy-case.test.lambda.ts @@ -31,7 +31,7 @@ exports.handler = function (_event: never, _ctx: unknown): void { if (packageJSON.version != process.env.POWERTOOLS_PACKAGE_VERSION) { throw new Error( - `Package version mismatch: \${packageJSON.version} != \${process.env.POWERTOOLS_PACKAGE_VERSION}` + `Package version mismatch: ${packageJSON.version} != ${process.env.POWERTOOLS_PACKAGE_VERSION}` ); } } catch (error) { diff --git a/layer-publisher/tests/unit/__snapshots__/layer-publisher.test.ts.snap b/layer-publisher/tests/unit/__snapshots__/layer-publisher.test.ts.snap index 66349ba291..161eb78d35 100644 --- a/layer-publisher/tests/unit/__snapshots__/layer-publisher.test.ts.snap +++ b/layer-publisher/tests/unit/__snapshots__/layer-publisher.test.ts.snap @@ -32,8 +32,9 @@ Object { "S3Bucket": Object { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "dfbb723532549b2040a663602bbe51ab6b3f16dfd063eafc5bbd7e64b13f997d.zip", + "S3Key": "c2f621503b147cecccf2e6cc6df420a8f11ee29ae042d2c1f523cf5db3f47ca2.zip", }, + "Description": "Lambda Powertools for TypeScript version 1.0.1", "LayerName": "AWSLambdaPowertoolsTypeScript", }, "Type": "AWS::Lambda::LayerVersion",