python_deploy: fix rollback procedure

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Eric Callahan
2025-02-08 11:39:44 -05:00
parent 7f1907beb3
commit c7c2bb20d9

View File

@@ -63,6 +63,7 @@ class PythonDeploy(AppDeploy):
self.current_sha: str = "?"
self.upstream_version: PyVersion = self.current_version
self.upstream_sha: str = "?"
self.rollback_version: PyVersion = self.current_version
self.rollback_ref: str = "?"
self.warnings: List[str] = []
package_info = load_distribution_info(self.virtualenv, self.project_name)
@@ -77,6 +78,7 @@ class PythonDeploy(AppDeploy):
self.upstream_sha = storage.get("upstream_commit", "?")
self.upstream_version = PyVersion(storage.get("upstream_version", "?"))
self.rollback_ref = storage.get("rollback_ref", "?")
self.rollback_version = PyVersion(storage.get("rollback_version", "?"))
if not self.needs_refresh():
self._log_package_info()
return storage
@@ -86,6 +88,7 @@ class PythonDeploy(AppDeploy):
storage["upstream_commit"] = self.upstream_sha
storage["upstream_version"] = self.upstream_version.full_version
storage["rollback_ref"] = self.rollback_ref
storage["rollback_version"] = self.rollback_version.full_version
return storage
def get_update_status(self) -> Dict[str, Any]:
@@ -98,6 +101,7 @@ class PythonDeploy(AppDeploy):
"repo_name": self.repo_name,
"version": self.current_version.short_version,
"remote_version": self.upstream_version.short_version,
"rollback_version": self.rollback_version.short_version,
"current_hash": self.current_sha,
"remote_hash": self.upstream_sha,
"is_dirty": self.git_version.dirty,
@@ -176,7 +180,8 @@ class PythonDeploy(AppDeploy):
release_info = package_info.release_info
metadata = package_info.metadata
if release_info is not None:
self.current_sha = release_info.get("commit_sha", self.current_sha)
if self.current_sha == "?":
self.current_sha = release_info.get("commit_sha", "?")
self.git_version = GitVersion(release_info.get("git_version", "?"))
pkg_verson = release_info.get("package_version", "")
if "Version" in metadata:
@@ -343,29 +348,26 @@ class PythonDeploy(AppDeploy):
if self.extras is not None:
project_name = f"{project_name}[{self.extras}]"
assert self.pip_cmd is not None
pip_args: str
if not self.upstream_version.is_valid_version():
# Can't update without a valid upstream
current_version = self.current_version
current_ref = self.current_version.tag
install_ver = self.rollback_version if rollback else self.upstream_version
if (
not install_ver.is_valid_version() or
(current_version.is_valid_version() and current_version == install_ver)
):
# Invalid install version or requested version already installed
return False
pip_exec = pip_utils.AsyncPipExecutor(
self.pip_cmd, self.server, self.cmd_helper.notify_update_response
)
current_ref = self.current_version.tag
pip_args = "install -U --upgrade-strategy eager"
if self.source == PackageSource.PIP:
# We can't depend on the SHA being available for PyPI packages,
# so we must compare versions
if (
self.current_version.is_valid_version() and
self.upstream_version <= self.current_version
):
return False
pip_args = f"{pip_args} {project_name}"
if rollback:
pip_args += f"=={self.rollback_ref}"
elif self.source == PackageSource.GITHUB:
if self.current_sha == self.upstream_sha:
return False
repo = f"{self.repo_owner}/{self.repo_name}"
if rollback:
repo += f"@{self.rollback_ref}"
@@ -385,9 +387,10 @@ class PythonDeploy(AppDeploy):
await pip_exec.call_pip(pip_args, 3600, sys_env_vars=self.pip_env_vars)
await self._update_local_state()
if not rollback:
self.rollback_version = current_version
self.rollback_ref = current_ref
self.upstream_sha = self.current_sha
self.upstream_version = self.current_version
self.upstream_sha = self.current_sha
self.upstream_version = self.current_version
await self._update_sys_deps(sys_deps)
self._log_package_info()
self._save_state()
@@ -401,7 +404,7 @@ class PythonDeploy(AppDeploy):
pass
async def rollback(self) -> bool:
if self.rollback_ref == "?":
if self.rollback_ref == "?" or not self.rollback_version.is_valid_version():
return False
await self.update(rollback=True)
return True
@@ -427,5 +430,6 @@ class PythonDeploy(AppDeploy):
f"Upstream Version: {self.upstream_version.short_version}\n"
f"Upstream Commit SHA: {self.upstream_sha}\n"
f"Converted Git Version: {self.git_version}\n"
f"Rollback Version: {self.rollback_version}\n"
f"Rollback Ref: {self.rollback_ref}\n"
)