使用Jenkins进行自动构建时,经常有远程同步文件到其他主机的需求,比如上传构建好的程序包到服务器。为实现此需求,我们可以在Jenkins项目中增加一个Execute Shell步骤,然后输入以下Command:
rsync -e ssh --progress /var/www/index.htm username@host.domain.com:/var/www/
username: host.domain.com上的用户名,需要对/var/www/有读写权限;
host.domain.com:你的主机,可以是域名或者IP地址。
如果host.domain.com的ssh端口不是默认端口,比如是2222,则需要给ssh加上-p参数,如下所示:
rsync -e 'ssh -p2222' --progress /var/www/index.htm username@host.domain.com:/var/www/
保存Jenkins项目,开始构建,会发现上面增加的步骤会导致构建失败,在Jenkins控制台可以看到如下错误:
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at /SourceCache/rsync/rsync-45/rsync/io.c(453) [sender=2.6.9]
Build step 'Execute shell' marked build as failure
Finished: FAILURE
显然,发生错误是因为ssh认证失败了。
前一篇文章提到了如何使用sshpass实现在脚本中直接输入ssh密码。这种方法虽然很方便,但是安全性较差,因为在脚本中直接可以看到明文密码。实际上,我们可以使用另外一种更安全的方式来实现同样的目的。
Jenkins安装、运行默认会使用jenkins这个帐号,我们首先要使用这个帐号登录。
#为jenkins帐号设置一个密码:
$ sudo passwd jenkins
#切换到jenkins帐号:
$ su - jenkins
#创建rsa密钥:
$ ssh-keygen -t rsa
提示输入passphrase时,直接按回车跳过,生成的私钥和公钥会保存在~/.ssh目录中。
#复制密钥到远程主机:
$ ssh-copy-id username@host.domain.com
此过程中,会提示输入远程主机username用户的密码,正确输入后按回车即可。如果host.domain.com使用了非默认端口,请加上-p参数。如果提示没有找到ssh-copy-id,可使用Homebrew自行安装。
回到Jenkins,重新构建,不出意外的话,应该可以成功了。你也可以使用同样的方式在Jenkins中使用scp。
阅读:652