AWS CodeBuild 不适用于 Yarn 工作区

Posted

技术标签:

【中文标题】AWS CodeBuild 不适用于 Yarn 工作区【英文标题】:AWS CodeBuild does not work with Yarn Workspaces 【发布时间】:2019-09-17 07:20:10 【问题描述】:

我在我的存储库中使用 Yarn Workspaces,并且还使用 AWS CodeBuild 来构建我的包。构建开始时,CodeBuild 需要 60 秒来安装所有包,我想避免这次缓存 node_modules 文件夹。

当我添加时:

cache:
  paths:
    - 'node_modules/**/*'

到我的buildspec 文件并启用LOCAL_CUSTOM_CACHE,我收到此错误:

错误发生意外错误:“EEXIST:文件已存在,mkdir'/codebuild/output/src637134264/src/git-codecommit.us-east-2.amazonaws.com/v1/repos/MY_REPOSITORY/node_modules/@包/配置”。

有没有办法消除配置 AWS CodeBuild 或 Yarn 时出现的错误?

我的构建规范文件:

version: 0.2
phases:
  install:
    commands:
      - npm install -g yarn
      - git config --global credential.helper '!aws codecommit credential-helper $@'
      - git config --global credential.UseHttpPath true
      - yarn
  pre_build:
    commands:
      - git rev-parse HEAD
      - git pull origin master
  build:
    commands:
      - yarn run build
      - yarn run deploy
  post_build:
    commands:
      - echo 'Finished.'
cache:
  paths:
    - 'node_modules/**/*'

谢谢!

更新 1:

Yarn 正在尝试创建文件夹/codebuild/output/src637134264/src/git-codecommit.us-east-2.amazonaws.com/v1/repos/MY_REPOSITORY/node_modules/@packages/configs,在install 阶段使用命令- yarn。该文件夹是我的存储库包之一,名为@packages/config。当我在我的计算机上运行yarn 时,Yarn 会创建链接我的包的文件夹,如here 所述。我的node_modules 结构在我的计算机上的示例:

node_modules/
|-- ...
|-- @packages/
|   |-- configs/
|   |-- myPackageA/
|   |-- myPackageB/
|-- ...

【问题讨论】:

感谢您报告问题。我们来看看。您的构建逻辑或 CodeBuild 是否尝试了 mkdir? (我假设这是基于您的构建规范的 CodeBuild)。 @SubinMathew 感谢您的回复。安装阶段的命令- yarn 尝试创建该文件夹,这是我的软件包之一。我已经更新了我的答案,提供了更多详细信息。 我们进行了一些改进以保持文件路径隐式静态。您能否再试一次,如果您遇到同样的问题,请告诉我们? @SubinMathew 我尝试使用相同的配置运行 CodeBuild,但收到相同的错误:` 错误:EEXIST:文件已存在,mkdir '/codebuild/output/src046905303/src/ git-codecommit.us-east-1.amazonaws.com/v1/repos/MY_REPOSITORY/node_modules/@packages/appsync-backend'`。我需要更改一些配置吗? @PedroArantes 你解决了这个问题吗?我遇到了同样的错误。 【参考方案1】:

我遇到了完全相同的问题(“EEXIST: file already exists, mkdir”),我最终使用了 S3 缓存并且效果很好。 注意:由于某种原因,第一次上传到 S3 的时间(10 分钟)太长,其他都正常。

之前:

[5/5] Building fresh packages...
--
Done in 60.28s.

之后:

[5/5] Building fresh packages...
--
Done in 6.64s.

如果您已经配置了项目,则可以通过访问项目 -> 编辑 -> 工件 -> 附加配置来编辑缓存。

我的 buildspec.yml 如下:

version: 0.2

phases:
  install:
    runtime-versions:
       nodejs: 14
  build:
    commands:
      - yarn config set cache-folder /root/.yarn-cache
      - yarn install --frozen-lockfile
      - ...other build commands go here

cache:
  paths:
    - '/root/.yarn-cache/**/*'
    - 'node_modules/**/*'
    # This third entry is only if you're using monorepos (under the packages folder)
    # - 'packages/**/node_modules/**/*'

如果你使用 NPM,你会做类似的事情,但命令略有不同:

version: 0.2

phases:
  install:
    runtime-versions:
       nodejs: 14
  build:
    commands:
      - npm config -g set prefer-offline true
      - npm config -g set cache /root/.npm
      - npm ci
      - ...other build commands go here

cache:
  paths:
    - '/root/.npm-cache/**/*'
    - 'node_modules/**/*'
    # This third entry is only if you're using monorepos (under the packages folder)
    # - 'packages/**/node_modules/**/*'

感谢:https://mechanicalrock.github.io/2019/02/03/monorepos-aws-codebuild.html

【讨论】:

以上是关于AWS CodeBuild 不适用于 Yarn 工作区的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS Codebuild 时如何读取 SSM 参数?

AWS CodePipeline:如何使 CodeBuild 构建的 ECR 映像作为剩余阶段的工件?

AWS CodePipeline 能否在不劫持 CodeBuild 的工件设置的情况下触发 AWS CodeBuild?

AWS Batch 与 AWS CodeBuild

无法将更改从 AWS CodeBuild 推送到 AWS CodeCommit

AWS CodePipeline 不遵守 CodeBuild 设置