在 AWS CodePipeline 中运行 `npm ci` 失败:“无法读取未定义的属性‘aws-cdk-lib’”

Eli*_*hle 6 amazon-web-services npm aws-codepipeline aws-codebuild aws-cdk

npm ci在 AWS CodePipeline 中调用时,我遇到了一些奇怪的行为。

NPM文档建议使用npm ci(“全新安装”)而不是npm install在自动化环境中。AWS CDK 文档在其CDK 管道示例中遵循此建议:

const pipeline = new pipelines.CodePipeline(this, 'Pipeline', {
  synth: new pipelines.ShellStep('Synth', {
    ...
    commands: [
      'npm ci',
      'npm run build',
      'npx cdk synth',
    ],
  }),
});
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试此操作时,我的管道在npm ci命令中失败,并出现奇怪的错误消息:

[Container] 2022/12/14 16:00:37 Running command npm ci
npm ERR! Cannot read property 'aws-cdk-lib' of undefined
Run Code Online (Sandbox Code Playgroud)

该包aws-cdk-lib是我的依赖项中的第一个条目package.json。所以看起来 CodeBuild 在通过安装时无法解析我的依赖项npm cinpm ci奇怪的是,当我替换为...时,一切正常npm install,但我想找到一种方法来使其与 一起工作npm ci

Eli*_*hle 8

不起作用的原因npm ci是 CodeBuild 使用旧版本的 npm。当我检查时,npm 的最新版本是 9.2.0,但 CodeBuild 使用的是 6.14.17。

在运行之前更新 npmnpm ci修复了该问题:

const pipeline = new pipelines.CodePipeline(this, 'Pipeline', {
  synth: new pipelines.ShellStep('Synth', {
    ...
    // Update npm before running commands
    installCommands: ['npm i -g npm@latest'],
    commands: [
      'npm ci',
      'npm run build',
      'npx cdk synth',
    ],
  }),
});
Run Code Online (Sandbox Code Playgroud)

可以在此处找到问题和修复的最小工作示例。

  • 我想补充一点,必须重新创建管道,因为如果构建失败,它不能改变自己的构建步骤。我花了一段时间才弄清楚这一点。 (3认同)