使用GitLab CI的Git子模块
注:
.gitmodules
文件
配置如果处理Git子,您的项目可能会有一个名为.gitmodules
。
让我们考虑下面的例子:
- 您的项目位于
https://gitlab.com/secret-group/my-project
。 - 要检出您的源,您通常使用SSH地址,如
git@gitlab.com:秘密组织/ my-project.git
。 - 您的项目取决于
https://gitlab.com/group/project
,您希望将其作为子模块包含。
如果您正在使用GitLab 8.12+,并且您的子模块位于同一台GitLab服务器上,则必须更新您的.gitmodules
要使用的文件相对url。因为Git允许使用相对url.gitmodules
通过配置,您可以轻松地使用HTTP(S)克隆所有CI作业,并使用SSH克隆所有本地签出。的.gitmodules
看起来像:
(子模块“项目”)路径=项目url=. . / . . /组/ project.git
上面的配置将指示Git在克隆源代码时自动推导出应该使用的URL。无论您使用HTTP(S)还是SSH, Git都将使用相同的通道,并且它将允许您的所有CI作业使用HTTP(S)(因为GitLab CI只使用HTTP(S)来克隆您的源代码),并且所有本地克隆都将继续使用SSH。
对于不在同一GitLab服务器上的所有其他子模块,使用完整的HTTP(S)协议URL:
(子模块”项目x”)路径=项目xurl=https://gitserver.com/group/project-x.git
一次.gitmodules
正确配置后,您可以继续到配置您的.gitlab-ci.yml
。
在CI作业中使用Git子模块
为了让子模块与CI作业正常工作,你需要采取以下几个步骤:
- 首先,确保你用过相对url用于位于同一GitLab服务器中的子模块。
接下来,如果你正在使用
gitlab-runner
V1.10 +,您可以设置GIT_SUBMODULE_STRATEGY
变量为任意一个正常的
或递归
告诉运行器在作业之前获取子模块:变量:GIT_SUBMODULE_STRATEGY:递归
看到
.gitlab-ci.yml
参考如欲了解更多有关GIT_SUBMODULE_STRATEGY
。的旧版本
gitlab-runner
,然后使用Git子模块同步/更新
在before_script
:before_script:-Git子模块sync——递归-Git子模块update——init——递归
——递归
应用于both或none (同步/更新
)取决于你是否有递归子模块。
设置的基本原理同步
而且更新
在before_script
是因为Git子模块的工作方式。在一个新的Runner工作空间上,Git将设置子模块URL,其中包括令牌. /配置
(或. /模块/ <子模块> / config
)基于.gitmodules
和当前远程URL。在同一个Runner上的后续作业中,. /配置
是缓存的,并且已经包含子模块的完整URL,对应于前一个作业,而来自前一个作业的令牌。同步
允许强制更新完整的URL。