Skip to content

Commit 02f54c2

Browse files
authored
chore: switch from poetry to uv
1 parent 018d0bf commit 02f54c2

16 files changed

Lines changed: 2092 additions & 2780 deletions

‎.dockerignore‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
!./socnet_rs/pyproject.toml
1515
!./socnet_rs/socnet_rs.pyi
1616
!./manage.py
17-
!./poetry.lock
1817
!./package-lock.json
1918
!./package.json
2019
!./pyproject.toml
2120
!./tsconfig.json
21+
!./uv.lock
2222
Dockerfile

‎.github/dependabot.yml‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,3 @@ updates:
5151
update-types:
5252
- minor
5353
- patch
54-
ignore:
55-
- dependency-name: "django-stubs*"
56-
versions: ["5.0.3", "5.0.4"]

‎.github/workflows/ci.yml‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ jobs:
3030
runs-on: ubuntu-latest
3131
steps:
3232
- uses: actions/checkout@v4
33-
- run: pipx run pre-commit run --all-files
33+
- uses: astral-sh/setup-uv@v3
34+
- run: uv tool run --from pre-commit@latest --with pre-commit-uv --no-cache pre-commit run --all-files
3435
run-pytest-mypy:
3536
runs-on: ubuntu-latest
3637
env:

‎.github/workflows/update-dependencies.yml‎

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,40 @@ jobs:
1919
- cmd: npm update --package-lock-only --lockfile-version 3
2020
commit-msg: Update package-lock.json
2121
branch: update/npm-lock
22-
- cmd: pipx install 'maturin<2' && pipx run poetry lock --no-interaction
23-
commit-msg: Update poetry.lock
24-
branch: update/poetry-lock
25-
- cmd: pipx run pre-commit autoupdate
22+
fail-fast: false
23+
steps:
24+
- uses: actions/checkout@v4
25+
- run: ${{ matrix.cmd }}
26+
- id: generate-token
27+
uses: tibdex/github-app-token@v2
28+
with:
29+
app_id: ${{ secrets.APP_ID }}
30+
private_key: ${{ secrets.PRIVATE_KEY }}
31+
- uses: peter-evans/create-pull-request@v7
32+
with:
33+
token: ${{ steps.generate-token.outputs.token }}
34+
commit-message: ${{ matrix.commit-msg }}
35+
branch: ${{ matrix.branch }}
36+
delete-branch: true
37+
sign-commits: true
38+
title: ${{ matrix.commit-msg }}
39+
body:
40+
update-dependencies-uv:
41+
runs-on: ubuntu-latest
42+
if: ${{ github.repository_owner == 'monosans' }}
43+
strategy:
44+
matrix:
45+
include:
46+
- cmd: uv lock --upgrade --no-cache
47+
commit-msg: Update uv.lock
48+
branch: update/uv-lock
49+
- cmd: uv tool run --from pre-commit@latest --with pre-commit-uv --no-cache pre-commit autoupdate
2650
commit-msg: Update .pre-commit-config.yaml
2751
branch: update/pre-commit-config
2852
fail-fast: false
2953
steps:
3054
- uses: actions/checkout@v4
55+
- uses: astral-sh/setup-uv@v3
3156
- run: ${{ matrix.cmd }}
3257
- id: generate-token
3358
uses: tibdex/github-app-token@v2

‎docker-compose.ci.yml‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ services:
44
build:
55
target: python-ci-run-stage
66
args:
7-
- POETRY_GROUPS=main,local
7+
- EXTRA=local
88
volumes:
99
- .:/app
10+
- /app/.venv

‎docker-compose.override.yml‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@ services:
44
build:
55
target: python-local-run-stage
66
args:
7-
- POETRY_GROUPS=main,local
8-
- GID=${GID:-1000}
9-
- UID=${UID:-1000}
7+
- EXTRA=local
108
depends_on:
119
- esbuild
1210
ports:
1311
- 8000:8000
1412
volumes:
1513
- .:/app
14+
- /app/.venv
1615
postgres:
1716
volumes:
1817
- local-postgres-data:/var/lib/postgresql/data
@@ -22,15 +21,12 @@ services:
2221
context: .
2322
dockerfile: ./docker/django/Dockerfile
2423
target: node-watch-stage
25-
args:
26-
- GID=${GID:-1000}
27-
- UID=${UID:-1000}
2824
networks:
2925
- esbuild
3026
volumes:
31-
- ./socnet/static:/app/socnet/static
27+
- ./socnet/static/private:/app/socnet/static/private
28+
- ./socnet/static/public:/app/socnet/static/public
3229
- ./package.json:/app/package.json
33-
- ./package-lock.json:/app/package-lock.json
3430
- ./tsconfig.json:/app/tsconfig.json
3531
networks:
3632
esbuild:

‎docker-compose.prod.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ services:
44
build:
55
target: python-production-run-stage
66
args:
7-
- POETRY_GROUPS=main,production
7+
- EXTRA=production
88
depends_on:
99
- redis
1010
networks:

‎docker/django/Dockerfile‎

Lines changed: 44 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,18 @@ FROM docker.io/node:lts-bookworm-slim AS node-base-stage
33

44
WORKDIR /app
55

6-
COPY ./package.json ./package-lock.json ./
6+
COPY ./package.json ./
77

88
RUN --mount=type=cache,target=/root/.npm \
9+
--mount=type=bind,source=package-lock.json,target=package-lock.json \
910
npm ci
1011

1112

1213
FROM node-base-stage AS node-build-stage
1314

14-
COPY ./tsconfig.json ./tsconfig.json
15-
COPY ./socnet/static/private/css/ ./socnet/static/private/css/
16-
COPY ./socnet/static/private/js/ ./socnet/static/private/js/
17-
18-
RUN npm run build
15+
RUN --mount=type=bind,source=tsconfig.json,target=tsconfig.json \
16+
--mount=type=bind,source=socnet/static/private,target=socnet/static/private \
17+
npm run build
1918

2019

2120
FROM node-base-stage AS node-watch-stage
@@ -25,11 +24,6 @@ RUN apt-get update \
2524
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
2625
&& rm -rf /var/lib/apt/lists/*
2726

28-
ARG GID UID
29-
30-
RUN groupmod --gid "${GID}" node \
31-
&& usermod --gid node --uid "${UID}" node
32-
3327
USER node
3428

3529
ENTRYPOINT ["tini", "--"]
@@ -40,12 +34,6 @@ CMD ["npm", "run", "watch"]
4034
FROM docker.io/python:3.12-slim-bookworm AS python-base-stage
4135

4236
ENV \
43-
PIP_DISABLE_PIP_VERSION_CHECK=1 \
44-
PIP_NO_COLOR=1 \
45-
PIP_NO_INPUT=1 \
46-
PIP_PROGRESS_BAR=off \
47-
PIP_ROOT_USER_ACTION=ignore \
48-
PIP_UPGRADE=1 \
4937
PYTHONDONTWRITEBYTECODE=1 \
5038
PYTHONUNBUFFERED=1
5139

@@ -54,32 +42,28 @@ WORKDIR /app
5442

5543
FROM python-base-stage AS python-build-stage
5644

57-
ENV \
58-
POETRY_NO_ANSI=1 \
59-
POETRY_NO_CACHE=1 \
60-
POETRY_NO_INTERACTION=1
61-
6245
RUN apt-get update \
6346
&& apt-get install -y --no-install-recommends build-essential curl libpq-dev \
6447
&& curl -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal \
6548
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
6649
&& rm -rf /var/lib/apt/lists/*
6750

68-
ENV PATH="/root/.cargo/bin:${PATH}"
69-
70-
RUN --mount=type=cache,target=/root/.cache/pip,sharing=locked \
71-
pip install poetry poetry-plugin-export
51+
ENV \
52+
PATH="/root/.cargo/bin:${PATH}" \
53+
UV_COMPILE_BYTECODE=1 \
54+
UV_LINK_MODE=copy
7255

73-
COPY ./poetry.lock ./pyproject.toml ./
7456
COPY ./socnet_rs/ ./socnet_rs/
7557

76-
ARG POETRY_GROUPS
58+
ARG EXTRA
7759

78-
RUN --mount=type=cache,target=/app/socnet_rs/target,sharing=locked \
79-
--mount=type=cache,target=/root/.cache/pip,sharing=locked \
60+
RUN --mount=from=ghcr.io/astral-sh/uv,source=/uv,target=/bin/uv \
61+
--mount=type=cache,target=/app/socnet_rs/target,sharing=locked \
62+
--mount=type=cache,target=/root/.cache/uv,sharing=locked \
8063
--mount=type=cache,target=/root/.cargo/registry,sharing=locked \
81-
poetry export --without-hashes --only="${POETRY_GROUPS}" | \
82-
pip wheel --wheel-dir /usr/src/app/wheels -r /dev/stdin
64+
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
65+
--mount=type=bind,source=uv.lock,target=uv.lock \
66+
uv sync --extra="${EXTRA}" --no-dev --no-install-project --frozen
8367

8468

8569
FROM python-base-stage AS python-base-run-stage
@@ -96,25 +80,36 @@ RUN apt-get update \
9680
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
9781
&& rm -rf /var/lib/apt/lists/*
9882

99-
COPY --from=python-build-stage /usr/src/app/wheels/ /wheels/
83+
COPY --from=python-build-stage /app/.venv /app/.venv
84+
85+
ENV PATH="/app/.venv/bin:$PATH"
10086

101-
RUN pip install --no-index --find-links /wheels/ /wheels/* \
102-
&& rm -rf /wheels/
87+
ENTRYPOINT ["tini", "--", "bash", "/app/docker/django/entrypoint.sh"]
10388

104-
ENTRYPOINT ["tini", "--", "/app/docker/django/entrypoint.sh"]
89+
CMD ["bash", "/app/docker/django/start.sh"]
10590

106-
CMD ["/app/docker/django/start.sh"]
10791

92+
FROM python-base-run-stage AS python-local-run-stage
10893

109-
FROM python-ci-run-stage AS python-local-run-stage
94+
ENV DJANGO_SETTINGS_MODULE=config.settings.local
95+
96+
RUN apt-get update \
97+
&& apt-get install -y --no-install-recommends gettext libpq-dev tini wait-for-it \
98+
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
99+
&& rm -rf /var/lib/apt/lists/* \
100+
&& groupadd --gid 1000 django \
101+
&& useradd --gid 1000 --no-log-init --uid 1000 django
110102

111-
ARG GID UID
103+
COPY --chown=django:django --from=python-build-stage /app/.venv /app/.venv
112104

113-
RUN groupadd --gid "${GID}" --system django \
114-
&& useradd --gid django --no-log-init --system --uid "${UID}" django
105+
ENV PATH="/app/.venv/bin:$PATH"
115106

116107
USER django
117108

109+
ENTRYPOINT ["tini", "--", "bash", "/app/docker/django/entrypoint.sh"]
110+
111+
CMD ["bash", "/app/docker/django/start.sh"]
112+
118113

119114
FROM python-base-run-stage AS python-production-run-stage
120115

@@ -124,22 +119,21 @@ RUN apt-get update \
124119
&& apt-get install -y --no-install-recommends brotli gettext libpq-dev tini wait-for-it \
125120
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
126121
&& rm -rf /var/lib/apt/lists/* \
127-
&& groupadd --system django \
128-
&& useradd --gid django --no-log-init --system django \
122+
&& groupadd --gid 1000 django \
123+
&& useradd --gid 1000 --no-log-init --uid 1000 django \
129124
&& mkdir -p /var/www/django/static /var/www/django/media \
130125
&& chown django:django /var/www/django/static /var/www/django/media
131126

132-
COPY --from=python-build-stage /usr/src/app/wheels/ /wheels/
127+
COPY --chown=django:django --from=python-build-stage /app/.venv /app/.venv
133128

134-
RUN pip install --no-index --find-links /wheels/ /wheels/* \
135-
&& rm -rf /wheels/
129+
ENV PATH="/app/.venv/bin:$PATH"
136130

137131
COPY --chown=django:django . .
138-
COPY --from=node-build-stage /app/socnet/static/public/css/ /app/socnet/static/public/css/
139-
COPY --from=node-build-stage /app/socnet/static/public/js/ /app/socnet/static/public/js/
132+
COPY --chown=django:django --from=node-build-stage /app/socnet/static/public/css/ /app/socnet/static/public/css/
133+
COPY --chown=django:django --from=node-build-stage /app/socnet/static/public/js/ /app/socnet/static/public/js/
140134

141135
USER django
142136

143-
ENTRYPOINT ["tini", "--", "/app/docker/django/entrypoint.prod.sh"]
137+
ENTRYPOINT ["tini", "--", "bash", "/app/docker/django/entrypoint.prod.sh"]
144138

145-
CMD ["/app/docker/django/start.prod.sh"]
139+
CMD ["bash", "/app/docker/django/start.prod.sh"]

‎docker/django/start.debugpy.sh‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
set -euo pipefail
44

5-
exec /usr/local/bin/python3 -m debugpy --wait-for-client --listen 0.0.0.0:5678 /usr/local/bin/uvicorn --host 0.0.0.0 --reload --reload-include '*.html' --log-config config/settings/logging.json --no-server-header config.asgi:application
5+
exec python3 -m debugpy --wait-for-client --listen 0.0.0.0:5678 uvicorn --host 0.0.0.0 --reload --reload-include '*.html' --log-config config/settings/logging.json --no-server-header config.asgi:application

‎docker/django/start.prod.sh‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,4 @@ find /var/www/django/static -type f ! \( -iname '*.br' -o -iname '*.gz' \) | whi
5353
done
5454
done
5555

56-
exec /usr/local/bin/gunicorn --config python:docker.django.gunicorn_config config.asgi:application
56+
exec gunicorn --config python:docker.django.gunicorn_config config.asgi:application

0 commit comments

Comments
 (0)