chore: retry git push sync

During the release it can happen, that two pushes are executed fast one after another.
This could lead to gh action jobs overlapping while trying to push to sourceforge leading
to errors like "remote: error: cannot lock ref 'refs/heads/master': is at XXX but expected
YYY".
This commit is contained in:
Andreas Dangel 2022-06-09 14:59:07 +02:00
parent b90c5f3ae3
commit 872111f2a1
No known key found for this signature in database
GPG Key ID: 93450DF2DF9A3FA3

View File

@ -27,7 +27,7 @@ function git_repo_sync() {
pmd_ci_log_group_start "Git Sync" pmd_ci_log_group_start "Git Sync"
git remote add pmd-sf "${PMD_SF_USER}@git.code.sf.net:/p/pmd/code" git remote add pmd-sf "${PMD_SF_USER}@git.code.sf.net:/p/pmd/code"
if [ -n "${PMD_CI_BRANCH}" ]; then if [ -n "${PMD_CI_BRANCH}" ]; then
git push pmd-sf "${PMD_CI_BRANCH}:${PMD_CI_BRANCH}" retry 5 git push pmd-sf "${PMD_CI_BRANCH}:${PMD_CI_BRANCH}"
pmd_ci_log_success "Successfully pushed ${PMD_CI_BRANCH} to sourceforge" pmd_ci_log_success "Successfully pushed ${PMD_CI_BRANCH} to sourceforge"
elif [ -n "${PMD_CI_TAG}" ]; then elif [ -n "${PMD_CI_TAG}" ]; then
git push pmd-sf tag "${PMD_CI_TAG}" git push pmd-sf tag "${PMD_CI_TAG}"
@ -39,6 +39,43 @@ function git_repo_sync() {
pmd_ci_log_group_end pmd_ci_log_group_end
} }
#
# From: https://gist.github.com/sj26/88e1c6584397bb7c13bd11108a579746
#
# Retry a command up to a specific number of times until it exits successfully,
# with exponential back off.
#
# $ retry 5 echo Hello
# Hello
#
# $ retry 5 false
# Retry 1/5 exited 1, retrying in 1 seconds...
# Retry 2/5 exited 1, retrying in 2 seconds...
# Retry 3/5 exited 1, retrying in 4 seconds...
# Retry 4/5 exited 1, retrying in 8 seconds...
# Retry 5/5 exited 1, no more retries left.
#
function retry {
local retries=$1
shift
local count=0
until "$@"; do
exit=$?
wait=$((2 ** $count))
count=$(($count + 1))
if [ $count -lt $retries ]; then
echo "Retry $count/$retries exited $exit, retrying in $wait seconds..."
sleep $wait
else
echo "Retry $count/$retries exited $exit, no more retries left."
return $exit
fi
done
return 0
}
git_repo_sync git_repo_sync
exit 0 exit 0