특정 zip 파일을 사용할 수 있는 경우 다음 단계로 진행하는 Jenkins 파이프라인에서 셸 스크립트를 작성 중입니다. 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로 종료됩니다. Jenkins sh
스크립트는 set -e
활성화된 상태로 실행 중이므로 쉘 스크립트가 즉시 중지됩니다.
를 실행하기 전에 디렉토리가 존재하는지 테스트하십시오 find
.
아래 코드 조각에서는 몇 가지 추가 변경 사항을 적용했습니다.
dir
대신 Jenkins를 사용하십시오cd
.find -regex
리터럴을 찾기 위해 전달된 정규식을 수정합니다.
(예: 일치를 피하기 위해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}'
}
}
(모든 코드 조각은 테스트되지 않았습니다.)