使用GitLab CI的Git子模块

注:

  • GitLab 8.12引入了一个新的CI作业权限模型如果你还没有升级你的GitLab实例,我们鼓励你升级。如果你是使用GitLab 8.12或更高版本,你需要绕过子模块才能访问例如:gitlab.com/group/project使用SSH密钥
  • 在GitLab 8.12之后,您的权限将用于评估CI作业可以访问的内容。有关此系统如何工作的更多信息,请参阅作业权限模型
  • HTTP(S) Git协议必须启用在你的GitLab实例中。

配置.gitmodules文件

如果处理Git子,您的项目可能会有一个名为.gitmodules

让我们考虑下面的例子:

  1. 您的项目位于https://gitlab.com/secret-group/my-project
  2. 要检出您的源,您通常使用SSH地址,如git@gitlab.com:秘密组织/ my-project.git
  3. 您的项目取决于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”)路径项目xurlhttps://gitserver.com/group/project-x.git

一次.gitmodules正确配置后,您可以继续到配置您的.gitlab-ci.yml

在CI作业中使用Git子模块

为了让子模块与CI作业正常工作,你需要采取以下几个步骤:

  1. 首先,确保你用过相对url用于位于同一GitLab服务器中的子模块。
  2. 接下来,如果你正在使用gitlab-runnerV1.10 +,您可以设置GIT_SUBMODULE_STRATEGY变量为任意一个正常的递归告诉运行器在作业之前获取子模块:

    变量GIT_SUBMODULE_STRATEGY递归

    看到.gitlab-ci.yml参考如欲了解更多有关GIT_SUBMODULE_STRATEGY

  3. 的旧版本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。

Baidu
map