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このコードをここに貼り付けるために、デプロイスクリプトの下の最後の行に移動し、コードブロック内に残しました。 (スクリプトの一番左にある必要があることを知っています)

だから私の問題は、ダウンロードが完了する前にDeployment.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
            '''

最良かつクリーンなソリューションではありませんが、同じ問題に直面している人に役立ちます。

関連情報