如何通过GitLab CI仅在Git子模块变更时编译第三方库?
问题解决:GitLab CI 仅在主仓库子模块HEAD变更时触发编译任务
针对你的需求,当前配置未生效的核心原因是:extern/**/* 匹配的是子模块内部的文件,但GitLab CI默认评估rules时仅拉取主仓库内容,不会拉取子模块,且主仓库中子模块的HEAD变更本质是主仓库内记录的子模块commit ID发生变化,对应git中的extern特殊条目,而非子模块内部文件。
修改后的.gitlab-ci.yml配置如下:
stages: - extern - package extern: stage: extern variables: GIT_SUBMODULE_STRATEGY: recursive script: - cd extern - cmake -B build -S . -A x64 - cmake --build build --config Release --target install rules: - changes: - extern - .gitmodules package: stage: package variables: GIT_SUBMODULE_STRATEGY: none script: - echo "building..."
配置说明
changes: - extern:主仓库中子模块的HEAD变更时,主仓库会记录子模块的新commit ID,这对应git中extern这个特殊条目(存储子模块commit哈希)的变更,该规则会准确捕获此场景。changes: - .gitmodules:若子模块的配置(如路径、远程仓库地址)发生修改,.gitmodules文件会变更,此时也需要重新编译第三方库,因此加入该路径。- 适配GitLab CE 14.6.1版本:该版本的
changes规则默认仅检测主仓库的文件/条目变更,无需拉取子模块即可识别上述两个路径的变化,完全符合你的需求。
内容的提问来源于stack exchange,提问作者yuziqi
相关产品推荐
相关产品推荐

