【问题标题】:AWS CodePipeline Action execution failedAWS CodePipeline 操作执行失败
【发布时间】:2019-06-25 08:42:42
【问题描述】:

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

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

这是我设置它们的方式:

代码管道

  • 动作名称:来源
  • 动作提供者:GitHub
  • 存储库:帐户/repo
  • 分支:master
  • GitHub 网络挂钩

代码部署

  • 计算类型:AWS Lambda
  • 服务角色:myRole
  • 部署设置:CodeDeployDefault.LambdaAllAtOnce

IAM 角色:myRole

  • AWS 服务
  • 选择将使用此角色的服务:Lambda / CodeDeploy
  • 选择您的用例:CodeDeploy
  • 策略:AWSCodeDeployRole

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

更新

感谢@Milan Cermak。我知道我需要这样做:

代码管道:

  • 第 1 阶段:来源:与 GitHub 存储库挂钩。这个工作正常。
  • 第 2 阶段:构建:使用 CodeBuild 仅使用 repo 根文件夹中的 buildspec.yml 文件获取所需文件夹。
  • 第 3 阶段:部署:使用
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 文件夹中的所有子文件夹。有什么建议吗?

【问题讨论】:

    标签: amazon-web-services github aws-code-deploy aws-codepipeline


    【解决方案1】:

    CodeBuild 使用 buildspec,但 CodeDeploy 使用 appspec。

    有没有appspec文件?

    【讨论】:

    • 谢谢@t_yamo 不,我忘了包括它。就我而言,它应该是什么样子?我在这里检查过:docs.aws.amazon.com/codedeploy/latest/userguide/… 但似乎即使我“部署”了构建文件夹,我也需要将文件放在 S3 存储桶中。我需要在某处指定它。
    【解决方案2】:

    您不应该使用 CodeDeploy,因为它是用于自动部署应用程序的服务,而应该使用 CodeBuild,它执行命令并准备部署工件以供在管道中进一步使用。

    这些命令位于buildspec.yml 文件中(通常位于 repo 的根目录中,但它是可配置的)。对于您的用例,它不会太复杂,因为您没有编译任何东西或运行测试等。

    试试这个作为起点:

    version: 0.2
    
    phases:
      build:
        commands:
          - ls
    
    artifacts:
      files:
        - public/*
    

    phases 部分是必需的,这就是包含它的原因(至少,感谢 ls 命令,您将看到 CodeBuild 环境中存在哪些文件),但它对您的情况并不感兴趣。有趣的是artifacts 部分。您可以在此处定义 CodeBuild 阶段的输出,即进一步传递到管道中下一步的内容。

    取决于您希望如何构建文件(例如,您是否希望在工件中也有 public 目录,或者您只想拥有文件本身,而不需要父目录),您可能想要使用artifacts 部分中可能的其他配置。详情请见buildspec reference

    记得使用 CodeBuild 步骤的输出工件作为 Deploy to S3 步骤的输入工件。

    【讨论】:

    • 也许我误解了你的答案,但看起来它是关于构建代码以供进一步使用。我的目标是将已经在 repo 中的 public 文件夹推送到 S3。
    • 是的,您正确理解了那部分。 CodeBuild 有点矫枉过正,但由于您只想将 public 目录推送到 S3,因此您必须将来自 Source 步骤(您的 git 存储库)的工件“重新打包”到 Deploy 步骤(S3 部署行动)。这就是 CodeBuild 在这里所做的; artifacts 部分定义了哪些文件进入构建步骤的输出工件。我错过了一件事情 - 作为管道的下一步,您应该拥有 S3 Deploy(如这里所建议的以及您的其他 SO 问题中所建议的那样)。
    • 谢谢。我明白你的建议。我想我正在接近它。仍然没有达到我的预期。我要更新我的问题。
    • 如果你想要一切,甚至深入public 的子目录,尝试在buildspec.yml 中使用public/**/*。如果有帮助,请告诉我。
    • 确实如此,我已经尝试过了。问题是它将子文件夹中的所有文件都扔到了 S3 存储桶的根目录中。这破坏了与资产、CSS 等的链接。我正在尝试保留 public 文件夹的树。
    【解决方案3】:

    【讨论】:

    • 我读过那个。它用于 Code Commit,而不是直接来自 GitHub。
    • @Viet S3 部署操作将适用于任何受支持的源操作(包括 GitHub)。
    • @TimB 谢谢。这样做会将我的 repo 中的所有内容部署到 s3,而不仅仅是我想要的文件夹,对吧?
    • 我认为不可能配置 S3 部署操作来部分部署工件(即选择一个文件夹)。听起来您需要一个构建步骤(至少从您要部署的文件夹中创建一个新工件 - 构建步骤也是执行 Typescript 编译、Webpack、Hugo/Jekyll 生成等其他事情的好地方)
    【解决方案4】:

    正如 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 文档中找到 AppSpec.yml 文件的示例 - https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-example.html#appspec-file-example-lambda

    【讨论】:

      猜你喜欢
      • 2019-07-04
      • 1970-01-01
      • 2019-04-07
      • 2016-09-05
      • 2021-09-21
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多