我已经创建了两个不同的TypeScript cdk管道,它们在CodeBuild阶段都会遇到相同的tsc错误。
其中两个管道是通过cdk文档复制的:
本质上,npm i (或npm ci) + tsc在本地工作良好,但是当通过CodeBuild完成时,我的依赖项似乎没有安装它们的依赖项,从而导致tsc中断。
还有其他人遇到过这个问题吗?或者换句话说,为什么npm install + tsc在CodeBuild上的行为会有所不同?
CodeBuild日志1:
[Container] 2021/03/11 19:11:35 Waiting for DOWNLOAD_SOURCE
[Container] 2021/03/11 19:11:36 Phase is DOWNLOAD_SOURCE
[Container] 2021/03/11 19:11:36 CODEBUILD_SRC_DIR=/codebuild/output/src038984068/src
[Container] 2021/03/11 19:11:36 YAML location is /codebuild/readonly/buildspec.yml
[Container] 2021/03/11 19:11:36 Processing environment variables
[Container] 2021/03/11 19:11:36 No runtime version selected in buildspec.
[Container] 2021/03/11 19:11:36 Moving to directory /codebuild/output/src038984068/src
[Container] 2021/03/11 19:11:36 Registering with agent
[Container] 2021/03/11 19:11:36 Phases found in YAML: 2
[Container] 2021/03/11 19:11:36 PRE_BUILD: 1 commands
[Container] 2021/03/11 19:11:36 BUILD: 2 commands
[Container] 2021/03/11 19:11:36 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED
[Container] 2021/03/11 19:11:36 Phase context status code: Message:
[Container] 2021/03/11 19:11:36 Entering phase INSTALL
[Container] 2021/03/11 19:11:36 Phase complete: INSTALL State: SUCCEEDED
[Container] 2021/03/11 19:11:36 Phase context status code: Message:
[Container] 2021/03/11 19:11:36 Entering phase PRE_BUILD
[Container] 2021/03/11 19:11:36 Running command npm ci
added 772 packages in 7.728s
[Container] 2021/03/11 19:11:48 Phase complete: PRE_BUILD State: SUCCEEDED
[Container] 2021/03/11 19:11:48 Phase context status code: Message:
[Container] 2021/03/11 19:11:48 Entering phase BUILD
[Container] 2021/03/11 19:11:48 Running command npm run build
> cdk-s3-sns-lambda@0.1.0 build /codebuild/output/src038984068/src
> tsc
node_modules/@aws-cdk/aws-codebuild/lib/pipeline-project.d.ts(1,27): error TS2307: Cannot find module 'constructs' or its corresponding type declarations.
(...cascade of missing module errors)
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! cdk-s3-sns-lambda@0.1.0 build: `tsc`
npm ERR! Exit status 2CodeBuild日志2:
[Container] 2021/03/11 19:54:10 Waiting for agent ping
[Container] 2021/03/11 19:54:15 Waiting for DOWNLOAD_SOURCE
[Container] 2021/03/11 19:54:16 Phase is DOWNLOAD_SOURCE
[Container] 2021/03/11 19:54:16 CODEBUILD_SRC_DIR=/codebuild/output/src363431369/src
[Container] 2021/03/11 19:54:16 YAML location is /codebuild/readonly/buildspec.yml
[Container] 2021/03/11 19:54:16 Processing environment variables
[Container] 2021/03/11 19:54:16 No runtime version selected in buildspec.
[Container] 2021/03/11 19:54:16 Moving to directory /codebuild/output/src363431369/src
[Container] 2021/03/11 19:54:16 Registering with agent
[Container] 2021/03/11 19:54:16 Phases found in YAML: 2
[Container] 2021/03/11 19:54:16 INSTALL: 1 commands
[Container] 2021/03/11 19:54:16 BUILD: 2 commands
[Container] 2021/03/11 19:54:16 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED
[Container] 2021/03/11 19:54:16 Phase context status code: Message:
[Container] 2021/03/11 19:54:16 Entering phase INSTALL
[Container] 2021/03/11 19:54:16 Running command npm install
npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2. Ill try to do my best with it!
npm WARN pipeline@0.1.0 No repository field.
npm WARN pipeline@0.1.0 No license field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.3.2 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
added 762 packages from 491 contributors and audited 764 packages in 12.459s
28 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
[Container] 2021/03/11 19:54:30 Phase complete: INSTALL State: SUCCEEDED
[Container] 2021/03/11 19:54:30 Phase context status code: Message:
[Container] 2021/03/11 19:54:30 Entering phase PRE_BUILD
[Container] 2021/03/11 19:54:30 Phase complete: PRE_BUILD State: SUCCEEDED
[Container] 2021/03/11 19:54:30 Phase context status code: Message:
[Container] 2021/03/11 19:54:30 Entering phase BUILD
[Container] 2021/03/11 19:54:30 Running command npm run build
> pipeline@0.1.0 build /codebuild/output/src363431369/src
> tsc
node_modules/@aws-cdk/aws-codebuild/lib/artifacts.d.ts(1,21): error TS2307: Cannot find module '@aws-cdk/aws-s3' or its corresponding type declarations.
(...more missing module errors)
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! pipeline@0.1.0 build: `tsc`
npm ERR! Exit status 2其他详情:
// lib/pipeline-stack.ts
import * as cdk from '@aws-cdk/core';
import * as codecommit from '@aws-cdk/aws-codecommit';
import * as codepipeline from '@aws-cdk/aws-codepipeline';
import * as codepipeline_actions from '@aws-cdk/aws-codepipeline-actions';
import { SimpleSynthAction, CdkPipeline } from '@aws-cdk/pipelines';
export class PipelineStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id);
const repo = new codecommit.Repository(this, 'UploadRepo', {
repositoryName: 'cdk-s3-sns-lambda'
});
const sourceArtifact = new codepipeline.Artifact();
const cloudAssemblyArtifact = new codepipeline.Artifact();
new CdkPipeline(this, 'CodePipeline', {
crossAccountKeys: false,
cloudAssemblyArtifact,
sourceAction: new codepipeline_actions.CodeCommitSourceAction({
actionName: 'CodeCommit',
output: sourceArtifact,
repository: repo
}),
synthAction: SimpleSynthAction.standardNpmSynth({
sourceArtifact,
cloudAssemblyArtifact,
buildCommand: 'npm run build'
}),
});
}
}
// bin/pipeline.ts
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from '@aws-cdk/core';
import { PipelineStack } from '../lib/pipeline-stack';
const app = new cdk.App();
new PipelineStack(app, 'AppPipelineStack');buildspec.yaml日志1生成CodeBuild:{
"version": "0.2",
"phases": {
"pre_build": {
"commands": [
"npm ci"
]
},
"build": {
"commands": [
"npm run build",
"npx cdk synth"
]
}
},
"artifacts": {
"base-directory": "cdk.out",
"files": "**/*"
}
}发布于 2021-03-25 07:46:34
我一直面临着同样的问题。
这个GH问题(https://github.com/aws/aws-cdk/issues/13339)的解决办法帮助了我.
我这样改变了我在CDK的构建规范
synthAction: SimpleSynthAction.standardNpmSynth({
sourceArtifact,
cloudAssemblyArtifact,
installCommand: 'npm i -g npm && npm ci'
}),这将为管道构建步骤生成以下(内联)构建规范:
{
"version": "0.2",
"phases": {
"pre_build": {
"commands": [
"npm i -g npm && npm ci"
]
},
"build": {
"commands": [
"npx cdk synth"
]
}
},
"artifacts": {
"base-directory": "cdk.out",
"files": "**/*"
}
}在第一次推送代码并运行管道之后,我不得不自己修改buildspec,因为管道突变步骤是在构建步骤之后触发的。因此,设置将在突变步骤之后应用。
发布于 2021-04-06 17:06:44
简短回答
在本地和CodeBuild中使用相同的npm版本。我怀疑这个问题的出现是因为您在本地使用的npm版本比CodeBuild正在使用的版本要新。
较长答案
CodeBuild在特定的环境(Docker )中运行构建,并且这个环境安装了某些版本的运行时/包,例如Node.js/npm。因此,如果您使用npmv7.x进行开发,并且您的CodeBuild使用npmv6.x,那么npm ci命令使用的包-lock.json文件将与CodeBuild的环境不兼容,构建将失败。
(当使用CDK时,会为您选择图像作为SimpleSynthAction.standardNpmSynth操作的一部分。)
幸运的是,您可以更改其中一个以匹配另一个。
使本地版本的Node.js/npm与CodeBuild中使用的版本匹配
SimpleSynthAction.standardNpmSynth 使用的默认映像是"Ubuntu标准:4.0“.使CodeBuild使用所需的运行时版本
同样,实现这一目标的方法有多种:
environment属性synthAction:new CdkPipeline( this,'CodePipeline',{ crossAccountKeys: false,cloudAssemblyArtifact,sourceAction: new codepipeline_actions.CodeCommitSourceAction({ actionName:'CodeCommit',输出: sourceArtifact,存储库: repo }),synthAction: SimpleSynthAction.standardNpmSynth({ sourceArtifact,cloudAssemblyArtifact,环境:{ buildImage: LinuxBuildImage.STANDARD_5_0 },buildCommand:'npm run build‘},});installCommand重写'npm i -g npm && npm ci',这是@ GitHub问题引用的GitHub问题的作者所建议的。我个人不建议这样做,这似乎有点太麻烦了,而且也不能保证它会(继续)工作。奖金信息
您可以使用本地运行CodeBuild来模拟CodeBuild环境。从指南中也可以清楚地看到,您正在决定使用哪个码头形象。
结论
您所描述的问题可能只是NPMv6.x与v7.x之间的一个特殊问题,但我认为它代表了更广泛的问题类别,所有这些问题都应该通过了解不同包/运行时CodeBuild使用的版本来解决,本质上使您的期望与现实保持一致(或改变现实)。
https://stackoverflow.com/questions/66590492
复制相似问题