GitLab CI changes规则不生效:指定目录变更未触发流水线
问题分析与解决方案
核心问题1:changes规则不支持自定义变量
GitLab CI在解析rules:changes时,无法正确解析自定义变量(如$SUBDIR),因为该规则在流水线初始化阶段就会被评估,此时自定义变量的替换逻辑还未执行,导致路径匹配失效,流水线无法触发。
核心问题2:构建产物未被Git追踪(潜在情况)
如果./$SUBDIR/dist/下的文件是构建生成的临时产物,且未被提交到Git仓库,changes规则也无法检测到变更——因为该规则仅基于Git提交的文件差异进行判断。
解决方案
方案1:直接使用实际路径替换变量
将changes中的路径替换为$SUBDIR对应的实际值,让GitLab能直接匹配路径:
variables: SUBDIR: 'fasd/05_FASD_EX/interrupts/fasd' stages: - deploy-test deploy-test: stage: deploy-test image: name: amazon/aws-cli:latest entrypoint: - '/usr/bin/env' id_tokens: ID_TOKEN: aud: react_s3_jm script: - aws s3 sync ./$SUBDIR/dist s3://fpc-courses-test/$SUBDIR/dist --delete rules: - if: '$CI_COMMIT_REF_NAME == "test"' changes: - ./fasd/05_FASD_EX/interrupts/fasd/dist/**/* when: always
方案2:保留变量灵活性(动态路径场景)
如果必须使用变量,可通过在script中手动判断文件变更(此方式仍会触发流水线,仅跳过同步步骤):
variables: SUBDIR: 'fasd/05_FASD_EX/interrupts/fasd' stages: - deploy-test deploy-test: stage: deploy-test image: name: amazon/aws-cli:latest entrypoint: - '/usr/bin/env' id_tokens: ID_TOKEN: aud: react_s3_jm script: # 检查当前提交是否有dist目录下的文件变更 - if git diff --name-only HEAD~1 HEAD | grep -q "^$SUBDIR/dist/"; then aws s3 sync ./$SUBDIR/dist s3://fpc-courses-test/$SUBDIR/dist --delete; else echo "No changes in dist directory, skipping sync"; fi rules: - if: '$CI_COMMIT_REF_NAME == "test"' when: always
补充:确保dist文件被Git追踪(若适用)
如果dist目录是需要长期追踪的文件,可将其加入Git仓库(从.gitignore中移除相关规则),这样changes规则就能正常检测到变更。
内容的提问来源于stack exchange,提问作者Rooster242
相关产品推荐
相关产品推荐

