在持续集成中使用 SSH
功能介绍
在持续集成中执行构建时,您可能需要通过 SSH 协议登录到一个远端服务器以执行必要的脚本或者指令。您可以在「持续集成」构建计划设置中的「流程配置」使用文本编辑器填入相关命令。
如何使用 SSH 相关指令?
CODING 持续集成中支持您通过 SSH 命令操作远端服务器。
- sshCommand:在远端机器执行指定命令
- sshPut:将当前工作空间的文件/目录放置到远端机器
- sshGet:从远端机器获取文件/目录到当前工作空间
- sshScript:读取本地 shell 脚本,在远端机器执行,而不是执行远端机器上的脚本,否则将会报错:「does not exists」。
- sshRemove:将远端机器的某个文件/目录移除
例如,下文将演示如何通过账号 + 密码连接远端机器并执行 SSH 相关命令,Jenkinsfile 配置示例如下:
def remote = [:]
remote.name = "node"
remote.host = "node.abc.com"
remote.allowAnyHosts = true
node {
withCredentials([usernamePassword(credentialsId: 'sshUserAcct',
passwordVariable: 'password', usernameVariable: 'userName')]) {
remote.user = userName
remote.password = password
stage("SSH Steps Rocks!") {
writeFile file: 'test.sh', text: 'ls'
sshCommand remote: remote,
command: 'for i in {1..5}; do echo -n \"Loop \$i \"; date ; sleep 1; done'
sshScript remote: remote, script: 'test.sh'
sshPut remote: remote, from: 'test.sh', into: '.'
sshGet remote: remote, from: 'test.sh', into: 'test_new.sh', override: true
sshRemove remote: remote, path: 'test.sh'
}
}
}
如何使用 SSH 私钥连接到远端服务?
除了上述示例通过账号 + 密码连接远端服务外,您还可以通过 SSH 私钥来连接到远端服务,Jenkinsfile 配置示例如下:
def remote = [:]
remote.name = "node"
remote.host = "node.abc.com"
remote.allowAnyHosts = true
node {
withCredentials([sshUserPrivateKey(credentialsId: 'sshUser', keyFileVariable: 'identity')]) {
// ssh 登陆用户名
remote.user = 'root'
// 私钥文件地址
remote.identityFile = identity
stage("SSH Steps Rocks!") {
writeFile file: 'abc.sh', text: 'ls'
sshCommand remote: remote,
command: 'for i in {1..5}; do echo -n \"Loop \$i \"; date ; sleep 1; done'
sshPut remote: remote, from: 'abc.sh', into: '.'
sshGet remote: remote, from: 'abc.sh', into: 'bac.sh', override: true
sshScript remote: remote, script: 'abc.sh'
sshRemove remote: remote, path: 'abc.sh'
}
}
}
如何在构建计划中使用 SSH 私钥推拉代码?
当一些仓库严格要求使用 SSH 协议进行代码拉取时,此时便需要将 SSH 私钥录入至构建机中。下文将简要介绍如何在保证密钥安全的情况下在构建计划中使用私钥。
- 加密私钥
首先对私钥内容进行处理,分别在 -----BEGIN RSA PRIVATE KEY-----
后和 -----END RSA PRIVATE KEY-----
内容前添加换行符 \n
。
- 将私钥添加至构建计划的环境变量中
自定义变量名称,将处理后的私钥内容填写至默认值中,并勾选“保密”选项。
- 在流程配置文件中引用此变量
将上个步骤中所命名的环境变量(PRIVATE_KEY)添加至流程配置中。
writeFile(file: '/root/.ssh/id_rsa', text: "${PRIVATE_KEY}")
sh 'chmod 600 /root/.ssh/id_rsa'
如下图所示,即可使构建机调用私钥访问对应权限的代码仓库并进行操作。
拓展阅读
想要了解更多 Jenkinsfile 中关于 SSH 命令的内容,您可以查看 Jenkins 官方帮助文档
想要了解更多 Jenkins 的 SSH 插件相关内容,您可以查看该插件的官方主页
—–BEGIN OPENSSH PRIVATE KEY—–\n
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABAdjYkCqP
ny8luhBsriAzoqAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIBISJnVMgrrOys3f
GUGXEu2fu2f2l8mvOiSs6TtN99CLAAAAoAZXxXwnhEPSI/yUmYsUNqRLJUpqXxrFOYcGa3
0ZHqR5CTP5swPDmwEgNmpQib5uF1mrjib8lB5SehRsUsfpx+cj3wfvyTNocr0aVaQYOmjl
BSi7/Ad8K3kiWDisoV2Ti9YQCtltFV9uX3/PufSa2Ai4EgfzJDPnv8mGf+5NjczxdvJ6vu
Sa1n1BaR/8x1jTSypzbwTIy0uPPae1s0Bl3iw=
\n—–END OPENSSH PRIVATE KEY—–

在阅读中是否遇到以下问题?*
您希望我们如何改进?*
如果您希望得到回复,请留下您的邮箱地址。