Add locking to git commands
Avoids conflicting attempts when multiple hosts check in at once.
This commit is contained in:
		| @@ -22,6 +22,7 @@ | |||||||
| import os.path | import os.path | ||||||
| import git | import git | ||||||
| import yaml | import yaml | ||||||
|  | from filelock import FileLock | ||||||
|  |  | ||||||
| import pvcbootstrapd.lib.notifications as notifications | import pvcbootstrapd.lib.notifications as notifications | ||||||
|  |  | ||||||
| @@ -60,25 +61,33 @@ def pull_repository(config): | |||||||
|     """ |     """ | ||||||
|     Pull (with rebase) the Ansible git repository |     Pull (with rebase) the Ansible git repository | ||||||
|     """ |     """ | ||||||
|  |     lockfile = "/tmp/pvcbootstrapd-git.lock" | ||||||
|  |     lock = FileLock(lockfile) | ||||||
|  |     with lock: | ||||||
|         logger.info(f"Updating local configuration repository {config['ansible_path']}") |         logger.info(f"Updating local configuration repository {config['ansible_path']}") | ||||||
|         try: |         try: | ||||||
|             git_ssh_cmd = f"ssh -i {config['ansible_keyfile']} -o StrictHostKeyChecking=no" |             git_ssh_cmd = f"ssh -i {config['ansible_keyfile']} -o StrictHostKeyChecking=no" | ||||||
|             g = git.cmd.Git(f"{config['ansible_path']}") |             g = git.cmd.Git(f"{config['ansible_path']}") | ||||||
|  |             logger.debug("Performing git pull") | ||||||
|             g.pull(rebase=True, env=dict(GIT_SSH_COMMAND=git_ssh_cmd)) |             g.pull(rebase=True, env=dict(GIT_SSH_COMMAND=git_ssh_cmd)) | ||||||
|  |             logger.debug("Performing git submodule update") | ||||||
|             g.submodule("update", "--init", env=dict(GIT_SSH_COMMAND=git_ssh_cmd)) |             g.submodule("update", "--init", env=dict(GIT_SSH_COMMAND=git_ssh_cmd)) | ||||||
|         except Exception as e: |         except Exception as e: | ||||||
|             logger.warn(e) |             logger.warn(e) | ||||||
|             notifications.send_webhook(config, "failure", "Failed to update Git repository") |             notifications.send_webhook(config, "failure", "Failed to update Git repository") | ||||||
|  |     logger.info("Completed repository synchonization") | ||||||
|  |  | ||||||
|  |  | ||||||
| def commit_repository(config): | def commit_repository(config): | ||||||
|     """ |     """ | ||||||
|     Commit uncommitted changes to the Ansible git repository |     Commit uncommitted changes to the Ansible git repository | ||||||
|     """ |     """ | ||||||
|  |     lockfile = "/tmp/pvcbootstrapd-git.lock" | ||||||
|  |     lock = FileLock(lockfile) | ||||||
|  |     with lock: | ||||||
|         logger.info( |         logger.info( | ||||||
|             f"Committing changes to local configuration repository {config['ansible_path']}" |             f"Committing changes to local configuration repository {config['ansible_path']}" | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|         try: |         try: | ||||||
|             g = git.cmd.Git(f"{config['ansible_path']}") |             g = git.cmd.Git(f"{config['ansible_path']}") | ||||||
|             g.add("--all") |             g.add("--all") | ||||||
| @@ -102,10 +111,12 @@ def push_repository(config): | |||||||
|     """ |     """ | ||||||
|     Push changes to the default remote |     Push changes to the default remote | ||||||
|     """ |     """ | ||||||
|  |     lockfile = "/tmp/pvcbootstrapd-git.lock" | ||||||
|  |     lock = FileLock(lockfile) | ||||||
|  |     with lock: | ||||||
|         logger.info( |         logger.info( | ||||||
|             f"Pushing changes from local configuration repository {config['ansible_path']}" |             f"Pushing changes from local configuration repository {config['ansible_path']}" | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|         try: |         try: | ||||||
|             git_ssh_cmd = f"ssh -i {config['ansible_keyfile']} -o StrictHostKeyChecking=no" |             git_ssh_cmd = f"ssh -i {config['ansible_keyfile']} -o StrictHostKeyChecking=no" | ||||||
|             g = git.Repo(f"{config['ansible_path']}") |             g = git.Repo(f"{config['ansible_path']}") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user