Shell-Script
根據目錄的存在執行操作
我正在 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
。在下面的程式碼片段中,我做了一些其他更改:
- 使用 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 ''' }
無需在 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}' } }
(所有程式碼片段未經測試。)