我在尝试使用 gitlab ci/cd 部署脚本时遇到这个问题:
Initialized empty Git repository in C:/builds/Tri.BuiV/test-gitlab-cicd/.git/
fatal: detected dubious ownership in repository at 'C:/builds/Tri.BuiV/test-gitlab-cicd'
'C:/builds/Tri.BuiV/test-gitlab-cicd' is owned by:
'S-1-5-83-1-1989435290-1148643240-1709935003-3943614564'
but the current user is:
'S-1-5-93-2-1'
To add an exception for this directory, call:
git config --global --add safe.directory C:/builds/Tri.BuiV/test-gitlab-cicd
我尝试过:
git config --global --add safe.directory C:/builds/Tri.BuiV/test-gitlab-cicd
但是同样的错误,为什么?
我尝试过:
git config --global --add safe.directory C:/builds/Tri.BuiV/test-gitlab-cicd
但遇到同样的问题。
GitLab 论坛这里发布了一个很好的解决方法。就是将以下git相关的环境变量添加到受影响的runner的config.toml中:
[[runners]]
environment = ["GIT_CONFIG_COUNT=1", "GIT_CONFIG_KEY_0=safe.directory", "GIT_CONFIG_VALUE_0=*"]
这对我有用。
如果错误仍然存在,则可能意味着您的
git config --global
(这会影响 %USERPROFILE%\.gitconfig
)未使用与运行 GitLab CI/CD 的帐户相同的帐户。
如果 GitLab 使用不同的帐户运行,它可能会尝试访问您最初创建的文件夹。
GitLab 管道本身需要包括:
git config --global --add safe.directory $CI_PROJECT_DIR
这是我在 MR 3538 中为 GitLab 15.8 自动添加的内容。
solstice333在评论中指出到
gitlab-org/gitlab-runner
问题29022,其中Kevin Navero解释说:
我找到了适合我的案例的解决方法。
为了更清楚地说明我的环境,我在 Windows 服务器上使用带有 powershell 的 docker-windows 执行器/运行器。
忘记我之前提到的关于怀疑与git config
/git clone
在不同容器下运行的内容。我认为这不再准确。fetch
Gitlab-runner 14.10.1 适用于我,所以我回滚到该版本。
结果,不知何故,“可疑所有者”错误被推送到运行时的稍后时间点,在主
构建脚本中。.gitlab-ci.yml
这允许我在中执行git config --global --add safe.directory ...
,而不是任何其他pre_build_script
脚本。我不知道其他pre_*
脚本在哪里或什么容器中运行。pre_*
AFAIK,此版本的
不支持gitlab-runner
参数,也不识别--docker-isolation
。runners[i].docker.isolation = "hyperv"
实现此目的的替代解决方案是编辑 docker 守护程序 json 配置,位于或%userprofile%\.docker\windows-daemon.json
。%programdata%\docker\config\daemon.json
要添加的条目是“。exec-opts":["isolation=hyperv"]
需要来配置CPU和内存。否则,配置 CPU 和内存的请求将被忽略(在进程隔离中)。isolation=hyperv
当然,如果不为每个 docker-windows 执行程序配置资源子集,则需要担心的是,单个主机上可能会生成多个 docker 容器,过多的进程会导致主机因过多的上下文切换而不堪重负。在
中,我添加了以下内容:config.toml
[[runners]] ... pre_build_script = """ $CI_PROJECT_POSIX_PATH = python -c "from pathlib import Path; >print(Path(r'$CI_PROJECT_DIR').resolve().as_posix())" echo "> git config --global --add safe.directory >$CI_PROJECT_POSIX_PATH" git config --global --add safe.directory $CI_PROJECT_POSIX_PATH """ ...
Python3.11 可以方便地烘焙到
中指定的 docker 映像中,以便运行主构建脚本。.gitlab-ci.yml
类似于$CI_PROJECT_DIR
,全部小写。c:\builds\nextest-eng\usa\magnum
来自 Git 的“可疑所有者”错误消息建议执行,事实证明,即使在 Windows 上,这也是区分大小写的(我很愚蠢地忽略了这一点,因为 git-for-windows 对于跟踪路径是区分大小写的) .git config --global --add safe.directory C:/builds/nextest-eng/usa/magnum
Python 用于自动将
映射到精确的区分大小写的路径,并使用 git-config 建议使用的 posix 分隔符。$CI_PROJECT_DIR
在此示例中,结果为$CI_PROJECT_POSIX_PATH
。C:/builds/nextest-eng/usa/magnum
几个小时以来,我将设置为我的c:/builds/nextest-eng/usa/magnum
,它被忽略为不匹配的 dirpath bc。驱动器盘符错误地小写。safe.directory
这可能适用于 gitlab-runner 15.10,使用未弃用的
钩子(或已弃用的pre_get_sources_script
),但如果它不使用pre_clone_script
指定的图像并使用 gitlab-runner-helper 代替,那么 python 将找不到并且会失败。.gitlab-ci.yml
为了时间和公元前的利益。 gitlab-runner 15.10 不提供我现在需要的任何额外增益,我将坚持使用 gitlab-runner 14.10.1。
当使用 mcr.microsoft.com/windows/servercore:ltsc2016 中的图像作为执行器时,我也遇到了这个问题,但事实证明失败的原因是因为我在 Dockerfile 中预先创建了 builds 文件夹:
RUN mkdir C:\builds\my_repo
WORKDIR C:\builds\my_repo
当我从 Dockerfile 中删除它时,git 可疑所有权错误就消失了。
(我创建此文件夹的原因是因为我在本地测试中使用构建容器,并且希望存在完全相同的路径设置,因此我也需要在本地创建该文件夹。不过将来我将手动创建它。 )
这是真正的解决方案:
如果您在 gitlab-runner 的文件夹中打开 CMD 并输入
gitlab-runner.exe run
然后使用它,克隆的目录将使用用户的用户名进行注册。如果您想在该服务使用不同的帐户运行之后将其注册为服务,那么它就无法使用它。
解决方案:只需删除 /builds/Ukgehnf23 内的每个文件夹即可
默认情况下,它应该只有一个名为
0
并从服务运行 gitlab-runner