在本地运行 gitlab-runner 时如何使用子模块?

use*_*447 5 gitlab-ci-runner

在我们的 Gitlab 服务器上,我有两个存储库,其中一个存储库(“EPSILON-SDK-C”)是另一个存储库的子模块。当我在我的开发机器上本地运行 gitlab-runner 时

 sudo gitlab-runner exec docker build_fw
Run Code Online (Sandbox Code Playgroud)

gitlab-runner 找不到子模块,如 gitlab-runner 的输出所示:

Updating/initializing submodules...
Submodule 'thirdparty/EPSILON-SDK-C' (/home/me/gitlab_repos/EPSILON-SDK-C) registered for path 'thirdparty/EPSILON-SDK-C'
fatal: repository '/home/me/gitlab_repos/EPSILON-SDK-C' does not exist
fatal: clone of '/home/me/gitlab_repos/EPSILON-SDK-C' into submodule path '/builds/0/project-0/thirdparty/EPSILON-SDK-C' failed
Failed to clone 'thirdparty/EPSILON-SDK-C'. Retry scheduled
fatal: repository '/home/me/gitlab_repos/EPSILON-SDK-C' does not exist
fatal: clone of '/home/me/gitlab_repos/EPSILON-SDK-C' into submodule path '/builds/0/project-0/thirdparty/EPSILON-SDK-C' failed
Failed to clone 'thirdparty/EPSILON-SDK-C' a second time, aborting
ERROR: Job failed: exit code 1
FATAL: exit code 1
Run Code Online (Sandbox Code Playgroud)

然而,当我们的 Gitlab 服务器被提交触发时,Gitlab 成功使用子模块构建了一个二进制文件,如 Gitlab 管道输出所示(为了清晰起见,删除了 4-5 行):

Updating/initializing submodules...
Synchronizing submodule url for 'thirdparty/EPSILON-SDK-C'
Entering 'thirdparty/EPSILON-SDK-C'
   (4-5 lines here removed for readabilty)
Authenticating with credentials from job payload (GitLab Registry)
Run Code Online (Sandbox Code Playgroud)

问题:Gitlab 定位子模块没有问题,那么为什么本地的 gitlab-runner 找不到子模块呢?

我的 .gitlab-ci.yml 看起来像这样:

image: "gitlab.company.local:4567/me/dockerforfw:latest"

stages:
  - build

build_fw:
  stage: build

  variables:
    GIT_SUBMODULE_STRATEGY: normal

  script:
    - "bash bin/dorelease_linux.sh"
Run Code Online (Sandbox Code Playgroud)

我的 .gitmodules 看起来像这样:

$ cat .gitmodules
[submodule "thirdparty/EPSILON-SDK-C"]
    path = thirdparty/EPSILON-SDK-C
    url = ../EPSILON-SDK-C
Run Code Online (Sandbox Code Playgroud)

请注意,子模块 URL 是相对的,根据 Gitlab 文档的要求:https://docs.gitlab.com/ee/ci/git_submodules.html#configuring-the-gitmodules-file

我确实有权访问子模块存储库,所以我不认为这个问题与权限有关:

$ git submodule sync
Synchronizing submodule url for 'thirdparty/EPSILON-SDK-C'
Run Code Online (Sandbox Code Playgroud)

我本地的 gitlab-runner 版本是 12.3.0 (a8a019e0),我们的 Gitlab 服务器版本是 GitLab Enterprise Edition 12.3.4-ee。

我尝试过的事情:

我尝试过使用子模块的绝对 URL。我还尝试在 /home/me/gitlab_repos/ 中保留子模块存储库的本地克隆 我还尝试添加这些 before_script 操作:

before_script:
  - git submodule sync --recursive
  - git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

(更新:为了清楚起见,我编辑了我的问题)

Jam*_*mes 3

我想我对此有一些见解,因为我现在正在遇到这个问题。

在 gitlab 上我有:

group1/proj1
group1/proj2
Run Code Online (Sandbox Code Playgroud)

与此.gitsubmodulesproj1

[submodule "proj2"]
    path = proj2
    url = ../proj2.git
Run Code Online (Sandbox Code Playgroud)

我尝试跑步

> C:\code\proj1>gitlabrunner.exe  exec shell build_proj1 --shell powershell
Run Code Online (Sandbox Code Playgroud)

但得到了

fatal: clone of 'c:\code/proj2.git' into submodule path 'C:/code/proj1/builds/0/project-0/proj2' failed
Failed to clone 'proj2'. Retry scheduled
Cloning into 'C:/code/proj1/builds/0/project-0/proj2'...
fatal: 'c:\code/proj2.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Run Code Online (Sandbox Code Playgroud)

我意识到:
1.我没有proj2 本地克隆
2.有一个尾随.git

所以我确保该存储库实际上存在于本地

> cd c:\code
> git clone git@gitlab...com:group1/proj2.git
> cd proj2
> pwd
C:\code\proj2
Run Code Online (Sandbox Code Playgroud)

删除'.git' 后缀.gitsubmodules

[submodule "proj2"]
    path = proj2
    url = ../proj2
Run Code Online (Sandbox Code Playgroud)

瞧,现在> C:\code\proj1>gitlabrunner.exe exec shell build_proj1 --shell powershell能够正确找到..\proj2

版本

> c:\code\proj1>C:\gitlab\gitlab-runner-windows-amd64.exe -v
Version:      12.6.0
Git revision: ac8e767a
Git branch:   12-6-stable
GO version:   go1.13.4
Built:        2019-12-22T11:55:34+0000
OS/Arch:      windows/amd64
Run Code Online (Sandbox Code Playgroud)