From 04366c1396fa6568f6488bdef9ae8e66333abe0e Mon Sep 17 00:00:00 2001 From: Santos Gallegos Date: Tue, 28 Jan 2020 18:52:42 -0500 Subject: [PATCH 1/3] Don't assume build isn't None in a docker build env This is kind of the same we hit with a local env https://github.com/readthedocs/readthedocs.org/pull/6503 --- readthedocs/doc_builder/environments.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readthedocs/doc_builder/environments.py b/readthedocs/doc_builder/environments.py index 59742c04360..1ad7573206b 100644 --- a/readthedocs/doc_builder/environments.py +++ b/readthedocs/doc_builder/environments.py @@ -792,7 +792,7 @@ def __init__(self, *args, **kwargs): self.container = None self.container_name = slugify( 'build-{build}-project-{project_id}-{project_name}'.format( - build=self.build.get('id'), + build=self.build.get('id') if self.build else '', project_id=self.project.pk, project_name=self.project.slug, )[:DOCKER_HOSTNAME_MAX_LEN], @@ -931,7 +931,7 @@ def get_client(self): # Instead, give the user a generic failure raise BuildEnvironmentError( BuildEnvironmentError.GENERIC_WITH_BUILD_ID.format( - build_id=self.build['id'], + build_id=self.build.get('id') if self.build else '', ), ) From e024beb20df3108343545c1172a787f8323c2539 Mon Sep 17 00:00:00 2001 From: Santos Gallegos Date: Tue, 28 Jan 2020 19:27:21 -0500 Subject: [PATCH 2/3] Check for self.build --- readthedocs/doc_builder/environments.py | 31 +++++++++++++++---------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/readthedocs/doc_builder/environments.py b/readthedocs/doc_builder/environments.py index 1ad7573206b..3c48fb4a30d 100644 --- a/readthedocs/doc_builder/environments.py +++ b/readthedocs/doc_builder/environments.py @@ -790,13 +790,7 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.client = None self.container = None - self.container_name = slugify( - 'build-{build}-project-{project_id}-{project_name}'.format( - build=self.build.get('id') if self.build else '', - project_id=self.project.pk, - project_name=self.project.slug, - )[:DOCKER_HOSTNAME_MAX_LEN], - ) + self.container_name = self.get_container_name() # Decide what Docker image to use, based on priorities: # Use the Docker image set by our feature flag: ``testing`` or, @@ -908,6 +902,17 @@ def __exit__(self, exc_type, exc_value, tb): return super().__exit__(exc_type, exc_value, tb) + def get_container_name(self): + if self.build: + name = 'build-{build}-project-{project_id}-{project_name}'.format( + build=self.build.get('id'), + project_id=self.project.pk, + project_name=self.project.slug, + ) + else: + name = f'sync-project-{self.project.pk}-{self.project.slug}' + return slugify(name[:DOCKER_HOSTNAME_MAX_LEN]) + def get_client(self): """Create Docker client connection.""" try: @@ -929,11 +934,13 @@ def get_client(self): # We don't raise an error here mentioning Docker, that is a # technical detail that the user can't resolve on their own. # Instead, give the user a generic failure - raise BuildEnvironmentError( - BuildEnvironmentError.GENERIC_WITH_BUILD_ID.format( - build_id=self.build.get('id') if self.build else '', - ), - ) + if self.build: + error = BuildEnvironmentError.GENERIC_WITH_BUILD_ID.format( + build_id=self.build.get('id'), + ) + else: + error = 'Failed to connect to Docker API client' + raise BuildEnvironmentError(error) def _get_binds(self): """ From aaadd1a585232f5a1af74a805cbd1c92fde2cc15 Mon Sep 17 00:00:00 2001 From: Santos Gallegos Date: Tue, 28 Jan 2020 20:05:44 -0500 Subject: [PATCH 3/3] Use context manager --- readthedocs/projects/tasks.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/readthedocs/projects/tasks.py b/readthedocs/projects/tasks.py index 899e91aac3b..fdb0c5c60da 100644 --- a/readthedocs/projects/tasks.py +++ b/readthedocs/projects/tasks.py @@ -262,9 +262,10 @@ def run(self, version_pk): # pylint: disable=arguments-differ environment=self.get_rtd_env_vars(), ) - before_vcs.send(sender=self.version, environment=environment) - with self.project.repo_nonblockinglock(version=self.version): - self.sync_repo(environment) + with environment: + before_vcs.send(sender=self.version, environment=environment) + with self.project.repo_nonblockinglock(version=self.version): + self.sync_repo(environment) return True except RepositoryError: # Do not log as ERROR handled exceptions