从Jenkins运行时,使用带有symlink命令的通配符会创建错误的链接

时间:2017-09-18 17:57:23

标签: nginx jenkins ssh jenkins-pipeline

我无法解决这个问题。我从我的Jenkins作业通过SSH运行symlink命令。在我的Jenkins管道中,我有这两个步骤(等等)。

sh "ssh ubuntu@${host} sudo ls -al /etc/nginx/sites-available"
sh "ssh ubuntu@${host} sudo ln -sv /etc/nginx/sites-available/* /etc/nginx/sites-enabled/ -f"

这是日志的相关部分:

[Pipeline] sh
[my_job] Running shell script
+ ssh ubuntu@XX.XX.XX.XX sudo ls -al /etc/nginx/sites-available
total 12
drwxr-xr-x 2 root   root   4096 Sep 18 17:27 .
drwxr-xr-x 6 root   root   4096 Aug 30 12:27 ..
-rw-r--r-- 1 ubuntu ubuntu  467 Sep 18 17:27 my-nginx-config
[Pipeline] sh
[my_job] Running shell script
+ ssh ubuntu@XX.XX.XX.XX sudo ln -sv /etc/nginx/sites-available/default /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled/ -f
'/etc/nginx/sites-enabled/default' -> '/etc/nginx/sites-available/default'
'/etc/nginx/sites-enabled/jenkins' -> '/etc/nginx/sites-available/jenkins'

符号链接是在我的远程主机上创建的,而不是my-nginx-config符号链接,defaultjenkins文件(位于/etc/nginx/sites-available的jenkins主机上)是符号链接的

如果我不使用通配符并运行它,它会按预期工作:

sh "ssh ubuntu@${host} sudo ls -al /etc/nginx/sites-available"
sh "ssh ubuntu@${host} sudo ln -sv /etc/nginx/sites-available/my-nginx-conf /etc/nginx/sites-enabled/ -f"

2 个答案:

答案 0 :(得分:1)

有时远程ssh命令(以及scp的位置)需要额外的转义。我知道你已经引用了你的查询,但是你可能还需要一个额外的转义级别(并且因为转义将被你的双引号解释而不是传递给SSH命令,你还需要一个。

尝试双重转义那个通配符:

recur (b, b + 1)

您也可以将这些组合成一个SSH呼叫:

sh "ssh ubuntu@${host} sudo ls -al /etc/nginx/sites-available"
sh "ssh ubuntu@${host} sudo ln -sv /etc/nginx/sites-available/\\* /etc/nginx/sites-enabled/ -f"

我不是詹金斯专家。如果这不起作用,我会尝试另一对转义,将原来的sh "ssh ubuntu@${host} sudo ls -al /etc/nginx/sites-available; sudo ln -sv /etc/nginx/sites-available/\\* /etc/nginx/sites-enabled/ -f" 更改为…/sites-available/*

答案 1 :(得分:1)

需要引用远程命令(尽管大多数命令都没有引号):

sh "ssh ubuntu@${host} 'sudo ln -sv /etc/nginx/sites-available/* /etc/nginx/sites-enabled/ -f'"