22

我正在尝试让 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 文档都无济于事(还有什么新东西?)。我怎样才能让它正确上传工件?

4

7 回答 7

15

工件应引用从您的 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同一个分叉仓库中。

于 2017-01-13T16:34:50.980 回答
3

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

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

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

artifacts: files: -'FileNameWithPath'

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

希望这可以帮助。

于 2020-03-23T13:02:00.500 回答
2

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

于 2021-02-13T07:18:19.797 回答
1

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

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

于 2018-07-24T14:24:33.050 回答
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 和/或子文件夹中,具体取决于在 Artifacts 部分的其余部分中选择的选项

于 2020-03-21T22:03:26.010 回答
0

尝试使用 buildspec 的 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/*

于 2021-03-16T11:51:02.967 回答
0

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

您需要使用以下内容

- printf '[{"name":"container-name-here","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > $CODEBUILD_SRC_DIR/imagedefinitions.json
于 2021-12-18T03:22:27.923 回答