【发布时间】: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