我的家庭实验室中已设置了 Jenkins 和 GitLab,它们在 docker 容器中运行。我能够从 Jenkins 连接到 GitLab,提取所需的存储库,并执行 Jenkinsfile 中的步骤。最近,我遭遇了一场停电,导致实验室停工。自从恢复一切后,Jenkins 就无法再连接到 GitLab。
在 Jenkins 中,构建失败并显示以下内容
Caused by: hudson.plugins.git.GitException: Command "git fetch --tags --force --progress -- git@gitlab:homelab/bind9.git +refs/heads/*:refs/remotes/origin/*" returned status code 128:
stdout:
stderr: Permission denied, please try again.
Permission denied, please try again.
git@gitlab: Permission denied (publickey,password).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
为了排除故障,我连接到 Jenkins 代理容器并尝试克隆存储库,并提示输入密码,这意味着 SSH 密钥未被接受/使用。因此,我尝试使用 SSH 直接与 git 用户连接,并在那里提示输入密码。在 SSH 中使用 -vvv 显示正在传递公钥,但接收数据包的类型为 51。
debug1: Offering public key: /home/jenkins/.ssh/id_ed25519 ED25519 SHA256:xxx
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,password
debug1: Trying private key: /home/jenkins/.ssh/id_ed25519_sk
debug3: no such identity: /home/jenkins/.ssh/id_ed25519_sk: No such file or directory
debug1: Trying private key: /home/jenkins/.ssh/id_xmss
debug3: no such identity: /home/jenkins/.ssh/id_xmss: No such file or directory
debug1: Trying private key: /home/jenkins/.ssh/id_dsa
debug3: no such identity: /home/jenkins/.ssh/id_dsa: No such file or directory
debug2: we did not send a packet, disable method
debug3: authmethod_lookup password
debug3: remaining preferred: ,password
debug3: authmethod_is_enabled password
debug1: Next authentication method: password
git@gitlab's password:
从以前的 SSH 问题来看,51 个接收数据包导致发现交换中涉及的一个文件/目录存在权限问题。我检查了 Jenkins 代理 .ssh 目录并确保它是 0700。目录中的文件都是 0600。在 GitLab 端,git 用户主目录是 /var/opt/gitlab。我确认那里的 .ssh 目录是 0700,文件都是 0600。
我创建了第二个 SSH 密钥并将其添加到 GitLab 中的存储库。然后更改了 Jenkins 中的配置以使用该新密钥,但出现了相同的错误。当尝试使用新密钥直接在 Jenkins 代理上使用 SSH 连接到 GitLab 时,我得到了相同的接收数据包 51 和由此产生的密码提示。
最后需要注意的是,这个密钥在实验室的一个独立系统上工作。在那里,我可以毫无问题地连接并将更改推送到存储库。这让我相信问题不在于密钥,也不在于 GitLab 方面。问题出在 Jenkins 方面。
答案1
对于未来可能遇到类似情况的人来说。
正如问题和评论中所述,我在初始故障排除期间观察了 gitlab 容器上的 ssh 日志,但忘记了主机本身。观察主机上的 ssh 日志发现 jenkins 代理连接的用户尝试无效。这意味着代理没有访问 gitlab 容器的 ssh 服务器。这是因为容器已将 ssh 映射到备用端口。
我修复该问题的方法是.ssh/config
在 jenkins 用户目录中的 Jenkins 代理容器中添加一个文件。在其中.ssh/config
我添加了 GitLab 容器正在监听的备用端口。
所以我最终得到了以下结果
Host gitlab
Port xxxx
输入所需/期望的端口值。输入完成后,Jenkins 便可以检出存储库并执行构建。