디렉터리 존재에 따라 작업 수행

디렉터리 존재에 따라 작업 수행

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

(모든 코드 조각은 테스트되지 않았습니다.)

관련 정보