我有一个Jenkins服务器,它运行着一些管道。我想从复制tar文件到Web服务器(并在那里解压缩它)转移到使用rsync同步文件。这工作得很好,但如果我定义了一个排除的文件或文件夹,它仍然是同步的。我在Jenkins文件中有这样一行:
sh "rsync -av --dry-run --exclude={build.sh,run.sh} . ${SERVER_USER}@${SERVER}:${SERVER_DIRECTORY}"
作为参考:以下是“"的内容:
$ tree src/
src/
├── build.sh
├── foo.bar
├── run.sh
└── var
1 directory, 3 files
而SERVER_DIRECTORY
的内容为:
$ tree .
.
└── public
└── index.php
1 directory, 1 file
如果我手动运行上面的命令,那么我会得到一个增量文件列表,其中没有文件build.sh
和run.sh
。在Jenkins上,它们都出现在这个文件列表中:
[Pipeline] sh
+ rsync -av --dry-run --exclude={build.sh,run.sh} . deploy_user@webserver.local:/srv/apache/projects/test
sending incremental file list
./
build.sh
foo.bar
run.sh
var/
到目前为止,我尝试了以下方法:
- 在“."结尾使用一个尾随斜杠,所以我使用了“./",因为手册页指出这会导致在目标路径创建目录
- 在
SERVER_DIRECTORY
的结尾使用尾随斜杠 - 比较rsync版本、rsync二进制文件的路径和环境,但shell是相同的,版本和路径也
// in Jenkinsfile:
sh "echo $SHELL"
// Output on Jenkins:
[Pipeline] sh
+ echo /bin/bash
/bin/bash
- 手动执行整个rsync过程:以jenkins用户身份登录Jenkins,转到build文件夹并运行rsync命令(按预期工作)
我尝试了“single excludes”,意思是“--build.sh--run.sh“,它起作用了,但是我很好奇,为什么其他解决方案只能在手动运行时起作用,而不能通过Jenkins运行。这是某种转义问题还是我在这里遗漏了什么?
我希望有人能在这方面帮助我,我期待着每一个答案!:)
编辑#1:当我尝试mkdir {foo,bar}
时,我得到了同样的行为:Jenkins创建一个文件夹
[Pipeline] sh
+ mkdir {foo,bar}
[Pipeline] sh
+ ls -la
total 1504
drwxr-xr-x 2 jenkins jenkins 4096 Sep 5 14:26 {foo,bar}
2条答案
按热度按时间2nc8po8w1#
x={a,b}
语法不是特定于rsync
的,而是Bash
中可用的。例如,如果您在
bash
中执行下列指令。您将看到以下输出。
Jenkins使用
sh -c ....
的默认Shell执行shell命令,因此一些Bash的东西将不起作用。为了解决这个问题,在执行脚本之前,将Shebang行设置为指向bash
。hsgswve42#
我现在通过将 Jenkins〉* 管理Jenkins*〉* 配置系统 *〉*Shell可执行文件 * 设置为
/bin/bash
(如this post)来解决这个问题。我不确定,为什么@ycr的答案对我不起作用,因为这个解决方案显然对其他人起作用。