我正在 Jenkins 管道中编写一个 shell 脚本,如果特定的 zip 文件可用,则继续执行下一步。如果 zip 文件不存在(可能是该 zip 文件所在的目录结构也不可用),则不执行任何操作。
我有如下代码:
sh'''
cd ''' + WORKSPACE + '''/''' + BuildLocation + '''
var=$(find Build/ReleaseKit/Installable/ -regex "$App.*.zip" 2>/dev/null)
echo "$var"
if ! [ -z "$var" ]
then
echo "App zip found"
unzip -o Build/ReleaseKit/Installable/App-*.zip
fi
'''
当找到 zip 文件后,这段代码就可以正常工作了。
但是,当该 zip 文件不存在时,其父目录结构也不存在。因此find
导致No such directory
错误。为了抑制错误,我使用了2>/dev/null
.
使用上面的代码,当 zip 文件不存在时,会生成以下错误:
+ cd /home/oracle/jenkins/workspace/RedmineAndReviewboardProject/Deployment/Build
+ pwd
/home/oracle/jenkins/workspace/RedmineAndReviewboardProject/Deployment/Build
++ find Build/ReleaseKit/Installable/ -regex '.*.zip'
+ var=
.
.
ERROR: script returned exit code 1
如何处理这种情况:如果文件存在,则执行操作。如果不存在,则不执行任何操作。
笔记当 zip 文件存在时,路径也Build/ReleaseKit/Installable/
存在。如果 zip 文件不存在,路径也不存在。
答案1
2>/dev/null
就是把头埋进沙子里。它不会让危险消失,只会隐藏它。find
仍然以状态 1 退出以指示错误。 Jenkinssh
脚本在set -e
启用状态下运行,因此这会立即停止 shell 脚本。
运行之前测试该目录是否存在find
。
在下面的代码片段中,我做了一些其他更改:
- 使用 Jenkins
dir
代替cd
. - 修复传递给的正则表达式
find -regex
以查找文字.
(以免匹配 egwibble.not-a-zip
)。 - 将双重否定简化
! [ -z "$var" ]
为[ -n "$var" ]
.
dir(WORKSPACE + '/' + BuildLocation) {
sh '''
if [ -d Build/ReleaseKit/Installable ]; then
var=$(find Build/ReleaseKit/Installable/ -regex "$App.*\\.zip" 2>/dev/null)
echo "$var"
if [ -n "$var" ]
then
echo "App zip found"
unzip -o Build/ReleaseKit/Installable/App-*.zip
fi
'''
}
由于该文件显然需要位于Installable
目录内部,而不是子(*)目录中更深的位置,因此您不需要find
.
dir(WORKSPACE + '/' + BuildLocation) {
sh '''
set Build/ReleaseKit/Installable/"$App"*.zip
if [ -e "$1" ]; then
echo "App zip found: $1"
unzip -o "$1"
fi
'''
}
您可以在 Groovy 中使用以下命令来测试文件是否存在于 sh 中:管道实用程序步骤插件。
dir(WORKSPACE + '/' + BuildLocation) {
def zips = findFiles glob: "Build/ReleaseKit/Installable/${App}*.zip"
if (findFiles.length > 0) {
env.app_zip = zips[0]
sh 'unzip ${app_zip}'
}
}
(所有代码片段未经测试。)