【问题标题】:AWS CodeBuild buildspec.yml get all files and subfolders recursivelyAWS CodeBuild buildspec.yml 以递归方式获取所有文件和子文件夹
【发布时间】:2019-06-26 07:09:11
【问题描述】:

我正在尝试使用 AWS CodeBuild 获取嵌套 public 文件夹中的所有文件和子文件夹,并使用 CodePipeline 部署到 S3 存储桶。我能够将它们全部连接在一起,但很难配置 buildspec.yml 文件以获得我想要的输出。

我的文件夹结构:

<path>/public/

├── 404.html
├── css
│   ├── ...
├── fonts
│   ├── bootstrap
│   │   ├── ...
│   ├── icomoon
│   │   ├── icomoon
│   │   │   ├── ...
│   └── simple-line-icons
│       ├── ...
├── images
│   ├── ...
├── index.html
├── index.xml
├── js
│   ├── ...
└── tags
    └── index.xml

我需要将 public 文件夹中的所有内容(包括子文件夹)放入 S3 存储桶的根目录中。

到目前为止,我已尝试关注文档 hereherehere。我试过使用:

  • **/* 以递归方式获取文件夹 public 中的所有内容,但 S3 存储桶将具有文件夹的路径,因此 index.html 不在根目录中。
  • discard-paths: yes 删除 public 文件夹的路径,但在 S3 存储桶中,所有文件都在根目录中,不保留子文件夹结构。
  • base-directory:如here所述。
  • artifacts: secondary-artifacts: artifact1: files: - directory/file artifact2: files: - directory/file2 保留文件夹结构,但我的构建失败。
  • 以上所有语法的不同组合,但我的构建失败了。

【问题讨论】:

  • 你也需要files 紧跟在artifacts 之后,不管次要工件是什么,否则它总是会失败

标签: amazon-web-services amazon-s3 aws-codebuild


【解决方案1】:

我想出了一个解决方法。我认为这不是最好的方法,但它确实有效。我希望你能发现这个解决方案有用buildspec.yml:

version: 0.2

phases:
  build:
    commands:
      - mkdir build-output
      - cp -R <path>/public/ build-output
  post_build:
    commands:
      - mv build-output/**/* ./
      - mv build-output/* ./
      - rm -R build-output *.yml LICENSE README* .git*
artifacts:
  files:
    - '**/*'

一句话:

  • 我将嵌套的 &lt;path&gt;/public 文件夹中的所有内容复制到名为 ./build-output 的文件夹中。

  • 然后在post_build 中,我将所有内容移出文件夹build-output

  • 删除从我的 GitHub 存储库中提取的文件,这些文件不需要在 S3 bucket 中托管静态网站

  • 然后我得到我想要的结果:public 中的所有文件都位于 S3 bucket 的根目录中,并带有正确的文件夹树。

更新:

  • 您也可以使用我的buildspec.yml 示例文件here。由于示例超出了本题的范围,这里就不贴代码了。
  • 我详细解释here

【讨论】:

  • 关于符号链接的评论:我尝试使用这种方法,但是我的文件有符号链接,并且 codebuild 在压缩文件时会丢失它们。 forums.aws.amazon.com/thread.jspa?threadID=245780 在我的解决方案中,不幸的是,我不得不自己创建一个 tarball。
  • 这个答案似乎很有希望,但是当我检查我的 S3 时,我仍然收到了所有文件而不是特定的构建目录。你知道怎么回事吗?
【解决方案2】:

我遇到了类似的问题,经过以下语法的许多排列对我有用。

artifacts:
  files:
    - './**/*'
  base-directory: public
  name: websitename

【讨论】:

    【解决方案3】:

    这对我有用。

        /
        buildspec.yml
        /public
            index.html
            /js
            /img
            appspec.yml
        /src
    

    在 buildspec.yml 中

        artifacts:
        files:
          - 'public/*'
        discard-paths: yes
    

    【讨论】:

      【解决方案4】:

      TL;DR您可能不需要需要使用“discard-paths: yes”。因此,删除 "discard-paths: yes" 并使用 "base-directory" 和 "**/*" 作为 glob 模式。继续阅读以了解更多原因。

      所以是的,就像通常发生的那样,罪魁祸首是微不足道的。就我而言,目录结构如下所示:

      dist/
      |-- favicon.ico
      |-- index.html
      |-- js
      |   `-- app.js
      `-- revision.txt
      

      因此,为了让工件包含“dist”目录中的所有内容,同时保留嵌套目录结构,构建规范必须如下所示:

      artifacts:
        files:
          - '**/*'
        base-directory: 'dist'
      

      本质上,“base-directory”参数的行为类似于 unix 的“cd”命令,因此首先 CodeBuild 跳转到该目录,然后才解析 glob 模式,在这种情况下 - * */*。如果您也碰巧使用了“discard-paths”,那么会发生什么,大概 CodeBuild 会将当前目录更改为“dist”,正确解析文件结构但是然后从解析的路径中删除所有路径前缀,因此结果将是一个没有嵌套的普通目录结构。

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 2021-10-19
        • 2013-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多