AWS CodeBuild buildspec.yml递归获取所有文件和子文件夹

时间:2019-02-01 17:04:57

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

我正在尝试使用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保留文件夹结构,但构建失败。
  • 以上所有语法的不同组合,但是我的构建失败了。

4 个答案:

答案 0 :(得分:17)

TL; DR 您可能不需要使用“ discard-paths:yes ”。因此,删除“ discard-paths:yes ”,然后将“ base-directory ”和“ ** / * ”一起用于全局模式。继续阅读以了解更多原因。

是的,是的,罪魁祸首很平常。在我的情况下,目录结构如下:

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

因此,为了使工件在保留嵌套目录结构的同时包含“ dist ”目录中的所有内容,buildspec必须看起来像这样:

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

本质上,“ 基本目录”参数的行为与unix的“ cd”命令相同,因此,首先CodeBuild会跳转到该目录,只有在解析了glob模式之后,在这种情况下,此标志- * * / * 。如果您还碰巧使用了“ discard-paths ”,那么发生的是,大概是CodeBuild将当前目录更改为“ dist ”,正确解析了文件结构但是,然后从解析的路径中删除所有路径前缀,因此结果将是没有嵌套的纯目录结构。

希望有帮助!

答案 1 :(得分:5)

我找到了解决它的方法。我认为这不是最好的方法,但是它可以工作。希望您可以找到有用的解决方案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:
    - '**/*'

换句话说:

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

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

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

  • 中托管静态网站。
  • 然后我得到想要的结果:publicS3 bucket内所有文件中带有正确的文件夹树。

  

更新:

  • 您还可以使用我的buildspec.yml示例文件here。由于该示例超出了此问题的范围,因此我不在此处粘贴代码。
  • 我会详细解释here

答案 2 :(得分:0)

我遇到了一个类似的问题,在语法下面的许多排列之后,对我来说很有效。

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

答案 3 :(得分:-1)

这对我有用。

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

在buildspec.yml

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