Groovyスクリプトを使用して、各起動間に25分の遅延を置き、合計5回のjenkinsパイプラインを介してアプリケーションを再起動できますか?
//service update command need to execute..
stage('haproxy restart') {
script{
sh '''
docker service update --force abc-haproxy-${qa_env}-haproxy //5 times need to execute, delay between restart is 25 minutes.
'''}
答え1
間に遅延を入れて5回だけ繰り返した場合は、途中でスリープモードを使用しながらコマンドを5回だけ繰り返してください。
//service update command need to execute..
stage('haproxy restart') {
script{
sh '''
docker service update --force abc-haproxy-${qa_env}-haproxy
sleep 25m
docker service update --force abc-haproxy-${qa_env}-haproxy
sleep 25m
docker service update --force abc-haproxy-${qa_env}-haproxy
sleep 25m
docker service update --force abc-haproxy-${qa_env}-haproxy
sleep 25m
docker service update --force abc-haproxy-${qa_env}-haproxy
'''}
Gnu睡眠は25m
25分と理解されています。すべてではありませんが、他のほとんどの睡眠には数字(文字がない場合)が秒で表示されます。システムのスリープモードが文字を認識しない場合は、60秒に25分を掛けてその番号を使用してください。
これにより、コマンド全体が全時間ブロックされます(したがって、少なくとも4 x 25分+ dockerコマンドにかかる時間)。また、Jenkinsの経験はほとんどありません。これが他のパイプラインに有害かどうかはわかりません。
遅延について
最終返品から次回発売までの遅れはありますか?それとも、最後の起動から次の起動までの遅延はありますか?
コマンド(この場合はドッカー)が数秒かかっても問題ありません。ただし、コマンドに数分かかる場合は、追加の時間を処理する必要があります。
たとえば、dockerコマンドが約5分かかります。その後、最初のブートから5分のDocker実行時間が与えられ、次のブートまで25分のスリープ時間が与えられます。実行から実行まで合計30分かかります。上記のコードで得たシーンです。
または、ドッカーが5分間実行されている場合、20分間だけスリープモードになり、開始から次の開始までの合計時間は25分になります。幸いなことに、これはシェルコードで実装するのが非常に簡単です。
//service update command need to execute..
stage('haproxy restart') {
script{
sh '''
docker service update --force abc-haproxy-${qa_env}-haproxy &
sleep 25m
wait
docker service update --force abc-haproxy-${qa_env}-haproxy &
sleep 25m
wait
docker service update --force abc-haproxy-${qa_env}-haproxy &
sleep 25m
wait
docker service update --force abc-haproxy-${qa_env}-haproxy &
sleep 25m
wait
docker service update --force abc-haproxy-${qa_env}-haproxy
'''}
&
末尾のアンパサンド()は、dockerコマンドがバックグラウンドで実行されるようにします。その結果、省電力モードが「即時」実行を開始し、休止状態モードがdockerコマンドと同時に開始されます。 dockerコマンドに5分かかると、スリープは5分間スリープモードに保たれ、最後の起動以降、合計25分間20分間スリープモードになります。
オペレーティングシステムの帳簿管理などのため、常にわずかなマイクロ秒の遅延があるため、「即時」は引用符で囲まれています。しかし、25分間寝て5回だけ繰り返せば無視してもいいほどです。
最後のdockerコマンドには、コマンドが正しく完了するのを待ちたいので、&記号はありません(したがって背景もありません)。そうでなければ、最後のdockerコマンドが(バックグラウンドで)実行され続けていても、jenkinsはステップが完了したと見なすことができます。繰り返しますが、私はJenkinsの経験がほとんどないので、複雑な詳細を知りません。
waitコマンドを使用すると、shは次のコマンドを続行する前にバックグラウンドプロセスが完了するのを待ちます。効果的にアンパサンドをキャンセルします。したがって、dockerコマンドが25分以上かかり、スリープモードが完了すると、shは次のコマンドを開始する前にdockerコマンドが返されるのを待ちます。
そうでなければ待つ必要はありません。 dockerコマンドが25分以上かかると、スリープモードが完了し、次のdockerコマンドがまだ実行されているdockerコマンドと並列に開始されます。 dockerコマンドを並列に実行すると、システムリソースが枯渇する可能性があるため、苦情が発生する可能性があります。
ボーナス:
コードの重複を減らすために、コマンドをシェル関数に入れることができます。
//service update command need to execute..
stage('haproxy restart') {
script{
sh '''
dodocker() {
docker service update --force abc-haproxy-$1-haproxy
}
dodocker ${qa_env}
sleep 25m
dodocker ${qa_env}
sleep 25m
dodocker ${qa_env}
sleep 25m
dodocker ${qa_env}
sleep 25m
dodocker ${qa_env}
'''}
繰り返し回数の柔軟性を高めるためにループを作成できます。
//service update command need to execute..
stage('haproxy restart') {
script{
sh '''
dodocker() {
docker service update --force abc-haproxy-$1-haproxy
}
seq ${repeat} | while read _ ; do
dodocker ${qa_env}
sleep 25m
done
dodocker ${qa_env}
'''}
最後のdodockerの反復は、それ以降はスリープ状態ではなく、ループには含まれませんので、反復を1以下に設定してください。
人間に優しいログ出力のために省電力ステップを設定できます。
//service update command need to execute..
stage('haproxy restart') {
script{
sh '''
dodocker() {
docker service update --force abc-haproxy-$1-haproxy
}
seq ${repeat} | while read r ; do
echo "repeat number $r"
dodocker ${qa_env}
seq ${delay} | while read d ; do
echo "delay minute $d"
sleep 1m
done
done
dodocker ${qa_env}
'''}
これにより、ログファイルに従い、プロセスがどれだけ実行されたかを確認できます。結局25分ずつ4回をすればほぼ2時間になります。