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

时间:2017-01-13 02:36:12

标签: amazon-web-services aws-codepipeline aws-codebuild

我试图让CodePipeline从GitHub获取我的代码并使用CodeBuild构建它。第一个(源)步骤工作正常。但是第二个(Build)步骤在“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文档无济于事(还有什么是新的?)。如何才能正确上传工件?

6 个答案:

答案 0 :(得分:11)

工件应引用从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.json buildspec.yml位于相同的分叉回购中。

答案 1 :(得分:2)

就我而言,我收到此错误是因为我在构建阶段更改了目录(我正在构建的 Java 项目位于子目录中)并且没有更改回根目录。在构建阶段的末尾添加 cd .. 就成功了。

答案 2 :(得分:1)

我遇到了类似的问题,解决此问题的解决方案是“在压缩文件中打包目录和文件,而无需进一步创建根文件夹”。

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

答案 3 :(得分:1)

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

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

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

artifacts: files: -'FileNameWithPath'

  1. 如果您使用的是.gitignore文件,请确保在“工件”部分中指定了文件 未包含在.gitignore文件中

希望这会有所帮助。

答案 4 :(得分:0)

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

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

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

这个文件在S3中为我显示,根据在“工件”部分其余部分中选择的选项,可以选择在zip和/或子文件夹中出现

答案 5 :(得分:0)

尝试使用构建规范的 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/*