根据目录的存在执行操作

根据目录的存在执行操作

我正在 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

在下面的代码片段中,我做了一些其他更改:

  • 使用 Jenkinsdir代替cd.
  • 修复传递给的正则表达式find -regex以查找文字.(以免匹配 eg wibble.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}'
    }
}

(所有代码片段未经测试。)

相关内容