在 git-server 中找不到自定义挂钩的项目存储库

Posted

技术标签:

【中文标题】在 git-server 中找不到自定义挂钩的项目存储库【英文标题】:Can't find project repository in git-server for custom-hooks 【发布时间】:2020-07-31 17:08:01 【问题描述】:

我使用 docker-compose 运行本地 gitlab 服务器。

git:
    container_name: git-server
    image: gitlab/gitlab-ce:latest
    hostname: 'gitlab.example.com'
    ports:
      - '8090:80'
      - '22:22'
    volumes:
      - "$PWD/srv/gitlab/config:/etc/gitlab"
      - "$PWD/srv/gitlab/logs:/var/log/gitlab"
      - "$PWD/srv/gitlab/data:/var/opt/gitlab"
    networks:
      - net

我想为我在 gitlab webUI 中创建的项目 repo 设置自定义钩子,以便它触发 jenkins 作业。根据 gitlab 文档,这是综合安装中 repos 的路径,我必须在其中创建自定义钩子目录

/var/opt/gitlab/git-data/repositories/<group>/<project>.git

但是在 /var/opt/gitlab/git-data/repositories 里面,我根本看不到组目录或项目目录

root@gitlab:~# ls -lt /var/opt/gitlab/git-data/repositories
total 0
drwxr-s---. 3 git root 16 Apr 18 04:05 @hashed
drwxr-sr-x. 3 git root 17 Apr 18 04:00 +gitaly
root@gitlab:~#

我尝试使用 find 进行搜索。但它什么也没返回。我尝试在我的项目 repo 中按文件名搜索,但也没有返回任何内容。

在 gitlab webUI 中,我可以看到这一切。但是在服务器中,文件和目录都不存在。

当我 ssh 到 gitlab-server 时,我无法在我的存储库中找到任何文件,这是怎么回事?

由于我无法走这条路,我尝试在全局挂钩目录 /opt/gitlab/embedded/service/gitlab-shell/hooks 下创建一个 post-receive.d 目录,然后添加我的 post-receive文件如下

#!/bin/bash


# Get branch name from ref head

if ! [ -t 0 ]; then
  read -a ref
fi
IFS='/' read -ra REF <<< "$ref[2]"
branch="$REF[2]"

if [ "$branch" == "master" ]; then
crumb=$(curl -u "jenkins:1234" -s 'http://jenkins:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
curl -u "jenkins:1234" -H "$crumb" -X POST http://jenkins:8080/job/maven/build?delay=0sec

  if [ $? -eq 0 ] ; then
    echo "*** Ok"
  else
    echo "*** Error"
  fi

jenkins 是与 gitlab 服务器在同一网络中的容器名称。

gitlab docs 说,然后我必须将文件的权限更改为 git,然后使其可执行。我这样做了。但它也没有奏效。此外,我发现所有 git 目录都归我容器中的 root 所有。

推送代码后,我发现我放在 /opt/gitlab/embedded/service/gitlab-shell/hooks/post-receive.d 目录中的钩子不起作用,并且在日志中,我在之后看到以下错误我将代码更改推送到我的 Maven 存储库

==> /var/log/gitlab/nginx/gitlab_error.log <==
2020/04/18 04:57:31 [crit] 832#0: *256 connect() to unix:/var/opt/gitlab/gitlab-workhorse/socket failed (13: Permission denied) while connecting to upstream, client: <my_public_ip>, server: gitlab.example.com, request: "GET /jenkins/maven.git/info/refs?service=git-receive-pack HTTP/1.1", upstream: "http://unix:/var/opt/gitlab/gitlab-workhorse/socket:/jenkins/maven.git/info/refs?service=git-receive-pack", host: "gitlab.example.com:8090"

在这里,gitlab.example.com 映射到我正在运行 docker 的主机的 /etc/hosts 文件中的公共 ip。

【问题讨论】:

【参考方案1】:

如果您在容器内运行以下命令,您应该会看到您的组存储库

gitlab-rake gitlab:storage:rollback_to_legacy

【讨论】:

【参考方案2】:

在 /var/opt/gitlab/git-data/repositories 里面,我根本看不到组目录或项目目录

文档“Install GitLab using docker-compose”包括以下卷:

  volumes:
    - '$GITLAB_HOME/gitlab/config:/etc/gitlab'
    - '$GITLAB_HOME/gitlab/logs:/var/log/gitlab'
    - '$GITLAB_HOME/gitlab/data:/var/opt/gitlab'

这意味着如果您在 $GITLAB_HOME/gitlab/data/git-data/repositories 中看到本地一些 repos,您应该在 /var/opt/gitlab/git-data/repositories/ 中看到相同的内容。

当然,假设您已经在 GitLab 实例中创建了至少一个项目/存储库。

【讨论】:

我在本地目录中也没有看到。但是在 gitab webUI 中,它就在那里。我可以看到我在项目仓库中创建的组、项目和文件。在通过 webUI 创建空项目目录后,我对空项目目录进行了 git 克隆。然后推送文件,同样反映在 gitlab webUI 中 - 组、项目 repo 和文件。但是当我登录到gitlab服务器并搜索它们时,我找不到它们。 @BeingGokul 你如何通过 Docker-compose 启动你的 GItLab?您是否定义了任何音量? 是的,我愿意。已编辑问题以包括 docker-compose。我担心的是,在 gitlab webUI 中,我看到了我创建的 jenkins 组,在其中,我创建了 maven 项目。然后将其克隆到本地并推送文件。这同样反映在 webUI 中。但是当我登录到 gitlab 服务器并搜索它以便我可以添加自定义钩子目录并定义钩子时,没有。不是组名“jenkins”或项目名“maven.git”的目录 假设我根本没有定义卷。我的问题是,我应该在 gitlab 服务器容器中找到项目目录和文件,对吗?因为当我登录webUI时它就在那里。所以,它应该存储在容器内的某个地方。根据 gitlab 文档,/var/opt/gitlab/git-data/repositories//.git 是路径。但我没有看到任何东西。 我认为你仍然误会我的意思。我不在乎我是否能够在本地看到它。我唯一的问题是,我有一个名为 git-server 的 docker 容器正在运行,并且从 webUI 中,我创建了组(jenkins)和项目(maven)。现在,我使用命令“docker exec -it git-server bash”进入我的容器。现在,根据 gitlab 文档,组和项目详细信息将位于路径 /var/opt/gitlab/git-data/repositories//.git 下。但是没有。

以上是关于在 git-server 中找不到自定义挂钩的项目存储库的主要内容,如果未能解决你的问题,请参考以下文章

在Visual Studio Designer中找不到自定义字体的C#文件

在 Vuejs 项目中找不到导出的组件

Drupal 8 自定义模块“找不到主题挂钩”

量角器:by.model 在自定义指令中找不到元素

Delphi DLL Project在自定义BPL中找不到单元,除非“Link with Runtime Packages”为True

ASDF 在自定义目录中找不到包