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:“找不到匹配的工件路径”的主要内容,如果未能解决你的问题,请参考以下文章