我正在尝试创建一个只能在 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']
答案 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>
。使用同步命令复制丢失或过时的文件。
答案 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/