持续集成 - 与ssh的exec rsync无声地失败

时间:2014-02-12 02:24:47

标签: php linux ssh jenkins rsync

我已经在这个问题上绞尽脑汁待了好几天,而我却无处可去。

我有一个Jenkins持续集成服务器,它在AWS上构建一个单独的nginx web服务器。

问题

我的rsync命令,当构建服务器用户通过PHP passthru()运行时,会以静默方式失败。

要在构建之后在服务器之间移动文件,我使用的PHP脚本使用rsyncssh来连接以更新网络服务器。该片段在下方。

PHP:

$rsync = "rsync -avzlO --no-g -e 'ssh -i ".$identity." -o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no' ".$workspace." root@".$host.":/var/www/public_html/";
echo($rsync);
echo(passthru($rsync));

通过命令行执行此命令,通过php name-of-file.php调用或仅通过运行echoed命令成功执行rsync。但是,当通过Jenkins服务器调用该命令作为构建后步骤时,该命令将无提示失败。

要注意:我有权访问的用户是ec2-user用户。 Jenkins运行的用户是jenkins用户。我已在echo(exec('whoami'));之前运行rsync确认了这一点。

我尝试了什么

感觉像是权限或所有者错误。我和他们搞砸了,直到我的眼睛准备流血。

目前,他们的立场如下:

-rw------- 1 jenkins  ec2-user 1679 Feb 12 01:37 jenkins.pem
-rwxrwxr-x 1 jenkins  ec2-user 4097 Feb 12 01:51 push_to_cluster_l4.php

我尝试创建一个新的ssh密钥对,并验证它是否允许无密码登录到网络服务器。

我尝试将passthru()更改为exec()system()

我已经通过echo添加了passthru()调用的日志记录,管道传输到文件,分配给变量并输出,无济于事 - 每次都无声地失败。

我知道我想要实现的是可能的,因为它不仅在通过shell执行时起作用,而且相同的代码也支持部署到其他集群。在某个地方只有一些挂断,阻止了部署在新的网络服务器上发生。

谢谢你看看。

1 个答案:

答案 0 :(得分:3)

问题是客户端配置错误的公共SSH密钥。虽然它存在,但它不在.ssh目录中,并且不是Jenkins用来连接rsync的用户所拥有的。一旦我解决了这个问题,我就可以毫无问题地连接。

外卖?当SSH密钥文件不允许在目的地进行无密码登录时,rsync将无提示失败。希望我的时间和挫折能帮助将来一些可怜的人。