如何配置GitLab CI/CD合入main分支时自动识别变更目录部署
配置步骤
你只需要修改项目根目录下的.gitlab-ci.yml文件,按以下规则调整即可:
第一步:配置流水线自动触发规则
新增workflow块,指定仅当main分支收到推送(MR合入后会自动触发main分支的推送事件)时启动流水线:workflow: rules: # MR合入main分支时自动触发 - if: $CI_COMMIT_BRANCH == "main" when: always # 可保留原有手动触发规则,不需要就删掉 - if: $CI_PIPELINE_SOURCE == "web" when: always - when: never第二步:按目录配置部署作业的变更触发规则
利用GitLab CI内置的changes关键字,给每个目录对应的部署作业设置触发条件,同时自动注入对应目录变量,不需要用户手动输入:# 部署folder-a的作业 deploy_folder_a: variables: TARGET_DIR: "folder-a" script: - cd $TARGET_DIR # 替换为你实际的部署命令 - python python-a.py rules: - changes: # 只要folder-a目录下有任意文件变更,就触发该作业 - folder-a/**/* # 部署folder-b的作业 deploy_folder_b: variables: TARGET_DIR: "folder-b" script: - cd $TARGET_DIR # 替换为你实际的部署命令 - python python-b.py rules: - changes: # 只要folder-b目录下有任意文件变更,就触发该作业 - folder-b/**/*可选:动态适配新增目录的通用方案
如果后续会新增大量业务目录,不想每个目录单独写作业,可以用动态识别变更目录的方式统一处理:stages: - detect - deploy # 第一步识别所有变更的一级目录 detect_changed_dirs: stage: detect script: # 对比本次提交和上一次提交的差异,提取变更的一级目录,过滤非业务目录后写入变量文件 - CHANGED_DIRS=$(git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA | cut -d'/' -f1 | uniq | grep -E '^folder-' | tr '\n' ' ') - echo "CHANGED_DIRS=$CHANGED_DIRS" >> deploy.env artifacts: reports: dotenv: deploy.env # 第二步批量部署所有变更目录的代码 batch_deploy: stage: deploy script: - for dir in $CHANGED_DIRS; do cd $dir; # 替换为你实际的部署命令,所有目录的部署逻辑一致就可以用这种方式 python ./${dir#folder-}.py; cd ..; done
如果多个目录同时有变更,上述两种方案都会自动触发所有对应目录的部署,不需要额外人工操作。
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

