AWS CodeBuild + CodePipeline: "未找到匹配的构件路径"

26

我正在尝试让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文档都没有找到答案(这有什么新鲜事吗?)。我该如何使它正确地上传artifact?


1
你解决了这个问题吗?我正在使用我的Node.js应用程序遇到完全相同的问题。如果可以请帮忙一下。 - Jeet
@Jeet 是的,我想我需要使用 '**/*' 作为源代码,或者类似的东西。请查看 "artifacts" 部分:http://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html#build-spec-ref-syntax - John D.
谢谢John的快速回复。我会尝试一下。非常感谢你的帮助。 - Jeet
8个回答

16

这些工件应该是从您的源操作下载或作为 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在同一个分支库中。

1
你需要参考它下载和存储的文件(即S3)和/或生成并存储在那里的文件。这很有道理,但我怎么知道这些值的名称是什么?我查看了源操作的S3存储桶,它们似乎是随机生成的名称。 - John D.
2
抱歉,我认为我的S3参考混淆了事情。为了澄清,在您的buildspec的artifacts/files部分中,您将列出用于从源代码库构建的文件(即GitHub中的文件 - 而不是从CodePipeline生成的随机名称),以及从构建过程中生成的任何相关文件。根据提供的信息,尚不清楚您正在构建哪种语言/平台。 - Paul Duvall
1
啊,我现在明白了。哎呀,这些工具的文档实在是太令人困惑了。谢谢! - John D.
1
“未找到匹配的构件路径”这个措辞非常令人困惑。 - Andy Hayden

4
在我的案例中,我收到了这个错误是因为在构建阶段更改了目录(我正在构建的Java项目在子目录中),并且没有切换回根目录。在构建阶段的末尾添加cd ..就可以解决问题。

3
构建规范工件是关于CodeBuild可以在哪里找到构建输出以及CodeBuild如何准备它上传到Amazon S3输出存储桶的信息。
对于错误“未找到匹配的工件路径”,请检查以下几点:
  1. 在buildspec.yml文件中指定的工件文件具有正确的路径和文件名。

artifacts: files: -'FileNameWithPath'

  1. 如果您使用.gitignore文件,请确保Artifacts部分指定的文件未包含在.gitignore文件中。
希望这可以帮助您。

1

1

就像@jd96所写的那样,我遇到了同样的问题。我需要返回到项目的根目录以导出构件。

build:
 commands:
  - cd tasks/jobs
  - make build
  - cd ../..
post_build:
 commands:
  - printf '[{"name":"%s","imageUri":"%s"}]' $IMAGE_REPO_NAME $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json

构件: 文件:imagedefinitions.json


1
如果你和我一样,在使用CodePipeline安排中遇到了这个问题,那么你需要使用以下方法。
- printf '[{"name":"container-name-here","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > $CODEBUILD_SRC_DIR/imagedefinitions.json

0

尝试使用版本为0.2的buildspec

这里是Node.js的典型示例

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/*


0

构件是您从构建过程中想要的东西 - 无论是以某种方式编译还是直接从源代码复制的文件。因此,构建服务器会拉取代码,根据您的指示进行编译,然后将指定的文件复制到 S3 中。

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

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

这个文件对我来说出现在S3中,根据Artifacts部分中选择的选项,可以选择以zip和/或子文件夹的形式出现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接