管道 CI/CD 仅对更改的文件执行操作
Pipeline CI/CD actions only on changed files
我正在尝试创建一个 gitlab ci/cd pipeline
能够仅在 Amazon S3 上上传编辑过的文件。这是可能的事情吗?如果是,我如何编辑我当前的 .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']
您可以在脚本下使用aws s3 sync site/ s3://<bucket_name>
。使用 sync 命令复制丢失或过时的文件。
是的,AWS Sync 命令将帮助您完成任务。
使用下面的命令,而不是你的 aws cp 命令:
aws s3 sync . s3://$S3_BUCKET/ --exclude ".git/*" --exclude ".gitlab-ci.yml" --exclude ".gitignore"
它将递归地将新文件和更新文件从源目录复制到目标目录。此外,如果文件夹包含一个或多个文件,它只会在目标中创建文件夹。
我遇到了这个问题,建议的解决方案不起作用。
s3 同步通过 2 个标准比较源和目标:
- 修改日期
- 尺寸
当您 运行 CICD 中的作业时,它会在后台“git 拉取”您的修订并更新所有文件的修改日期,因此 - 它正在上传每次你 运行 它的所有文件。
您可以使用“--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/
我正在尝试创建一个 gitlab ci/cd pipeline
能够仅在 Amazon S3 上上传编辑过的文件。这是可能的事情吗?如果是,我如何编辑我当前的 .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']
您可以在脚本下使用aws s3 sync site/ s3://<bucket_name>
。使用 sync 命令复制丢失或过时的文件。
是的,AWS Sync 命令将帮助您完成任务。
使用下面的命令,而不是你的 aws cp 命令:
aws s3 sync . s3://$S3_BUCKET/ --exclude ".git/*" --exclude ".gitlab-ci.yml" --exclude ".gitignore"
它将递归地将新文件和更新文件从源目录复制到目标目录。此外,如果文件夹包含一个或多个文件,它只会在目标中创建文件夹。
我遇到了这个问题,建议的解决方案不起作用。 s3 同步通过 2 个标准比较源和目标:
- 修改日期
- 尺寸
当您 运行 CICD 中的作业时,它会在后台“git 拉取”您的修订并更新所有文件的修改日期,因此 - 它正在上传每次你 运行 它的所有文件。 您可以使用“--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/