GitLab 全局 post-接收在 CI 作业完成后未执行的所有存储库的服务器挂钩

GitLab global post-receive server hook for all repositories not executed after CI job completion

上下文

在设置 GitLab 服务器 GitLab 运行ner CI 并创建成功完成 CI 作业的测试存储库后,我在确保post-receive 脚本在 CI 成功完成测试存储库提交后完成。

MWE

MWE 进行完整的部署,并将存储库上传到 GitLab 服务器,运行存储库中的 CI。然而,它还没有很好地泛化,因此它(至少)有以下要求: System: Ubuntu 20.04, Architecture:AMD64.

git clone git@github.com:Deployment-Oneliners/Self-host-GitLab-Server-and-Runner-CI.git
cd Self-host-GitLab-Server-and-Runner-CI
git checkout post-receive
rm -r test/libs/*
chmod +x install-bats-libs.sh
./install-bats-libs.sh
./install_gitlab.sh -s -r
./test.sh
./test/libs/bats/bin/bats test/test_post_receive.bats

人们希望 post-receive 作业在 /home/<your ubuntu username>/Desktop/helloworld.txt 上创建一个文件。 (我认为它没有,因为 post-receive 脚本不是 运行。)

要完全卸载 MWE,可以 运行: ./uninstall_gitlab.sh -y -h -r.

问题

  1. 文档说

但是,对于使用的部署脚本,这是 /home/name/gitlab/data/gitlab-shell。因此,我假设 /home/name/gitlab/data/gitlab-shell/hooks 是默认的挂钩目录。

我通过创建一个 post-receive/post-receive 目录和脚本来测试这个假设,确保它们属于 gitlab-runner 用户,并且 运行 可用,并进行新的提交,这样CI 将再次完成。 post-receive 脚本未被 GitLab 执行。

接下来,我登录到 docker 并使用以下命令找到了实际的 gitlab-shell 文件夹:

sudo docker ps -a
docker exec -t -i 0f17db17c212 /bin/bash
cd /opt/gitlab/embedded/service/gitlab-shell/
mkdir hooks
cd hooks
mkdir post-receive.d
cd post-receive.d
echo '#!/bin/bash' | tee post-receive
echo 'touch server_example_output.txt' | tee -a tee post-receive
chmod +x post-receive

并验证 post-receive 脚本在与脚本相同的文件夹中创建了一个名为 example_output.txt 的文件(因为我无法从内部联系到 linux 用户docker)。我不知道如何让 gitlab-runner 拥有 post-receive,因为 chown 命令不起作用,因为它说找不到 gitlab-runner 用户。我认为这是因为 docker 中的根帐户实际上是 gitlab-runner 帐户。 docker里面的post-receive脚本内容是:

#!/bin/bash
touch server_example_output.txt

并使用以下方式手动验证:./post-receive 创建了 example_output.txt 文件。但是,运行在新的提交上 CI 并没有导致创建该输出文件。

此外,我尝试在 docker 中为特定存储库创建一个 post-receive 脚本。这是成功的,我了解到脚本是来自目录根目录的 运行,所以如果你写 touch output.txt 文件将不会在 /hooks/output.txt 中创建,而是在散列 <long hash code>.git/目录。

问题

如何确保在 GitLab 服务器中执行存储库提交后执行 GitLab post-receive 脚本? (GitLab 服务器中是否有一些 gui/button 允许测试 post-receive 脚本是否被 GitLab 找到并可执行)?

问题是我是双重的:

  1. 我在 linux 用户中创建了 post-receive 脚本,而不是在 docker.
  2. 我在错误的位置查找 post-receive 脚本的输出。我假设它会在脚本所在的同一目录中产生输出。但是 post-receive 脚本是从 .git 目录的根目录调用的,因此这是创建输出的地方。

最初我试图通过使用绝对路径来解决问题 2,但问题 1 暗示我选择的绝对路径实际上并不存在于 Docker 容器中。因此,没有创建任何输出(而且我在 Linux 设备上而不是在 Docker 容器中寻找该输出的错误位置)。

我找到的手动解决方案是: 首先获取 Docker 容器 ID:sudo docker ps -a,返回 ... ca3ba74eb832 ...。然后打开终端内的docker:

sudo docker exec -t -i ca3ba74eb832 /bin/bash
cd /opt/gitlab/embedded/service/gitlab-shell/
mkdir hooks
cd hooks
mkdir post-receive.d
cd post-receive.d
nano post-receive

然后输入:

#!/bin/bash
touch touch general_server_output.txt

并保存 post-receive 文件。然后使其可运行:

chmod +x post-receive

不需要让 post-receivegitlab-runner 用户所有,因为 Docker 容器内的 root 用户实际上就是那个用户,所以它已经被 gitlab-runner 拥有(即使在 Docker 容器内该用户被称为 root)。