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 项目