Continuous Integration環境では、git clone
との使用量が非常に高くなります。git:httpリクエストが失敗した場合に再試行
ネットワークまたはセントラルgitサーバーが信頼できないことがあります。
httpリクエストが失敗した場合にgitに再試行を指示する方法はありますか?
例:
500内部サーバーエラー https://example.com/repos/foo_bar/info/refs?service=git-upload-pack
Continuous Integration環境では、git clone
との使用量が非常に高くなります。git:httpリクエストが失敗した場合に再試行
ネットワークまたはセントラルgitサーバーが信頼できないことがあります。
httpリクエストが失敗した場合にgitに再試行を指示する方法はありますか?
例:
500内部サーバーエラー https://example.com/repos/foo_bar/info/refs?service=git-upload-pack
httpリクエストが失敗した場合に再試行するようにgitを伝える方法はありますか?
git自体はありませんが、ネイティブでその機能をサポートしていません。
しかし興味深いことに、実行を再試行するためにgitコマンドをラップするというアイデアは、前に行われています。「git-retry
(1) Manual Page」、depot_tools, a collection of tools for dealing with Chromium developmentの部分を参照してください。
shell wrapper git-retry
は、次のオプションを使用してPythonスクリプトgit_retry.py
を呼び出します。
'-v', '--verbose', default=0,
は、冗長性を増加させます。
'-c', '--retry-count', default=GitRetry.DEFAULT_RETRY_COUNT (5),
再試行する回数(デフォルト= 5)
'-d', '--delay', default=GitRetry.DEFAULT_DELAY_SECS (3.0)
複数回指定することができます連続の間に待機する時間(秒単位)を指定します。再試行(デフォルト= 3秒)。これはゼロにすることができます。
'-D', '--delay-factor', default=2
連続障害(デフォルト=%のデフォルト)との間の遅延に適用する指数因子。これがゼロの場合、遅延は直線的に増加します。これを1に設定すると、一定の(増加しない)遅延があります。
注:サブモジュールとのレポのためのgitのクローンは常に二回(1回のリトライ)サブモジュールのクローンを作成しようとします。 「Is there any way to continue Git clone from the point where it failed?」を参照してください。
このソリューションは、単純なシェルスクリプトが行うことはしませんが、外部ライブラリへの依存性を追加します – Vorsprung
にアクセスしているときではなく、直接にgitを呼び出すのでは、このようなスクリプトを実行することができます。
#!/bin/bash
REALGIT=/usr/bin/git
RETRIES=3
DELAY=10
COUNT=1
while [ $COUNT -lt $RETRIES ]; do
$REALGIT $*
if [ $? -eq 0 ]; then
RETRIES=0
break
fi
let COUNT=$COUNT+1
sleep $DELAY
done
Gitコマンドは、コマンドの成功を確認できる適切な[終了コード](https://en.wikipedia.org/wiki/Exit_status)を返します。成功しなかった場合は、中止する前にN回再試行してください。 – poke