forked from JOJ/Joint-Teapot
feat: joj3 auto retry on git push failed
This commit is contained in:
parent
0ad1e9540a
commit
a4f6482b21
|
@ -1,6 +1,7 @@
|
||||||
import os
|
import os
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from time import sleep
|
||||||
from typing import TYPE_CHECKING, List
|
from typing import TYPE_CHECKING, List
|
||||||
|
|
||||||
from filelock import FileLock
|
from filelock import FileLock
|
||||||
|
@ -530,7 +531,6 @@ def joj3_all(
|
||||||
)
|
)
|
||||||
if skip_scoreboard and skip_failed_table:
|
if skip_scoreboard and skip_failed_table:
|
||||||
return
|
return
|
||||||
tea.pot.git # trigger lazy load
|
|
||||||
lock_file_path = os.path.join(
|
lock_file_path = os.path.join(
|
||||||
settings.repos_dir, repo_name, settings.joj3_lock_file_path
|
settings.repos_dir, repo_name, settings.joj3_lock_file_path
|
||||||
)
|
)
|
||||||
|
@ -539,6 +539,9 @@ def joj3_all(
|
||||||
+ f"timeout: {settings.joj3_lock_file_timeout}"
|
+ f"timeout: {settings.joj3_lock_file_timeout}"
|
||||||
)
|
)
|
||||||
with FileLock(lock_file_path, timeout=settings.joj3_lock_file_timeout).acquire():
|
with FileLock(lock_file_path, timeout=settings.joj3_lock_file_timeout).acquire():
|
||||||
|
retry_interval = 1
|
||||||
|
git_push_ok = False
|
||||||
|
while not git_push_ok:
|
||||||
logger.info("file lock acquired")
|
logger.info("file lock acquired")
|
||||||
repo_path = tea.pot.git.repo_clean_and_checkout(repo_name, "grading")
|
repo_path = tea.pot.git.repo_clean_and_checkout(repo_name, "grading")
|
||||||
repo: Repo = tea.pot.git.get_repo(repo_name)
|
repo: Repo = tea.pot.git.get_repo(repo_name)
|
||||||
|
@ -586,7 +589,17 @@ def joj3_all(
|
||||||
f"gitea issue link: {gitea_issue_url}"
|
f"gitea issue link: {gitea_issue_url}"
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
tea.pot.git.push(repo_name)
|
push_info_list = tea.pot.git.push(repo_name)
|
||||||
|
git_push_ok = push_info_list.error is None
|
||||||
|
if not git_push_ok:
|
||||||
|
retry_interval *= 2
|
||||||
|
logger.info(
|
||||||
|
f"git push failed, retry in {retry_interval} seconds: {push_info_list}"
|
||||||
|
)
|
||||||
|
if retry_interval > 64:
|
||||||
|
logger.error(f"git push failed too many times")
|
||||||
|
return
|
||||||
|
sleep(retry_interval)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -9,6 +9,7 @@ current_path = sys.path[0]
|
||||||
sys.path.remove(current_path)
|
sys.path.remove(current_path)
|
||||||
from git import Repo
|
from git import Repo
|
||||||
from git.exc import GitCommandError
|
from git.exc import GitCommandError
|
||||||
|
from git.remote import PushInfoList
|
||||||
|
|
||||||
sys.path.insert(0, current_path)
|
sys.path.insert(0, current_path)
|
||||||
|
|
||||||
|
@ -117,6 +118,6 @@ class Git:
|
||||||
if repo.is_dirty(untracked_files=True) or repo.index.diff(None):
|
if repo.is_dirty(untracked_files=True) or repo.index.diff(None):
|
||||||
repo.index.commit(commit_message)
|
repo.index.commit(commit_message)
|
||||||
|
|
||||||
def push(self, repo_name: str) -> None:
|
def push(self, repo_name: str) -> PushInfoList:
|
||||||
repo: Repo = self.get_repo(repo_name)
|
repo: Repo = self.get_repo(repo_name)
|
||||||
repo.remote(name="origin").push()
|
return repo.remote(name="origin").push()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user