如何修改.gitlab-ci.yml实现GitLab CI/CD仅上传变更文件到AWS S3
实现方案
可行性说明
该需求完全可实现,核心逻辑是在CI任务运行时对比当前提交和上一次部署提交的文件差异,仅对变更文件执行S3上传/删除操作,不需要全量同步整站内容。
配置修改示例
修改后的.gitlab-ci.yml如下:
stages: - deploy-s3-bucket deploy_s3_bucket: stage: deploy-s3-bucket image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest variables: # 拉取完整提交历史,保证差异对比逻辑正常运行 GIT_DEPTH: 0 script: - aws configure set region us-east-2 # 筛选两次提交间的变更文件,同时过滤不需要上传的规则文件 - CHANGED_FILES=$(git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA | grep -vE '^\.git/|^\.gitlab-ci.yml$|^\.gitignore$' || true) # 无变更文件直接终止任务 - if [ -z "$CHANGED_FILES" ]; then echo "无变更文件,跳过上传"; exit 0; fi # 遍历变更文件列表执行对应操作 - for FILE in $CHANGED_FILES; do if [ -f "$FILE" ]; then # 本地存在的文件执行上传 aws s3 cp "$FILE" "s3://$S3_BUCKET/$FILE"; else # 本地不存在的文件说明已被删除,同步删除S3对应文件 aws s3 rm "s3://$S3_BUCKET/$FILE"; fi done only: ['master']
注意事项
- 首次运行该管道时,
CI_COMMIT_BEFORE_SHA为全0空值,会触发全量文件上传,属于正常初始化逻辑,后续管道运行会自动执行增量同步。 - 若单次提交变更文件数量较多,可替换遍历逻辑为批量上传,性能更高:
# 导出变更文件列表 - echo "$CHANGED_FILES" > changed_files.txt # 批量上传变更文件 - aws s3 cp . s3://$S3_BUCKET/ --recursive --exclude "*" --include-from changed_files.txt # 单独处理已删除的文件 - for FILE in $CHANGED_FILES; do if [ ! -f "$FILE" ]; then aws s3 rm "s3://$S3_BUCKET/$FILE"; fi; done
内容的提问来源于stack exchange,提问作者th3g3ntl3man
相关产品推荐
相关产品推荐

