【问题标题】:ssh-add make the Jenkins pipline job to failssh-add 使 Jenkins 管道作业失败
【发布时间】:2019-07-09 20:11:24
【问题描述】:

Jenkins (2.162),更新了模块。我需要为 cargo build 添加私有 github 依赖项。所以,我需要在cargo build 之前将 SSH 密钥存储到 Jenkins 容器中。

我做到了:

stage('Build') {
    steps{
        script {
            dir('api'){
                withCredentials([string(credentialsId: 'GitKeyText', variable: 'ID_RSA')]) {
                    sh '''
                        set +x
                        eval `ssh-agent -s`
                        mkdir ~/.ssh
                        echo ${ID_RSA} >~/.ssh/id_rsa
                        chmod go-r ~/.ssh/id_rsa
                        ssh-add
                        cargo build
                    '''
                }
            }
            input message: "wait"
        }
    }
}

一切看起来都不错,并且这个命令序列在 docker 容器中手动运行良好。但是,Jenkins 的工作在ssh-add 失败,没有任何错误消息。只需 ERROR: script returned exit code 1 在 Jenkins 控制台日志的末尾。

添加01: 我在代码中添加了 echo 注释,并将 set +x 更改为 set -x

ssh-add 没有输出(控制台输出)

.....
+ echo before ssh-add
before ssh-add
+ ssh-add
[Pipeline] }
[Pipeline] // withCredentials
[Pipeline] }
[Pipeline] // dir
[Pipeline] }
[Pipeline] // script
Post stage
.....

【问题讨论】:

  • set +x为什么您没有任何日志记录的一部分。如果您确实启用了set -x 跟踪,那么您(以及我们)至少会知道哪个特定步骤正在返回非零状态。
  • 也就是说,让一大堆潜在的并发作业都覆盖同一个 ~/.ssh/id_rsa 文件是一个非常糟糕的主意。为什么不为每个作业使用不同的文件?您可以而且应该将 ssh-add 传递给要添加的密钥的特定文件名。
  • 另外,当文件已经存在时,mkdir ~/.ssh 将会失败。使用-p 参数来抑制它,就像mkdir -p ~/.ssh 一样(但同样,根本不要使用~/.ssh,如上所述)。
  • 抱歉描述不清楚。 “詹金斯容器” - 我的意思是在容器内构建。所以每次都是新的独立文件。
  • set +/- x 不要添加任何新信息。 ssh-add 没有输出。

标签: docker ssh jenkins-pipeline jenkins-plugins ssh-keys


【解决方案1】:

我使用了Jenkins SSH Agent Plugin。 一切按预期工作。

script {
    dir('contract_api'){
        sshagent(['GitSSHcred']) {
            sh 'cargo build'
        }
    }
}

【讨论】:

    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 2021-03-27
    • 2018-01-07
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多