You need to enable JavaScript to run this app. 如何修改.gitlab-ci.yml实现GitLab CI/CD仅上传变更文件到AWS S3
优惠活动
大模型
产品
解决方案
定价
更多

如何修改.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 00:15:04