ダウンロードが完了するまで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を使用してデプロイする必要があるファイル名を見つけることです。
wait
commandも使ってみました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呼び出しの下の項目を別の呼び出しに移動すると、問題が解決したようです。async
wget
ENDSSH
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
'''
最良かつクリーンなソリューションではありませんが、同じ問題に直面している人に役立ちます。