我试图将我的GitHub存储库与S3挂钩,因此每次提交时,AWS CodePipeline都会将./<path>/public
文件夹部署到指定的S3 bucket
。
到目前为止,在我的管道中,Source
可以正常工作(已挂接到GitHub并接收新的提交),但是Deploy
失败的原因是:Action execution failed
BundleType must be either YAML or JSON
。
这是我设置它们的方式:
我知道根文件夹中必须有一个buildspec.yml
文件。我尝试使用一些我可以找到的文件,但它们似乎不起作用。我做错了什么,或者我应该如何编辑buildspec
文件以执行我想要的工作?
更新
感谢@Milan Cermak。我知道我需要这样做:
CodePipeline:
buildspec.yml
文件仅获取所需的文件夹。Action Provider: S3
Input Artifacts: OutputArtifacts (result of stage 2).
Bucket: the bucket that hosts the static website.
CodePipeline有效。但是,输出仅包含文件(.html),而不包含嵌套在公用文件夹内的文件夹。
我已经检查了this并想出了如何使用discard-paths: yes
删除嵌套文件夹的路径,但是无法获取./<path>/public
文件夹中的所有子文件夹。有什么建议吗?
答案 0 :(得分:2)
CodeBuild使用buildspec,但是CodeDeploy使用appspec。
是否有任何appspec文件?
答案 1 :(得分:2)
您不应该使用CodeDeploy,因为它是用于自动化应用程序部署的服务,而应该是CodeBuild,它执行命令并准备部署工件以便在管道中进一步使用。
这些命令在buildspec.yml
文件中(通常在回购的根目录中,但是它是可配置的)。对于您的用例,它不会太复杂,因为您不需要编译任何东西或运行测试等。
尝试以此为起点:
version: 0.2
phases:
build:
commands:
- ls
artifacts:
files:
- public/*
必填phases
部分,这就是为什么要包含它的原因(至少要感谢ls
命令,您会看到CodeBuild环境中存在哪些文件),但是对于你的情况。有趣的是artifacts
部分。在这里您可以定义CodeBuild阶段的输出,即进一步传递到管道中下一步的内容。
取决于您希望文件的结构(例如,您是否希望在工件中也有public
目录,还是只想拥有文件本身,而没有父目录),您可能想使用artifacts
部分中可能的其他配置。有关详细信息,请参见buildspec reference。
请记住将CodeBuild步骤的输出工件用作Deploy to S3步骤的输入工件。
答案 2 :(得分:1)
t_yamo指出,Buildspec用于CodeBuild。
您正在使用CodeDeploy,该代码使用一个appspec.yml文件,该文件在我的配置中看起来像这样。
version: 0.0
os: linux
files:
- source: /
destination: /path/to/destination
hooks:
BeforeInstall:
- location: /UnzipResourceBundle.sh
ApplicationStart:
- location: /RestartServer.sh
timeout: 3600
UnzipResourceBundle.sh只是一个bash脚本,可用于执行许多操作。
#!/bin/bash
// Do something
从Amazon Documentation中找到AppSpec.yml文件的示例。
答案 3 :(得分:0)
CodePipeline最近宣布了部署到S3的操作:https://aws.amazon.com/about-aws/whats-new/2019/01/aws-codepipeline-now-supports-deploying-to-amazon-s3/