diff --git a/readthedocs/doc_builder/environments.py b/readthedocs/doc_builder/environments.py index 59742c04360..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'), - 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['id'], - ), - ) + 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): """ 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