Skip to content

Commit 32a3157

Browse files
authored
Throw build error on conflicting requirements (#621)
* Throw build error if requirements conflict. * Bump RC. * Added comment.
1 parent dd89cce commit 32a3157

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "truss"
3-
version = "0.6.5rc1"
3+
version = "0.6.5rc2"
44
description = "A seamless bridge from model development to model delivery"
55
license = "MIT"
66
readme = "README.md"

truss/contexts/image_builder/serving_image_builder.py

+17-4
Original file line numberDiff line numberDiff line change
@@ -358,10 +358,8 @@ def copy_into_build_dir(from_path: Path, path_in_build_dir: str):
358358
)
359359

360360
# Copy base TrussServer requirements if supplied custom base image
361+
base_truss_server_reqs_filepath = SERVER_CODE_DIR / REQUIREMENTS_TXT_FILENAME
361362
if config.base_image:
362-
base_truss_server_reqs_filepath = (
363-
SERVER_CODE_DIR / REQUIREMENTS_TXT_FILENAME
364-
)
365363
copy_into_build_dir(
366364
base_truss_server_reqs_filepath, BASE_SERVER_REQUIREMENTS_TXT_FILENAME
367365
)
@@ -374,7 +372,22 @@ def copy_into_build_dir(from_path: Path, path_in_build_dir: str):
374372
if should_install_server_requirements:
375373
copy_into_build_dir(server_reqs_filepath, SERVER_REQUIREMENTS_TXT_FILENAME)
376374

377-
(build_dir / REQUIREMENTS_TXT_FILENAME).write_text(spec.requirements_txt)
375+
with open(base_truss_server_reqs_filepath, "r") as f:
376+
base_server_requirements = f.read()
377+
378+
# If the user has provided python requirements,
379+
# append the truss server requirements, so that any conflicts
380+
# are detected and cause a build failure. If there are no
381+
# requirements provided, we just pass an empty string,
382+
# as there's no need to install anything.
383+
user_provided_python_requirements = (
384+
base_server_requirements + spec.requirements_txt
385+
if spec.requirements
386+
else ""
387+
)
388+
(build_dir / REQUIREMENTS_TXT_FILENAME).write_text(
389+
user_provided_python_requirements
390+
)
378391
(build_dir / SYSTEM_PACKAGES_TXT_FILENAME).write_text(spec.system_packages_txt)
379392

380393
self._render_dockerfile(

truss/tests/contexts/image_builder/test_serving_image_builder.py

+18
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,21 @@ def filter_empty_lines(lines):
3131
gen_docker_lines = filter_empty_lines(gen_docker_lines)
3232
server_docker_lines = filter_empty_lines(server_docker_lines)
3333
assert gen_docker_lines == server_docker_lines
34+
35+
36+
def test_requirements_setup_in_build_dir(custom_model_truss_dir):
37+
th = TrussHandle(custom_model_truss_dir)
38+
th.add_python_requirement("numpy")
39+
builder_context = ServingImageBuilderContext
40+
image_builder = builder_context.run(th.spec.truss_dir)
41+
42+
with TemporaryDirectory() as tmp_dir:
43+
tmp_path = Path(tmp_dir)
44+
image_builder.prepare_image_build_dir(tmp_path)
45+
with open(tmp_path / "requirements.txt", "r") as f:
46+
requirements_content = f.read()
47+
48+
with open(f"{BASE_DIR}/../../../templates/server/requirements.txt", "r") as f:
49+
base_requirements_content = f.read()
50+
51+
assert requirements_content == base_requirements_content + "numpy\n"

0 commit comments

Comments
 (0)