Skip to content

Commit 46b58a9

Browse files
committed
Use devpi as PyPI cache
Adds a new service for docker-compose that spin up a devpi-server to cache all the Python packages used by the builders. If configured, `--index-url` and `--trusted-host` is added to all the `pip` commands. Fixes #3553
1 parent 2b4aa84 commit 46b58a9

File tree

4 files changed

+48
-0
lines changed

4 files changed

+48
-0
lines changed

docker-compose-devpi.yml

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# docker-compose-pypi.yml starts "devpi" service for local cache
2+
version: '3'
3+
4+
volumes:
5+
devpi:
6+
7+
services:
8+
9+
devpi:
10+
image: readthedocsorg_server:latest
11+
ports:
12+
- "3141:3141"
13+
volumes:
14+
- ${PWD}/docker/entrypoints/devpi.sh:/usr/src/app/docker/devpi.sh
15+
- devpi:/devpi
16+
command: ["../../docker/devpi.sh"]

docker/entrypoints/devpi.sh

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#! /bin/sh
2+
3+
4+
pip3 install devpi-server
5+
devpi-init --serverdir=/devpi
6+
devpi-server --host=0.0.0.0 --absolute-urls --serverdir=/devpi

readthedocs/doc_builder/python_environments.py

+25
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ def install_package(self, install):
105105
'--upgrade-strategy',
106106
'eager',
107107
*self._pip_cache_cmd_argument(),
108+
*self._pip_index_cmd_argument(),
108109
'{path}{extra_requirements}'.format(
109110
path=local_path,
110111
extra_requirements=extra_req_param,
@@ -122,6 +123,27 @@ def install_package(self, install):
122123
bin_path=self.venv_bin(),
123124
)
124125

126+
def _pip_index_cmd_argument(self):
127+
"""Return ``--index-url`` to local devpi if using Docker Compose."""
128+
129+
def _get_devpi_container_ip():
130+
client = self.build_env.get_client()
131+
info = client.inspect_container(
132+
settings.RTD_DOCKER_COMPOSE_DEVPI_CONTAINER,
133+
)
134+
networks = info.get('NetworkSettings').get('Networks')
135+
return networks[list(networks.keys())[0]].get('Gateway')
136+
137+
if settings.RTD_DOCKER_COMPOSE:
138+
ip = _get_devpi_container_ip()
139+
return [
140+
'--index-url',
141+
f'http://{ip}:3141/root/pypi/+simple/',
142+
'--trusted-host',
143+
f'{ip}',
144+
]
145+
return []
146+
125147
def _pip_cache_cmd_argument(self):
126148
"""
127149
Return the pip command ``--cache-dir`` or ``--no-cache-dir`` argument.
@@ -310,6 +332,7 @@ def install_core_requirements(self):
310332
'install',
311333
'--upgrade',
312334
*self._pip_cache_cmd_argument(),
335+
*self._pip_index_cmd_argument(),
313336
]
314337

315338
# Install latest pip first,
@@ -406,6 +429,7 @@ def install_requirements_file(self, install):
406429
args += [
407430
'--exists-action=w',
408431
*self._pip_cache_cmd_argument(),
432+
*self._pip_index_cmd_argument(),
409433
'-r',
410434
requirements_file_path,
411435
]
@@ -602,6 +626,7 @@ def install_core_requirements(self):
602626
'install',
603627
'-U',
604628
*self._pip_cache_cmd_argument(),
629+
*self._pip_index_cmd_argument(),
605630
]
606631
pip_cmd.extend(pip_requirements)
607632
self.build_env.run(

readthedocs/settings/docker.py

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class DockerBaseSettings(CommunityDevSettings):
99
DOCKER_ENABLE = True
1010
RTD_DOCKER_COMPOSE = True
1111
RTD_DOCKER_COMPOSE_VOLUME = 'readthedocsorg_build-user-builds'
12+
RTD_DOCKER_COMPOSE_DEVPI_CONTAINER = 'readthedocsorg_devpi_1'
1213
RTD_DOCKER_USER = f'{os.geteuid()}:{os.getegid()}'
1314
DOCKER_LIMITS = {'memory': '1g', 'time': 900}
1415
USE_SUBDOMAIN = True

0 commit comments

Comments
 (0)