Skip to content

Commit a5b8302

Browse files
committed
refactor: Add local dependencies for rag-core-api and rag-core-lib in prod-local group for development
1 parent 9138352 commit a5b8302

13 files changed

Lines changed: 591 additions & 434 deletions

File tree

.github/workflows/lint-and-test.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ on:
88

99
env:
1010
NODE_VERSION: '18'
11-
PYTHON_VERSION: '3.11'
11+
PYTHON_VERSION: '3.13'
1212

1313
jobs:
1414
changes:
@@ -81,7 +81,7 @@ jobs:
8181

8282
- name: Build Docker image
8383
run: |
84-
docker build -t $IMAGE_NAME --build-arg dev=1 -f services/${{ matrix.service }}/Dockerfile .
84+
docker build -t $IMAGE_NAME -f services/${{ matrix.service }}/Dockerfile.dev .
8585
8686
- name: Run linting
8787
run: |
@@ -104,15 +104,16 @@ jobs:
104104
- name: Checkout code
105105
uses: actions/checkout@v4
106106

107-
- name: Set Docker Image Names
107+
- name: Set Docker Image Name
108108
run: |
109109
echo "LINT_IMAGE_NAME=${{ matrix.library }}-lint:${{ needs.sanitize-branch-name.outputs.sanitized_ref }}-${{ github.run_number }}" >> $GITHUB_ENV
110110
echo "TEST_IMAGE_NAME=${{ matrix.library }}-test:${{ needs.sanitize-branch-name.outputs.sanitized_ref }}-${{ github.run_number }}" >> $GITHUB_ENV
111111
shell: bash
112112

113113
- name: Build lint image
114114
run: |
115-
docker build -t $LINT_IMAGE_NAME --build-arg TEST=0 -f libs/Dockerfile libs
115+
docker build -t $LINT_IMAGE_NAME --build-arg DIRECTORY=${{ matrix.library }} --build-arg TEST=0 -f libs/Dockerfile libs
116+
116117
117118
- name: Run linting
118119
run: |

.github/workflows/semantic-release.yml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,27 +90,21 @@ jobs:
9090
- name: rag-backend
9191
dockerfile: services/rag-backend/Dockerfile
9292
image: rag-backend
93-
build-args: "dev=0"
9493
- name: admin-backend
9594
dockerfile: services/admin-backend/Dockerfile
9695
image: admin-backend
97-
build-args: "dev=0"
9896
- name: document-extractor
9997
dockerfile: services/document-extractor/Dockerfile
10098
image: document-extractor
101-
build-args: "dev=0"
10299
- name: mcp-server
103100
dockerfile: services/mcp-server/Dockerfile
104101
image: mcp-server
105-
build-args: "dev=0"
106102
- name: frontend
107103
dockerfile: services/frontend/apps/chat-app/Dockerfile
108104
image: frontend
109-
build-args: ""
110105
- name: admin-frontend
111106
dockerfile: services/frontend/apps/admin-app/Dockerfile
112107
image: admin-frontend
113-
build-args: ""
114108
steps:
115109
- name: debug-job-inputs
116110
run: |

Tiltfile

Lines changed: 120 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,33 @@ if os.path.exists(".env"):
77
dotenv(fn=".env")
88

99
config.define_bool("debug")
10+
config.define_bool("dev")
1011
cfg = config.parse()
1112
backend_debug = cfg.get("debug", False)
13+
dev_mode = cfg.get("dev", False)
14+
15+
# Print mode information
16+
if dev_mode:
17+
print("🚀 Running in DEVELOPMENT mode (using Dockerfile.dev)")
18+
print(" - Live code updates enabled")
19+
print(" - Fast iteration optimized builds")
20+
else:
21+
print("🏭 Running in PRODUCTION mode (using Dockerfile)")
22+
print(" - Production-optimized builds")
23+
print(" - No live updates")
1224

1325
core_library_context = "./libs"
1426

1527

1628
def create_linter_command(folder_name, name):
17-
# Build with Dockerfile.dev for services, Dockerfile for libs
18-
dockerfile = folder_name + ("/Dockerfile" if folder_name == "./libs" else "/Dockerfile.dev")
19-
# Only libs use TEST build arg; services use no build args
20-
build_args = " --build-arg TEST=1" if folder_name == "./libs" else ""
29+
# Build with appropriate Dockerfile based on context
30+
if folder_name == "./libs":
31+
dockerfile = folder_name + "/Dockerfile"
32+
build_args = " --build-arg TEST=0"
33+
else:
34+
# For services, always use .dev for testing/linting (dev tools needed)
35+
dockerfile = folder_name + "/Dockerfile.dev"
36+
build_args = ""
2137
return (
2238
"docker build -t "
2339
+ name
@@ -31,9 +47,14 @@ def create_linter_command(folder_name, name):
3147

3248

3349
def create_test_command(folder_name, name):
34-
# Build with Dockerfile.dev for services, Dockerfile for libs
35-
dockerfile = folder_name + ("/Dockerfile" if folder_name == "./libs" else "/Dockerfile.dev")
36-
build_args = " --build-arg TEST=1" if folder_name == "./libs" else ""
50+
# Build with appropriate Dockerfile based on context
51+
if folder_name == "./libs":
52+
dockerfile = folder_name + "/Dockerfile"
53+
build_args = " --build-arg TEST=1"
54+
else:
55+
# For services, always use .dev for testing/linting (dev tools needed)
56+
dockerfile = folder_name + "/Dockerfile.dev"
57+
build_args = ""
3758
return (
3859
"docker build -t "
3960
+ name
@@ -152,16 +173,15 @@ rag_api_image_name = "rag-backend"
152173

153174
backend_context = "./services/rag-backend"
154175
rag_api_full_image_name = "%s/%s" % (registry, rag_api_image_name)
155-
docker_build(
156-
rag_api_full_image_name,
157-
".",
158-
live_update=[
159-
sync(backend_context, "/app/services/rag-backend"),
160-
sync(core_library_context+"/rag-core-api", "/app/libs/rag-core-api"),
161-
sync(core_library_context+"/rag-core-lib", "/app/libs/rag-core-lib"),
162-
],
163-
dockerfile=backend_context + "/Dockerfile.dev",
164-
ignore=[
176+
177+
# Choose dockerfile based on dev mode
178+
backend_dockerfile = backend_context + ("/Dockerfile.dev" if dev_mode else "/Dockerfile")
179+
180+
docker_build_config = {
181+
"ref": rag_api_full_image_name,
182+
"context": ".",
183+
"dockerfile": backend_dockerfile,
184+
"ignore": [
165185
"infrastructure/",
166186
"libs/admin-api-lib/",
167187
"libs/extractor-api-lib/",
@@ -170,7 +190,22 @@ docker_build(
170190
"services/mcp-server/",
171191
"services/frontend/",
172192
],
173-
)
193+
}
194+
195+
# Add build args and live_update based on dev mode
196+
if dev_mode:
197+
docker_build_config["live_update"] = [
198+
sync(backend_context, "/app/services/rag-backend"),
199+
sync(core_library_context+"/rag-core-api", "/app/libs/rag-core-api"),
200+
sync(core_library_context+"/rag-core-lib", "/app/libs/rag-core-lib"),
201+
]
202+
else:
203+
# Use prod-local for Tilt with production Dockerfile
204+
docker_build_config["build_args"] = {
205+
"DEPENDENCY_GROUP": "prod-local"
206+
}
207+
208+
docker_build(**docker_build_config)
174209

175210
# Add linter trigger
176211
local_resource(
@@ -199,22 +234,31 @@ mcp_image_name = "mcp-server"
199234

200235
mcp_context = "./services/mcp-server"
201236
mcp_full_image_name = "%s/%s" % (registry, mcp_image_name)
202-
docker_build(
203-
mcp_full_image_name,
204-
".",
205-
live_update=[
206-
sync(mcp_context, "/app/services/mcp-server"),
207-
],
208-
dockerfile=mcp_context + "/Dockerfile.dev",
209-
ignore=[
237+
238+
# Choose dockerfile based on dev mode
239+
mcp_dockerfile = mcp_context + ("/Dockerfile.dev" if dev_mode else "/Dockerfile")
240+
241+
mcp_docker_build_config = {
242+
"ref": mcp_full_image_name,
243+
"context": ".",
244+
"dockerfile": mcp_dockerfile,
245+
"ignore": [
210246
"infrastructure/",
211247
"libs/",
212248
"services/admin-backend/",
213249
"services/document-extractor/",
214250
"services/rag-backend/",
215251
"services/frontend/",
216252
],
217-
)
253+
}
254+
255+
# Add live_update only in dev mode
256+
if dev_mode:
257+
mcp_docker_build_config["live_update"] = [
258+
sync(mcp_context, "/app/services/mcp-server"),
259+
]
260+
261+
docker_build(**mcp_docker_build_config)
218262

219263
# Add linter trigger
220264
local_resource(
@@ -236,16 +280,15 @@ admin_api_image_name = "admin-backend"
236280

237281
admin_backend_context = "./services/admin-backend"
238282
admin_api_full_image_name = "%s/%s" % (registry, admin_api_image_name)
239-
docker_build(
240-
admin_api_full_image_name,
241-
".",
242-
live_update=[
243-
sync(admin_backend_context, "/app/services/admin-backend"),
244-
sync(core_library_context + "/rag-core-lib", "/app/libs/rag-core-lib"),
245-
sync(core_library_context + "/admin-api-lib", "/app/libs/admin-api-lib"),
246-
],
247-
dockerfile=admin_backend_context + "/Dockerfile.dev",
248-
ignore=[
283+
284+
# Choose dockerfile based on dev mode
285+
admin_dockerfile = admin_backend_context + ("/Dockerfile.dev" if dev_mode else "/Dockerfile")
286+
287+
admin_docker_build_config = {
288+
"ref": admin_api_full_image_name,
289+
"context": ".",
290+
"dockerfile": admin_dockerfile,
291+
"ignore": [
249292
"infrastructure/",
250293
"libs/rag-core-api/",
251294
"libs/extractor-api-lib/",
@@ -254,7 +297,22 @@ docker_build(
254297
"services/mcp-server/",
255298
"services/frontend/",
256299
],
257-
)
300+
}
301+
302+
# Add build args and live_update based on dev mode
303+
if dev_mode:
304+
admin_docker_build_config["live_update"] = [
305+
sync(admin_backend_context, "/app/services/admin-backend"),
306+
sync(core_library_context + "/rag-core-lib", "/app/libs/rag-core-lib"),
307+
sync(core_library_context + "/admin-api-lib", "/app/libs/admin-api-lib"),
308+
]
309+
else:
310+
# Use prod-local for Tilt with production Dockerfile
311+
admin_docker_build_config["build_args"] = {
312+
"DEPENDENCY_GROUP": "prod-local"
313+
}
314+
315+
docker_build(**admin_docker_build_config)
258316

259317
# Add linter trigger
260318
local_resource(
@@ -286,15 +344,15 @@ document_extractor_image_name = "document-extractor"
286344

287345
extractor_context = "./services/document-extractor"
288346
document_extractor_full_image_name = "%s/%s" % (registry, document_extractor_image_name)
289-
docker_build(
290-
document_extractor_full_image_name,
291-
".",
292-
live_update=[
293-
sync(extractor_context, "/app/services/document-extractor"),
294-
sync(core_library_context +"/extractor-api-lib", "/app/libs/extractor-api-lib"),
295-
],
296-
dockerfile=extractor_context + "/Dockerfile.dev",
297-
ignore=[
347+
348+
# Choose dockerfile based on dev mode
349+
extractor_dockerfile = extractor_context + ("/Dockerfile.dev" if dev_mode else "/Dockerfile")
350+
351+
extractor_docker_build_config = {
352+
"ref": document_extractor_full_image_name,
353+
"context": ".",
354+
"dockerfile": extractor_dockerfile,
355+
"ignore": [
298356
"infrastructure/",
299357
"libs/rag-core-api/",
300358
"libs/rag-core-lib/",
@@ -305,7 +363,21 @@ docker_build(
305363
"services/frontend/",
306364
"scripts/",
307365
],
308-
)
366+
}
367+
368+
# Add build args and live_update based on dev mode
369+
if dev_mode:
370+
extractor_docker_build_config["live_update"] = [
371+
sync(extractor_context, "/app/services/document-extractor"),
372+
sync(core_library_context +"/extractor-api-lib", "/app/libs/extractor-api-lib"),
373+
]
374+
else:
375+
# Use prod-local for Tilt with production Dockerfile
376+
extractor_docker_build_config["build_args"] = {
377+
"DEPENDENCY_GROUP": "prod-local"
378+
}
379+
380+
docker_build(**extractor_docker_build_config)
309381

310382
# Add linter trigger
311383
local_resource(

services/admin-backend/Dockerfile

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ ENV POETRY_VIRTUALENVS_PATH=/app/services/admin-backend/.venv
44
ENV VIRTUAL_ENV="${POETRY_VIRTUALENVS_PATH}"
55
ENV POETRY_VERSION=2.1.3
66

7+
# Build argument to control which dependency group to install
8+
ARG DEPENDENCY_GROUP=prod
9+
710
RUN DEBIAN_FRONTEND=noninteractive apt-get update \
811
&& DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential --no-install-recommends make \
912
&& python3 -m venv "${POETRY_VIRTUALENVS_PATH}" \
@@ -13,12 +16,18 @@ ENV PATH="${POETRY_VIRTUALENVS_PATH}/bin:$PATH"
1316
WORKDIR /app/services/admin-backend
1417
COPY services/admin-backend/pyproject.toml services/admin-backend/poetry.lock ./
1518

19+
# Copy the required lib dependencies
20+
COPY libs/admin-api-lib/pyproject.toml libs/admin-api-lib/poetry.lock /app/libs/admin-api-lib/
21+
COPY libs/admin-api-lib/src /app/libs/admin-api-lib/src
22+
COPY libs/rag-core-lib/pyproject.toml libs/rag-core-lib/poetry.lock /app/libs/rag-core-lib/
23+
COPY libs/rag-core-lib/src /app/libs/rag-core-lib/src
24+
1625
RUN mkdir -p log && chmod 700 log \
1726
&& touch /app/services/admin-backend/log/logfile.log && chmod 600 /app/services/admin-backend/log/logfile.log
1827

1928
RUN poetry config virtualenvs.create false \
2029
&& cd /app/services/admin-backend \
21-
&& poetry install --no-interaction --no-ansi --no-root --with prod
30+
&& poetry install --no-interaction --no-ansi --no-root --with ${DEPENDENCY_GROUP}
2231

2332
FROM --platform=linux/amd64 python:3.13-bookworm
2433
WORKDIR /app/services/admin-backend
@@ -31,6 +40,23 @@ COPY --from=build /usr/local/bin/ /usr/local/bin/
3140
COPY --from=build /usr/bin/make /usr/bin/make
3241
COPY --from=build /usr/local/lib/ /usr/local/lib/
3342

43+
# Copy the library source code to the final stage only for local path dependencies
44+
ARG DEPENDENCY_GROUP=prod
45+
COPY --from=build --chown=nonroot:nonroot \
46+
/app/libs/admin-api-lib \
47+
/tmp/conditional-libs/admin-api-lib
48+
COPY --from=build --chown=nonroot:nonroot \
49+
/app/libs/rag-core-lib \
50+
/tmp/conditional-libs/rag-core-lib
51+
52+
# Move libraries to final location only if using prod-local
53+
RUN if [ "$DEPENDENCY_GROUP" = "prod-local" ]; then \
54+
mkdir -p /app/libs && \
55+
mv /tmp/conditional-libs/* /app/libs/ && \
56+
chown -R nonroot:nonroot /app/libs; \
57+
fi && \
58+
rm -rf /tmp/conditional-libs
59+
3460
# cleanup
3561
RUN apt-get clean autoclean && apt-get autoremove --yes \
3662
&& while read -r shell; do rm -f "$shell"; done < /etc/shells || true \
@@ -43,3 +69,5 @@ USER nonroot
4369

4470
COPY --chown=nonroot:nonroot services/admin-backend .
4571
COPY --from=build --chown=nonroot:nonroot /app/services/admin-backend/log /app/services/admin-backend/log
72+
73+

0 commit comments

Comments
 (0)