Jenkins sh: wget 다운로드가 완료될 때까지 기다립니다.

Jenkins sh: wget 다운로드가 완료될 때까지 기다립니다.

다운로드가 완료될 때까지 wget 명령을 강제로 기다리게 하는 데 문제가 있습니다. 문제는 Jenkins 내부에서 발생합니다 sh '''script place '''. 스크립트를 .sh파일에 작성했는데 문제 없이 실행되지만 Jenkins로 옮긴 후 다운로드가 완료되기 전에 Jenkins의 다른 명령이 실행됩니다.

내가 사용하는 스크립트는 다음과 같습니다

sh '''
                   ssh -i "${keyfile}" -v -o StrictHostKeyChecking=no myuser@myVM << ENDSSH
                   cd /toFolder
                   ls -l
                   echo
                   if [ -f *.zip ]
                      then
                      echo "zip file already exists. Aborting"
                      exit 1
                   fi
                   
                   wget ${URL} 
                   sleep 1
                   export ZIP_FILENAME=`ls *.zip`
                   echo run: deployment.sh -j $ZIP_FILENAME
                   echo
                   deployment.sh -j $ZIP_FILENAME
                   ENDSSH
                '''

ENDSSH이 코드를 여기에 붙여넣기 위해 배포 스크립트 아래 마지막 줄로 이동하여 코드 블록 내에 유지했습니다. (스크립트의 가장 왼쪽에 있어야 한다는 것을 알고 있습니다)

그래서 내 문제는 다운로드가 완료되기 전에 배포.sh를 사용하여 배포해야 하는 파일 이름을 찾는 것입니다.

waitcommand도 사용해 봤는데 sleep최선의 방법은 아닌 것 같은데 wait 명령이 전혀 기다리지 않고 sleep 명령이 가끔 작동하는 경우가 있습니다. curl동작은 정확히 동일합니다. 저는 Linux 스크립팅에 대한 지식이 부족하므로 어떤 제안이라도 주시면 감사하겠습니다.

답변1

wget(또는 어떤 명령도) 백그라운드로 보내지 않으면 쉘은 해당 명령이 완료될 때까지 기다리고 다음 명령을 일찍 시작하지 않습니다. 이것이 쉘이 작동하는 방식입니다. 귀하의 실제 문제는 URL과 참조 부족이라고 생각합니다. 예를 들어 URL에 쉘을 속일 수 있는 특수 문자가 포함되어 있는 경우 다음과 같은 명령을 실행할 수 있습니다.

wget http://example.com&arg=1

여기에는 &char이 포함되어 있으므로 인용을 방지하기 위해 wget이 백그라운드에서(잘린 URL과 함께) 실행됩니다.

wget "http://example.com&arg=1"

코드에서 변수를 사용하십시오.

wget "${URL}"

답변2

<< ENDSSH여기서 일어나는 일은 코드가 실행되기 전에 백틱 안의 명령이 평가된다는 것입니다. 구분 기호는 큰따옴표로 묶인 문자열로 처리되므로 이는 올바른 동작입니다(예상하지 않더라도!).

예를 들어, 코드를 실행하기 전에 zip 파일이 없으면 heredoc 코드는 heredoc 코드를 실행하기 전에 빈 문자열로 평가되며 ls *.zip실행 시 이 줄은 ZIP_FILENAME비어 있게 유지됩니다.

ZIP_FILENAME=`ls *.zip`

해결책은 heredoc 태그를 작은따옴표로 묶어서 heredoc의 표현식이 실행 전에 평가되지 않도록 하는 것입니다.

ssh ... << 'ENDSSH'
...
ENDSSH

답변3

ENDSSH나는 해결책을 직접 찾았습니다. 스크립트 줄의 dos 호출 아래에 있는 항목을 다른 호출로 옮기면 문제가 해결된 것 같습니다 .asyncwgetENDSSH

sh '''
               ssh -i "${keyfile}" -v -o StrictHostKeyChecking=no myuser@myVM << ENDSSH
               cd /toFolder
               ls -l
               echo
               if [ -f *.zip ]
                  then
                  echo "zip file already exists. Aborting"
                  exit 1
               fi
               
               wget ${URL} 
               ENDSSH
            '''
sh '''
               ssh -i "${keyfile}" -v -o StrictHostKeyChecking=no myuser@myVM << ENDSSH2
               export ZIP_FILENAME=`ls *.zip`
               echo run: deployment.sh -j $ZIP_FILENAME
               echo
               deployment.sh -j $ZIP_FILENAME
               ENDSSH2
            '''

가장 좋고 깨끗한 솔루션은 아니지만 동일한 문제에 직면한 사람에게 도움이 될 수 있습니다.

관련 정보