Jenkins rsync排除不排除任何文件

mcvgt66p  于 2022-11-02  发布在  Jenkins
关注(0)|答案(2)|浏览(269)

我有一个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.shrun.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}
2nc8po8w

2nc8po8w1#

x={a,b}语法不是特定于rsync的,而是Bash中可用的。
例如,如果您在bash中执行下列指令。

echo --exclude={run.sh,deploy.sh}

您将看到以下输出。

--exclude=run.sh --exclude=deploy.sh

Jenkins使用sh -c ....的默认Shell执行shell命令,因此一些Bash的东西将不起作用。为了解决这个问题,在执行脚本之前,将Shebang行设置为指向bash

sh"""

# !/bin/bash

rsync -av --dry-run --exclude={build.sh,run.sh} . ${SERVER_USER}@${SERVER}:${SERVER_DIRECTORY}
"""
hsgswve4

hsgswve42#

我现在通过将 Jenkins〉* 管理Jenkins*〉* 配置系统 *〉*Shell可执行文件 * 设置为/bin/bash(如this post)来解决这个问题。
我不确定,为什么@ycr的答案对我不起作用,因为这个解决方案显然对其他人起作用。

相关问题