仅对更改的文件进行流水线 CI/CD 操作

时间:2021-05-06 12:44:13

标签: amazon-s3 gitlab-ci pipeline

我正在尝试创建一个只能在 Amazon S3 上上传编辑过的文件的 gitlab ci/cd pipeline。这是可能的事情吗?如果是,我如何编辑当前的 .gitlab-ci.yml,以便仅将更改的文件上传到 ASW S3

stages:
- deploy-s3-bucket

deploy_s3_bucket:
  stage: deploy-s3-bucket
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - aws configure set region us-east-2
    - aws s3 cp . s3://$S3_BUCKET/ --recursive --exclude ".git/*" --exclude ".gitlab-ci.yml" --exclude ".gitignore"
  only: ['master']

3 个答案:

答案 0 :(得分:1)

是的,AWS Sync 命令将帮助您完成任务。

使用下面的命令,而不是你的 aws cp 命令:

<块引用>

aws s3 同步。 s3://$S3_BUCKET/ --exclude ".git/*" --exclude ".gitlab-ci.yml" --exclude ".gitignore"

它将递归地将新的和更新的文件从源目录复制到目标。此外,如果文件夹包含一个或多个文件,它只会在目标中创建文件夹。

答案 1 :(得分:0)

您可以在脚本下使用 aws s3 sync site/ s3://<bucket_name>。使用同步命令复制丢失或过时的文件。

在此处查看更多信息:https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-sync

答案 2 :(得分:0)

我遇到了这个问题,建议的解决方案不起作用。 s3 同步通过 2 个条件比较源和目标:

  • 修改日期
  • 尺寸

当您在 CICD 中运行该作业时,它会在后台执行“git pull”并包含您的修订版本并更新所有文件的修改日期,因此 - 每次运行时它都会上传所有文件。 使用“--size-only”标志可以省略对修改日期的检查,但在修改文件大小不变的情况下不起作用。

我通过创建一个帮助脚本来解决它,该脚本使用以下命令来获取更新文件的列表:

git diff --name-only HEAD HEAD~1

我的脚本如下所示:

#!/bin/bash
set -ex

FILES=()
for i in $( git diff --name-only HEAD HEAD~1 | grep cloudformation | grep ".json" | sed 's#aws-tools/cloudformation/##g'); do # CHANGEIT
    FILES+=( "$i" )
done
echo "${FILES[@]}"

CMDS=()
for i in "${FILES[@]}"; do
    CMDS+=("--include=$i""*")
done
echo "${CMDS[@]}"

echo "${CMDS[@]}" | xargs aws s3 sync aws-tools/cloudformation/ s3://bucket-name/ --delete --exclude "*" # CHANGEIT

您需要更改包含“CHANGEIT”的行。就我而言,它将文件夹 aws-tools/cloudformation/ 同步到 s3://bucket-name/,因此存储桶内不应该有任何“aws-tools/cloudformation”文件夹。另外,我只上传 .json 文件。

我的灵感来自: https://www.lambrospetrou.com/articles/aws-s3-sync-git-status/