Shell-Script

根據目錄的存在執行操作

  • July 3, 2020

我正在 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 文件不存在,則路徑也不存在。

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
   '''
}

無需在 sh 中測試文件是否存在,您可以在 Groovy 中使用Pipeline 實用程序步驟外掛進行測試。

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}'
   }
}

(所有程式碼片段未經測試。)

引用自:https://unix.stackexchange.com/questions/596534