Jenkins管道内的码头工具内的Git不起作用

时间:2017-12-18 14:12:42

标签: git jenkins jenkins-pipeline

我正在尝试在作为Jenkins管道的一部分运行的docker容器中执行一些git查询。 在docker容器外面,sshsgent工作正常,我可以访问我的SCM没问题。在容器内部,我收到主机密钥验证问题 任何人都可以帮我解决我的错误吗?

script {
    sshagent(['e9f7d09a-7b88-4bf7-814c-464f811d9519'])
    {
        sh("""
            ssh -p 7999 git@bitbucket-eng-gpk1.com whoami
        """)
    }
    docker.withRegistry('https://dockerhub.banana.com', 'banana-dockerhub-credential') 
    {
        docker.image('banana_release_base').pull()
        docker.image('banana_release_base').inside(
        '''
           -v /system:/system -v /tmp:/tmp --privileged -u 0
        '''
       )
       {
             sshagent(['e9f7d09a-7b88-4bf7-814c-464f811d9519'])
             {
                 sh("""
                     echo $SSH_AUTH_SOCK
                     ssh -p 7999 git@bitbucket-eng-gpk1.com whoami
                 """)
             }
        }
    }
}

首先是whoami呼叫输出:

[docker_git_test] Running shell script
+ ssh -p 7999 git@bitbucket-eng-gpk1.com whoami
d42967b44abe31d6

docker容器中的第二个调用(和echo)输出:

[docker_git_test] Running shell script
+ echo /tmp/ssh-dSoDZMggpAU1/agent.13
/tmp/ssh-dSoDZMggpAU1/agent.13
+ ssh -p 7999 git@bitbucket-eng-gpk1.com whoami
Host key verification failed

2 个答案:

答案 0 :(得分:4)

只是为了表明我的工作。在mkobits建议中,我在sh命令中添加了两行来编写解决问题的ssh配置文件。

sshagent(['e9f7d09a-7b88-4bf7-814c-464f811d9519'])
         {
             sh("""
                 echo $SSH_AUTH_SOCK
                 mkdir ~/.ssh
                 echo 'Host *\n    StrictHostKeyChecking no' > ~/.ssh/config
                 ssh -p 7999 git@bitbucket-eng-gpk1.com whoami
             """)
         }

它可以内置到dockerfile中,但是当我使用共享图像时,这种方式适合我的目的。

编辑:我已添加到dockerfile,所以我们在这里:

RUN useradd -r -u 1000 builder
COPY config /home/builder/.ssh/config
RUN chown builder:builder /home/builder/.ssh/*
USER builder
ENTRYPOINT ["/bin/bash"]

添加非root用户,以便文件不会以root身份留在工作区中。 需要运行chown as和添加的文件以root身份添加。 添加的配置文件是:

Host *
    StrictHostKeyChecking no

干杯!

答案 1 :(得分:3)

  

主机密钥验证失败

容器中的SSH连接无法验证主机(bitbucket-eng-gpk1.com)的身份,这就是失败的原因。当Jenkins提供容器时,它会尝试限制来自外部世界的内容,例如环境变量和安装到该容器中的文件系统位置,以便构建步骤具有隔离。在您的容器中,它在进行连接之前未接受VCS的主机密钥,并且它不是交互式终端,因此它将失败。

有几种不同的方法可以解决这个问题。以下是我能想到的一些问题:

  • 忽略主机密钥检查(了解此问题的安全隐患(12)) - 使用StrictHostKeyChecking选项禁用检查。 UserKnownHostsFile选项可以用于将接受的密钥管道传送到其他位置。这也可以在~/.ssh/config文件中按主机完成。

    ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 7999 git@bitbucket-eng-gpk1.com whoami
    
  • 将SSH密钥构建到Docker镜像中(脆弱)

  • 使用
  • ~/.ssh/config文件从主机挂载到容器中
  • 从主机“安装”一些SSH配置文件或使用已验证主机密钥的其他配置文件提供程序(可能使用Config File Provider Plugin
相关问题