AWS CodePipeline 操作执行失败

AWS CodePipeline Action execution failed

我正在尝试将我的 GitHub 存储库与 S3 挂钩,因此每次提交时,AWS CodePipeline 都会将 ./<path>/public 文件夹部署到指定的 S3 bucket.

到目前为止,在我的管道中,Source 工作(连接到 GitHub 并获取新提交)但 Deploy 失败,因为:Action execution failed BundleType must be either YAML or JSON.

我是这样设置的:

代码流水线

代码部署

IAM 角色:我的角色

我知道根文件夹中必须有一个 buildspec.yml 文件。我试过使用一些我能找到的文件,但它们似乎不起作用。我做错了什么或者我应该如何编辑 buildspec 文件来做我想做的事?

Update

感谢@Milan Cermak。我明白我需要做的:

代码流水线:

Action Provider: S3
Input Artifacts: OutputArtifacts (result of stage 2).
Bucket: the bucket that hosts the static website.

CodePipeline 有效。但是,输出仅包含文件 (.html),而不包含嵌套在 public 文件夹中的文件夹。

我检查了 this 并想出了如何使用 discard-paths: yes 删除嵌套文件夹的路径,但我无法获取 ./<path>/public 文件夹中的所有子文件夹.有什么建议吗?

CodeBuild 使用 buildspec,但 CodeDeploy 使用 appspec。

有appspec文件吗?

您不应使用 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 步骤的输入构件。

CodePipeline 最近宣布部署到 S3 操作:https://aws.amazon.com/about-aws/whats-new/2019/01/aws-codepipeline-now-supports-deploying-to-amazon-s3/

正如 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

您可以在此处从亚马逊文档中找到 AppSpec.yml 文件的示例 - https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-example.html#appspec-file-example-lambda