AWS使用CodePipeline中的CodeBuild在S3中删除文件

时间:2019-03-06 14:20:49

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

如何使用 CodeBuild 的{{1删除 S3存储桶中不需要的文件,作为 CodePipeline 中管道的输出}}文件?

例如:

将GitHub存储库的buildspec.yml文件夹放入指定的S3存储桶中,以便将该存储桶用作静态网站。

我较早地将文件推送到了我不再需要的存储桶中。在将管道的工件推送到存储桶之前,如何使用build文件“清理”存储桶?

示例buildspec.yml文件:

buildspec.yml

应该命令:

version: 0.2

phases:
  build:
    commands:
      - mkdir build-output
      - find . -type d -name public -exec cp -R {} build-output \;
      - find . -mindepth 1 -name build-output -prune -o -exec rm -rf {} +
  post_build:
    commands:
      - mv build-output/**/* ./
      - mv build-output/* ./
      - rm -R build-output
artifacts:
  files:
    - '**/*'

rm -rf * 阶段是这样的吗?

build

该如何引用正确的存储桶,而不是对文件中的名称进行硬编码?

1 个答案:

答案 0 :(得分:2)

要删除S3存储桶中的文件,可以使用已经暗示的aws s3 rm --recursive命令。

您可以通过在环境变量中进行设置来将存储桶名称从管道传递到CodeBuild。

ArtifactsBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: my-artifacts

CodeBuildProject:
  Type: AWS::CodeBuild::Project
  Properties:
    Environment:
      EnvironmentVariables:
          - Name: ARTIFACTS_BUCKET
            Value: !Ref ArtifactsBucket
            Type: PLAINTEXT

然后在buildspec中,您可以引用ARTIFACTS_BUCKET env var,例如:

build:
  commands:
    - aws s3 rm --recursive "s3://${ARTIFACTS_BUCKET}/" 

您可以采用的另一种方法是在存储桶上声明lifecycle management。例如,您可以说“ 30天后删除所有对象”,如下所示:

ArtifactsBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: my-artifacts
    LifecycleConfiguration:
      Rules:
        - ExpirationInDays: 30
          Id: Expire objects in 30 days
          Status: Enabled