python_deploy: fix rollback procedure
Signed-off-by: Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
@@ -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"
|
||||
)
|
||||
|
Reference in New Issue
Block a user