Skip to content

Commit bf32ddf

Browse files
committed
improve CI speed
- use caching in `astral-sh/setup-uv` - use caching in HF dataset - parallelise init/init-dev targets in root - general CI to split and parallelise lint/unit tests before docker build Signed-off-by: Jack Luar <jluar@precisioninno.com>
1 parent d1578cf commit bf32ddf

4 files changed

Lines changed: 129 additions & 52 deletions

File tree

.github/workflows/ci-secret.yaml

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: ORAssistant Secret CI
22
run-name: ${{ github.actor }} started CI
33

4-
on:
4+
on:
55
push:
66
branches:
77
- master
@@ -20,25 +20,42 @@ jobs:
2020
build-backend-docker:
2121
runs-on: self-hosted
2222
steps:
23+
- name: Checkout code
24+
uses: actions/checkout@v4
2325
- name: Setup python
2426
uses: actions/setup-python@v5
2527
with:
26-
python-version: '3.12'
28+
python-version: '3.13'
2729
- name: Install uv
28-
uses: astral-sh/setup-uv@v6
29-
- name: Checkout code
30-
uses: actions/checkout@v4
30+
uses: astral-sh/setup-uv@v6
31+
with:
32+
enable-cache: true
33+
cache-dependency-glob: |
34+
backend/uv.lock
35+
frontend/uv.lock
36+
evaluation/uv.lock
3137
- name: Setup prereqs
3238
run: |
3339
make init-dev
3440
- name: Run formatting checks
3541
run: |
3642
make check
43+
- name: Cache HuggingFace dataset
44+
uses: actions/cache@v4
45+
with:
46+
path: backend/data/source_list.json
47+
key: hf-source-list-v1
48+
- name: Download HuggingFace dataset
49+
working-directory: backend
50+
run: |
51+
uv run huggingface-cli download \
52+
--repo-type dataset \
53+
The-OpenROAD-Project/ORAssistant_RAG_Dataset \
54+
--include source_list.json \
55+
--local-dir data/
3756
- name: Run unit tests
3857
working-directory: backend
3958
run: |
40-
uv pip install huggingface_hub[cli]
41-
huggingface-cli download --repo-type dataset The-OpenROAD-Project/ORAssistant_RAG_Dataset --include source_list.json --local-dir data/
4259
cp .env.test .env
4360
make test
4461
- name: Populate environment variables

.github/workflows/ci.yaml

Lines changed: 78 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: ORAssistant CI
22
run-name: ${{ github.actor }} started CI
33

4-
on:
4+
on:
55
pull_request:
66
paths:
77
- 'backend/**'
@@ -15,36 +15,82 @@ defaults:
1515
shell: bash
1616

1717
jobs:
18-
build-backend-docker:
18+
lint:
1919
runs-on: self-hosted
2020
steps:
21-
- name: Setup python
22-
uses: actions/setup-python@v5
23-
with:
24-
python-version: '3.12'
25-
26-
- name: Install uv
27-
uses: astral-sh/setup-uv@v6
28-
29-
- name: Checkout code
30-
uses: actions/checkout@v4
31-
32-
- name: Setup prereqs
33-
run: |
34-
make init-dev
35-
36-
- name: Run formatting checks
37-
run: |
38-
make check
39-
40-
- name: Run unit tests
41-
working-directory: backend
42-
run: |
43-
uv pip install huggingface_hub[cli]
44-
huggingface-cli download --repo-type dataset The-OpenROAD-Project/ORAssistant_RAG_Dataset --include source_list.json --local-dir data/
45-
cp .env.test .env
46-
make test
47-
48-
- name: Build Docker images
49-
run: |
50-
docker compose build
21+
- name: Checkout code
22+
uses: actions/checkout@v4
23+
24+
- name: Setup python
25+
uses: actions/setup-python@v5
26+
with:
27+
python-version: '3.13'
28+
29+
- name: Install uv
30+
uses: astral-sh/setup-uv@v6
31+
with:
32+
enable-cache: true
33+
cache-dependency-glob: |
34+
backend/uv.lock
35+
frontend/uv.lock
36+
evaluation/uv.lock
37+
38+
- name: Setup prereqs
39+
run: make init-dev
40+
41+
- name: Run formatting checks
42+
run: make check
43+
44+
test:
45+
runs-on: self-hosted
46+
steps:
47+
- name: Checkout code
48+
uses: actions/checkout@v4
49+
50+
- name: Setup python
51+
uses: actions/setup-python@v5
52+
with:
53+
python-version: '3.13'
54+
55+
- name: Install uv
56+
uses: astral-sh/setup-uv@v6
57+
with:
58+
enable-cache: true
59+
cache-dependency-glob: |
60+
backend/uv.lock
61+
frontend/uv.lock
62+
evaluation/uv.lock
63+
64+
- name: Setup prereqs
65+
run: make init-dev
66+
67+
- name: Cache HuggingFace dataset
68+
uses: actions/cache@v4
69+
with:
70+
path: backend/data/source_list.json
71+
key: hf-source-list-v1
72+
73+
- name: Download HuggingFace dataset
74+
working-directory: backend
75+
run: |
76+
uv run huggingface-cli download \
77+
--repo-type dataset \
78+
The-OpenROAD-Project/ORAssistant_RAG_Dataset \
79+
--include source_list.json \
80+
--local-dir data/
81+
82+
- name: Run unit tests
83+
working-directory: backend
84+
run: |
85+
cp .env.test .env
86+
make test
87+
88+
docker-build:
89+
runs-on: self-hosted
90+
needs: [lint, test]
91+
steps:
92+
- name: Checkout code
93+
uses: actions/checkout@v4
94+
95+
- name: Build Docker images
96+
run: docker compose build

Makefile

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,27 @@ GOOGLE_SECRET_JSON?=$(HOME)/secret.json
33

44
.PHONY: init
55
init:
6-
@for folder in $(FOLDERS); do (cd $$folder && make init && cd ../); done
6+
@pids=""; \
7+
for folder in $(FOLDERS); do (cd $$folder && make init) & pids="$$pids $$!"; done; \
8+
for pid in $$pids; do wait $$pid || exit 1; done
79

810
.PHONY: init-dev
911
init-dev:
10-
@for folder in $(FOLDERS); do (cd $$folder && make init-dev && cd ../); done
12+
@pids=""; \
13+
for folder in $(FOLDERS); do (cd $$folder && make init-dev) & pids="$$pids $$!"; done; \
14+
for pid in $$pids; do wait $$pid || exit 1; done
1115

1216
.PHONY: format
1317
format:
14-
@for folder in $(FOLDERS); do (cd $$folder && make format && cd ../); done
18+
@pids=""; \
19+
for folder in $(FOLDERS); do (cd $$folder && make format) & pids="$$pids $$!"; done; \
20+
for pid in $$pids; do wait $$pid || exit 1; done
1521

1622
.PHONY: check
1723
check:
18-
@for folder in $(FOLDERS); do \
19-
(cd $$folder && make check && cd ../) || exit 1; \
20-
done
24+
@pids=""; \
25+
for folder in $(FOLDERS); do (cd $$folder && make check) & pids="$$pids $$!"; done; \
26+
for pid in $$pids; do wait $$pid || exit 1; done
2127
@. ./backend/.venv/bin/activate && \
2228
pre-commit run --all-files
2329

backend/Dockerfile

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ FROM ghcr.io/astral-sh/uv:python3.13-bookworm-slim
22

33
WORKDIR /ORAssistant-backend
44

5+
# Layer 1: system deps (rarely changes)
56
RUN apt-get update && apt-get install -y \
67
build-essential \
78
curl \
@@ -15,18 +16,25 @@ RUN apt-get update && apt-get install -y \
1516
git lfs install && \
1617
rm -rf /var/lib/apt/lists/*
1718

18-
RUN pip install uv
19-
20-
COPY ./pyproject.toml /ORAssistant-backend/pyproject.toml
21-
COPY . .
22-
23-
RUN uv venv .venv && uv sync --dev && uv run /ORAssistant-backend/src/post_install.py
24-
19+
# Layer 2: HF dataset (independent of code — cached across code changes)
2520
RUN git clone https://huggingface.co/datasets/The-OpenROAD-Project/ORAssistant_RAG_Dataset && \
2621
mkdir -p data && \
2722
mv ORAssistant_RAG_Dataset/* data/ && \
2823
rm -rf ORAssistant_RAG_Dataset
2924

25+
# Layer 3: Python dep manifests (changes when deps change, not when code changes)
26+
COPY ./pyproject.toml /ORAssistant-backend/pyproject.toml
27+
COPY ./uv.lock /ORAssistant-backend/uv.lock
28+
29+
# Layer 4: Install Python deps (cached unless layer 3 changes)
30+
RUN uv venv .venv && uv sync --dev
31+
32+
# Layer 5: source code (changes frequently; only busts layers below)
33+
COPY . .
34+
35+
# Layer 6: lightweight post-install
36+
RUN uv run /ORAssistant-backend/src/post_install.py
37+
3038
EXPOSE 8000
3139

3240
CMD ["uv", "run", "uvicorn", "src.api.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

0 commit comments

Comments
 (0)