【问题标题】:Jenkins ssh-agent starts and then stops immediately in pipeline buildJenkins ssh-agent 在管道构建中启动然后立即停止
【发布时间】:2020-12-03 12:43:27
【问题描述】:

我有一个简单的詹金斯管道构建,这是我的詹金斯文件:

pipeline {
    agent any
    stages {
        stage('deploy-staging') {
            when {
                branch 'staging'
            }
            steps {
                sshagent(['my-credentials-id']) {
                    sh('git push joe@repo:project')
                }
            }
        }
    }
}

我正在使用 sshagent 推送到远程服务器上的 git repo。我已经创建了指向 Jenkins master ~/.ssh 中的私钥文件的凭据。

当我运行构建时,我得到了这个输出(我用 * 替换了一些敏感信息):

[ssh-agent] Using credentials *** (***@*** ssh key)
[ssh-agent] Looking for ssh-agent implementation...
[ssh-agent]   Exec ssh-agent (binary ssh-agent on a remote machine)
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-cjbm7oVQaJYk/agent.11558
SSH_AGENT_PID=11560
$ ssh-add ***
Identity added: ***
[ssh-agent] Started.
[Pipeline] {
[Pipeline] sh
$ ssh-agent -k
unset SSH_AUTH_SOCK;
unset SSH_AGENT_PID;
echo Agent pid 11560 killed;
[ssh-agent] Stopped.
[TDBNSSBFW6JYM3BW6AAVMUV4GVSRLNALY7TWHH6LCUAVI7J3NHJQ] Running shell script
+ git push joe@repo:project
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

如您所见,ssh-agent 启动后立即停止,然后运行 ​​git push 命令。奇怪的是它曾经正常工作过一次,但看起来完全随机。

我对 Jenkins 还是很陌生 - 我是否遗漏了一些明显的东西?任何帮助表示赞赏,谢谢。

编辑:我正在运行一个多分支管道,以防万一。

【问题讨论】:

  • 正如@herm 指出的那样,问题的原因并不是 ssh-agent 停止。 (我怀疑它在完成目标后停止并且不再需要它?)请考虑给您的问题一个新标题,以免误导其他人。

标签: jenkins jenkins-pipeline ssh-agent


【解决方案1】:

我最近遇到了一个类似的问题,虽然它是在一个 docker 容器中。 日志给人的印象是 ssh-agent 退出太早,但实际上问题是我忘记将 git 服务器添加到已知主机。

我建议 ssh-ing 到您的 jenkins master 上,并尝试执行与管道使用 ssh-agent(cli)相同的步骤。然后你就会看到问题出在哪里了。

例如:

eval $(ssh-agent -s)
ssh-add ~/yourKey
git clone

正如on help.github.com解释的那样

更新: 如果尚未添加,这里有一个用于添加 knownHosts 的工具:

/**
 * Add hostUrl to knownhosts on the system (or container) if necessary so that ssh commands will go through even if the certificate was not previously seen.
 * @param hostUrl
 */
void tryAddKnownHost(String hostUrl){
    // ssh-keygen -F ${hostUrl} will fail (in bash that means status code != 0) if ${hostUrl} is not yet a known host
    def statusCode = sh script:"ssh-keygen -F ${hostUrl}", returnStatus:true
    if(statusCode != 0){
        sh "mkdir -p ~/.ssh"
        sh "ssh-keyscan ${hostUrl} >> ~/.ssh/known_hosts"
    }
}

【讨论】:

  • 哇……就是这样!我完全忘记了添加到已知主机。我也不知道为什么我没有想到自己在服务器上复制命令。感谢您的建议,我可能已经为此苦苦挣扎了好几个小时。
  • 没问题。我在完全相同的事情上苦苦挣扎了一天左右(但在一个可能出现问题的另一个来源的 docker 容器内)。很高兴我能帮上忙
  • 检查更新。那里有一个实用程序,仅在必要时才添加已知主机。这将帮助您在 docker 容器中使用 ssh-agent。当然,这会让你容易受到中间人的攻击......
  • 好的,谢谢,这真的很有用,是的,当然需要非常小心我如何使用它。
【解决方案2】:

我在 docker 内部使用这个,将它添加到我的 Jenkins master 的 known_hosts 感觉有点乱,所以我选择了这样的东西:

  1. 在 Jenkins 中,创建一个“秘密文本”类型的新凭据(我们称之为 GITHUB_HOST_KEY),并将其值设置为主机密钥,例如:
# gets the host for github and copies it. You can run this from
# any computer that has access to github.com (or whatever your
# git server is)
ssh-keyscan github.com | clip
  1. 在您的 Jenkinsfile 中,将字符串保存到 known_hosts
pipeline {
    agent { docker { image 'node:12' } }
    stages {
        stage('deploy-staging') {
            when { branch 'staging' }
            steps {
                withCredentials([string(credentialsId: 'GITHUB_HOST_KEY', variable: 'GITHUB_HOST_KEY')]) {
                    sh 'mkdir ~/.ssh && echo "$GITHUB_HOST_KEY" >> ~/.ssh/known_hosts'
                }
                sshagent(['my-credentials-id']) {
                    sh 'git push joe@repo:project'
                }
            }
        }
    }
}

这可确保您使用的是“受信任的”主机密钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多