Jenkins流水线SSH代理Git推送失败

8

在我的Jenkins流水线中,我可以成功地克隆存储库,但是使用SSH Agent插件推送标签会失败。我已经确保GitHub上的部署密钥具有写入权限,因此似乎存在其他问题...

pipeline {
   agent { docker { image 'node:8' } }

   stages {
      stage('Pull Repo') {
          steps {
            git (
                branch: 'master',
                credentialsId: 'cred-id',
                url: 'github.com:***'
            )
            sshagent(['github-omnia']) {
                sh("git tag -a \"release-2.3.${BUILD_NUMBER}\" -m \"Jenkins built ${BUILD_NUMBER}\"")
                sh("git push --tags")
            }
          }
      }
   }
}

我有所遗漏吗? 编辑: 这是错误的控制台输出
[ssh-agent] Using credentials git (Access to Github-**)
[ssh-agent] Looking for ssh-agent implementation...
[ssh-agent]   Exec ssh-agent (binary ssh-agent on a remote machine)
$ docker exec a6cee721d592b10bb94abbde0471d24a4320dcd07362affb1f18454d6ebe028d ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-TI7dNVoYszsC/agent.12
SSH_AGENT_PID=17
Running ssh-add (command line suppressed)
Identity added: /var/jenkins_home/workspace/Build-And-Deploy-***@tmp/private_key_7884642190516796613.key (/var/jenkins_home/workspace/Build-And-Deploy-***@tmp/private_key_7884642190516796613.key)
[ssh-agent] Started.
[Pipeline] {
[Pipeline] sh
+ git config --global user.email jenkins@***.se
[Pipeline] sh
+ git config --global user.name Jenkins
[Pipeline] sh
+ git remote set-url origin git@github.com:***/***
[Pipeline] sh
+ git tag -a release-2.3.3 -m Jenkins built 3
[Pipeline] sh
+ git push origin --tags
Host key verification failed.
fatal: Could not read from remote repository.

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

请包含错误信息,以便我们了解可能出了什么问题。错误可能在您的Jenkinsfile中,但也可能与您的Jenkins设置或网络环境的某些问题有关。 - Sven Marnach
@SvenMarnach 没问题,我已经编辑了带有控制台输出的问题。 Host key verification failed 看起来很简单。但正如我所说 - 它在上一步骤中成功地完成了拉取。我的猜测是ssh-agent由于某种原因使用了错误的密钥。 - Daniel Setréus
1
这里我们有一个错误信息,“Host key verification failed.” Git尝试使用SSH协议推送,进而在连接时验证服务器的主机密钥。让这个工作起来的_easy_方法是设置环境变量GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no",它将简单地禁用主机密钥检查,从而可能允许中间人攻击。正确的修复方式取决于更多的上下文,而我不想了解你的项目。 - Sven Marnach
1个回答

5

我希望找到一种方法来避免完全忽略主机验证,并且不修改我的Jenkins机器的known_hosts文件,因为我想使用docker。最终我得到了以下类似的结果:

  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中,在使用sshagent之前,请将字符串保存到known_hosts。这是我的流水线; 它获取名为master-v5的分支,并生成一个名为master-v5-dist的分支,其中包含许多构建文件。
pipeline {
    agent { docker { image 'node:14' } }

    stages {
        stage('Checkout') {
            steps {
                git branch: 'master-v5',
                    url: 'git@github.com:internetarchive/bookreader.git',
                    credentialsId: 'YOUR_GH_CREDENTIALS'
            }
        }
        stage('Build') { steps { sh 'npm install && npm run build' } }
        stage('Push') {
            steps {
                sh 'git config user.email "foo@bar.com"'
                sh 'git config user.name "Mr. Foo Bar"'
                
                sh 'git add BookReader'
                sh 'git commit -m Build files [ci skip]'

                withCredentials([string(credentialsId: 'GITHUB_HOST_KEY', variable: 'GITHUB_HOST_KEY')]) {
                    sh 'mkdir -p ~/.ssh && echo "$GITHUB_HOST_KEY" >> ~/.ssh/known_hosts'
                }
                sshagent (credentials: ['YOUR_GH_CREDENTIALS']) {
                    sh 'git push -f origin HEAD:master-v5-dist'
                }
            }
        }
    }
}


这将确保您使用的是受信任的主机密钥,因为您在确信连接到真正的github.com时获取了主机密钥(假定如此)。

1
尽管这不是我多年前提出的问题的确切答案,但我仍将其标记为正确,因为这似乎是一个很好的解决方法。 - Daniel Setréus
1
我已经六年没有登录了。我这样做只是为了感谢您的回复。 - bini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接