Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork938
Open
Labels
Description
I had concurrent git pull/push in my deployment pipelines, sometimes git pull (rebase) only get remote commit and lost local commit (rebase seems happened)
below is the git actions in first pipeline (no issue happened)
below is the git actions in second pipeline which runs 1 second later than above pipeline (git pull seems lost local commit)
take below graph as example , we should get commit hash 4 after pull but we only get 2 (above a3324df), seems rebase action did not happened when pull?
do we have any way to check if git.pull success or raise exception when git.pull failed?
appreciated !!!
part of the code:
GIT_PUSH_RETRY_NUMBER = 2 for i in range(1, 2 + GIT_PUSH_RETRY_NUMBER): try: origin = self.repo.remotes.origin LOG.info("🔧 Pull first before push") LOG.info(f"🔧 ProductConfig commit id before pull(rebase) is {self._get_short_sha()}") origin.pull(rebase=True) LOG.info(f"🔧 ProductConfig commit id after pull(rebase) is {self._get_short_sha()}") LOG.info("🔧 Push changes to ProductConfig master branch") origin.push().raise_if_error() break # if push succeed, no need retry anymore except Exception as e: if i > GIT_PUSH_RETRY_NUMBER: # if number of retry reached, throw e to terminate raise e LOG.warn(f"🔧 Git error: {e}") SLEEP_SECONDS = randint( 1, 20 ) # just use random number between 1 and 20, different pipeline will wait for different time LOG.info(f"🔧 Sleep {SLEEP_SECONDS} seconds and git push retrying {i}/{GIT_PUSH_RETRY_NUMBER} ...") sleep(SLEEP_SECONDS)
def _get_short_sha(self): sha = self.repo.head.object.hexsha short_sha = self.repo.git.rev_parse(sha, short=7) return short_sha[0:7]