在 GitLab CI/CD 中使用 Git 子模块
使用 Git submodules 将 Git 仓库作为另一个 Git 仓库的子目录。您可以将另一个仓库克隆到您的项目中,并将您的提交分开。
配置 .gitmodules
文件
当使用 Git 子模块时,您的项目应该有一个名为 .gitmodules
的文件。
您可能需要修改它才能在 GitLab CI/CD 作业中工作。
例如,您的 .gitmodules
配置可能如下所示:
- 您的项目位于
https://jihulab.com/secret-group/my-project
。 - 您的项目依赖于
https://jihulab.com/group/project
,您希望将其作为子模块包含在内。 - 您可以使用 SSH 地址查看源代码,例如
git@gitlab.com:secret-group/my-project.git
。
[submodule "project"]
path = project
url = ../../group/project.git
当您的子模块在同一个 GitLab 服务器上时,您应该在 .gitmodules
文件中使用相对 URL。然后,您可以在所有 CI/CD 作业中使用 HTTPS 进行克隆。您还可以将 SSH 用于所有本地检出。
上面的配置指示 Git 在克隆源时自动推导要使用的 URL。Git 对 HTTPS 和 SSH 使用相同的配置。 GitLab CI/CD 使用 HTTPS 来克隆您的源代码,您可以继续使用 SSH 在本地进行克隆。
对于不在同一 GitLab 服务器上的子模块,请使用完整 URL:
[submodule "project-x"]
path = project-x
url = https://gitserver.com/group/project-x.git
在 CI/CD 作业中使用 Git 子模块
要使子模块在 CI/CD 作业中正常工作:
- 确保对位于同一 GitLab 服务器中的子模块使用相对 URL。
-
您可以将
GIT_SUBMODULE_STRATEGY
变量设置为normal
或recursive
,告诉 runner 在作业之前获取您的子模块:variables: GIT_SUBMODULE_STRATEGY: recursive
-
您可以过滤或排除特定子模块,控制将使用
GIT_SUBMODULE_PATHS
同步哪些子模块。variables: GIT_SUBMODULE_PATHS: submoduleA submoduleB
-
您可以使用
GIT_SUBMODULE_UPDATE_FLAGS
提供额外的标志来控制高级检出。variables: GIT_SUBMODULE_STRATEGY: recursive GIT_SUBMODULE_UPDATE_FLAGS: --jobs 4
如果您使用 CI_JOB_TOKEN
克隆流水线作业中的子模块,则必须为执行作业的用户,分配有权在上游子模块项目中触发流水线的角色。
故障排查
无法找到 .gitmodules
文件
.gitmodules
文件可能很难找到,因为它通常是一个隐藏文件。
您可以查看特定操作系统的文档以了解如何查找和显示隐藏文件。
如果没有 .gitmodules
文件,则子模块设置可能位于 git config
文件中。