• Bitbucket 使用 SSH 拉取仓库失败的问题


    问题

    在 Bitbucket 使用 Linux 机器上 ssh-keygen 工具生成的公钥作为 API KEY,然后在 Jenkins 里面存储对应的 SSH 私钥,最后执行 Job 的时候,Windows Agent 提示 SSH 密钥不正确。

     > git fetch --tags --force --progress -- ssh://git@bitbucket.xxxxx.com:7999/xxxx.git +refs/heads/*:refs/remotes/origin/* # timeout=10
    ERROR: Error fetching remote repo 'origin'
    hudson.plugins.git.GitException: Failed to fetch from git@bitbucket.xxxxx.com:7999/xxxx.git
    	at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:1001)
    	at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1242)
    	at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1302)
    	at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:129)
    	at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:97)
    	at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:84)
    	at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
    	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    	at java.base/java.lang.Thread.run(Thread.java:829)
    Caused by: hudson.plugins.git.GitException: Command "git fetch --tags --force --progress -- ssh://git@bitbucket.xxxxx.com:7999/xxxx.git +refs/heads/*:refs/remotes/origin/*" returned status code 128:
    stdout: 
    stderr: git@bitbucket.xxxxx.com: Permission denied (publickey).
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.
    
    	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2671)
    	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandWithCredentials(CliGitAPIImpl.java:2096)
    	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.access$500(CliGitAPIImpl.java:84)
    	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:618)
    	at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:158)
    	at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:151)
    	at hudson.remoting.UserRequest.perform(UserRequest.java:211)
    	at hudson.remoting.UserRequest.perform(UserRequest.java:54)
    	at hudson.remoting.Request$2.run(Request.java:376)
    	at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:78)
    	at java.util.concurrent.FutureTask.run(Unknown Source)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    	at hudson.remoting.Engine$1.lambda$newThread$0(Engine.java:122)
    	at java.lang.Thread.run(Unknown Source)
    	Suppressed: hudson.remoting.Channel$CallSiteStackTrace: Remote call to dev-eu01-njen03.solera.farm
    		at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1797)
    		at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:356)
    		at hudson.remoting.Channel.call(Channel.java:1001)
    		at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:143)
    		at jdk.internal.reflect.GeneratedMethodAccessor8221.invoke(Unknown Source)
    		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    		at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:129)
    		at com.sun.proxy.$Proxy126.execute(Unknown Source)
    		at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:999)
    		at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1242)
    		at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1302)
    		at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:129)
    		at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:97)
    		at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:84)
    		at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
    		at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    		at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    		at java.base/java.lang.Thread.run(Thread.java:829)
    
    折叠

    最后登录到对应的 Windows 节点,直接使用 git clone 命令也是这样,说明不是 Jenkins 的权限问题。

    查询资料得知,出现这种情况需要将对应公钥(id_rsa)与私钥文件(id_rsa.pub) 复制到 Jenkins Agent 执行用户的 HOME 目录下的 .ssh 文件夹。

    普通用户的 HOME 目录就是 echo $HOME,一般也就是 C:\User\UserName 的路径。但是 Jenkins Agent 一旦作为服务执行,那么他的执行用户就是 SYSTEM ACCOUNT,它的 HOME 目录路径是 C:\WINDOWS\system32\config\systemprofile\.ssh

    根据上述情况试了,还是没有解决,不管是 ssh-add xxx,还是更改 Git 的 SSH CONFIG 文件都无法解决。

    原因

    我一直以为是自己的问题,结果用 GitHub 试了,是正常的。最后将目光转向了 BitBucket,根据官方的文章,设置了 GIT_SSH_COMMAND 环境变量,并指定 ssh -vvvv 命令,这样能够让我们看到详细的错误信息。

    最后得到了以下输出:

    查询资料得知,根本原因是 BitBucket 现在不支持 RSA SHA-1 生成的密钥。

    解决

    官方的解决方案有两种,第一种是使用不安全的 RSA SHA-1 密钥,只需要更改客户端的配置文件,将 ssh-rsa 添加进去即可。不过这种做法并不安全,最好的做法还是使用 ssh-keygen 命令生成更加安全,基于 ED25519 算法的密钥。

    ssh-keygen -t ed25519 -C "your_email@example.com"
    

    将这个公钥重新设置在 Bitbucket,然后将私钥替换掉 Jenkins 里面的 Credential,执行 Jenkins Job 成功。

    参考资料


    __EOF__

  • 本文作者: MyZony
  • 本文链接: https://www.cnblogs.com/myzony/p/bitbucket-fails-to-pull-repositories-using-ssh.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    秩(AB)≤min{秩(A), 秩(B)}
    客快物流大数据项目(八十五):实时OLAP分析需求
    加速迈入云原生时代,国产数据库行业要变天
    算法训练 第二周
    selenium的Chrome116版驱动下载
    springMVC01,springMVC的执行流程【第一个springMVC例子(XML配置版本):HelloWorld】
    osg实现三次样条Cardinal曲线
    linux基础指令(一)
    网络安全(黑客)自学
    从短期到长期:品牌建设应该如何使用web3进行营销
  • 原文地址:https://www.cnblogs.com/myzony/p/bitbucket-fails-to-pull-repositories-using-ssh.html