AWS CodeBuild + CodePipeline:“找不到匹配的工件路径”

Posted

技术标签:

【中文标题】AWS CodeBuild + CodePipeline:“找不到匹配的工件路径”【英文标题】:AWS CodeBuild + CodePipeline: "No matching artifact paths found" 【发布时间】:2017-05-28 08:21:10 【问题描述】:

我正在尝试让 CodePipeline 从 GitHub 获取我的代码并使用 CodeBuild 构建它。第一个(源)步骤工作正常。但是第二个(构建)步骤在“UPLOAD_ARTIFACTS”部分失败。以下是相关的日志语句:

[Container] 2017/01/12 17:21:31 Assembling file list
[Container] 2017/01/12 17:21:31 Expanding MyApp
[Container] 2017/01/12 17:21:31 Skipping invalid artifact path MyApp
[Container] 2017/01/12 17:21:31 Phase complete: UPLOAD_ARTIFACTS Success: false
[Container] 2017/01/12 17:21:31 Phase context status code: ARTIFACT_ERROR Message: No matching artifact paths found
[Container] 2017/01/12 17:21:31 Runtime error (No matching artifact paths found)

我的应用在其根文件夹中有一个 buildspec.yml。它看起来像:

version: 0.1

phases:
  build:
    commands:
      - echo `$BUILD_COMMAND`

artifacts:
  discard-paths: yes
  files:
    - MyApp

似乎我的 buildspec.yml 中的“MyApp”应该有所不同,但我翻遍了所有 AWS 文档都无济于事(还有什么新东西?)。我怎样才能让它正确上传工件?

【问题讨论】:

您是否发现我的 nodejs 应用程序面临完全相同的问题。如果可以请帮忙。 @Jeet 是的,我想我需要使用 '*/' 作为来源,或者类似的东西。查找“工件”部分:docs.aws.amazon.com/codebuild/latest/userguide/… 感谢约翰的快速回复。我会试一试。非常感谢您的帮助。 【参考方案1】:

工件应引用从您的 Source 操作下载的文件或作为 CodePipeline 中的 Build 操作的一部分生成的文件。例如,这是来自我写的 buildspec.yml:

artifacts:
  files:
    - appspec.yml
    - target/SampleMavenTomcatApp.war
    - scripts/*

当我看到您在工件部分使用 MyApp 时,我觉得您指的是 CodePipeline 的 Source 操作的 OutputArtifacts。相反,您需要参考它下载并存储在那里(即 S3)和/或它生成并存储在那里的文件。

您可以在此处找到使用 CodePipeline、CodeBuild、CodeDeploy 和 CodeCommit 的 CloudFormation 模板示例:https://github.com/stelligent/aws-codedeploy-sample-tomcat/blob/master/codebuild-cpl-cd-cc.jsonbuildspec.yml 位于同一个分叉存储库中。

【讨论】:

“您需要参考它下载并存储在那里(即 S3)和/或它生成并存储在那里的文件”这是有道理的,但我怎么知道这些值的名称是什么?我查看了 Source 操作的 S3 存储桶,它们似乎是随机生成的名称。 对不起,我认为我的 S3 引用混淆了一些东西。为了澄清,在您的构建规范的工件/文件部分,您将列出您用于从源存储库构建的文件(即 GitHub 中的文件 - 而不是从 CodePipeline 生成的随机生成的名称)和任何相关文件从您的构建过程中生成。根据提供的信息,您正在构建的语言/平台尚不清楚。 啊,我现在明白了。伙计,这些工具的文档令人难以置信的混乱。谢谢! “找不到匹配的工件路径”这句话非常令人困惑。【参考方案2】:

Buildspec 工件是有关 CodeBuild 可以在哪里找到构建输出以及 CodeBuild 如何准备将其上传到 Amazon S3 输出存储桶的信息。

对于错误“未找到匹配的工件路径”需要检查的几件事:

    在 buildspec.yml 文件中指定的工件文件具有正确的路径和文件名。

artifacts: files: -'FileNameWithPath'

    如果您使用的是 .gitignore 文件,请确保在 Artifacts 部分指定文件 不包含在 .gitignore 文件中

希望这会有所帮助。

【讨论】:

【参考方案3】:

就我而言,我收到此错误是因为我在构建阶段更改了目录(我正在构建的 java 项目位于子目录中)并且没有更改回根目录。在构建阶段结束时添加cd ..就可以了。

【讨论】:

【参考方案4】:

我遇到了类似的问题,解决问题的方法是“将目录和文件打包到存档中,不再创建根文件夹”。

https://docs.aws.amazon.com/codebuild/latest/userguide/sample-war-hw.html

【讨论】:

【参考方案5】:

工件是您想要从构建过程中获得的东西 - 无论是以某种方式编译还是只是直接从源代码复制的文件。因此构建服务器拉入代码,按照您的说明进行编译,然后将指定的文件复制到 S3。

在我使用 Spring Boot + Gradle 的情况下,输出 jar 文件(当我在自己的系统上 gradle bootJar 这个时)放在 build/libs/demo1-0.0.1-SNAPSHOT.jar 中,所以我设置以下在 buildspec.yml 中:

artifacts:
  files:
    - build/libs/*.jar

这个文件在 S3 中为我显示,可以选择在 zip 和/或子文件夹中,具体取决于在工件部分的其余部分中选择的选项

【讨论】:

【参考方案6】:

尝试使用版本 0.2 的构建规范

这里是nodejs的一个典型例子

version: 0.2
phases:
  pre_build:
    commands:
      - echo Nothing to do in the pre_build phase...
  build:
    commands:
      - npm install
      - npm run build
  post_build:
    commands:
      - echo Build completed on
artifacts:
  files:
    - appspec.yml
    - build/*

【讨论】:

【参考方案7】:

如果您像我一样在 CodePipeline 安排中使用 Codebuild 时遇到了这个问题。

你需要使用以下

- printf '["name":"container-name-here","imageUri":"%s"]' $REPOSITORY_URI:$IMAGE_TAG > $CODEBUILD_SRC_DIR/imagedefinitions.json

【讨论】:

以上是关于AWS CodeBuild + CodePipeline:“找不到匹配的工件路径”的主要内容,如果未能解决你的问题,请参考以下文章

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

AWS CodePipeline 不遵守 CodeBuild 设置

使用 AWS CDK 创建用于构建 Docker 映像的 CodeBuild 项目

AWS codeBuild 不运行 .ebextension 配置

如何强制 CodeBuild (AWS) 失败?

AWS CodeBuild ECR CannotPullContainerError