diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 59f10472d..164cd1cf0 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -17,3 +17,9 @@ updates: interval: weekly cooldown: default-days: 7 +- package-ecosystem: docker + directory: "/" + schedule: + interval: weekly + cooldown: + default-days: 7 diff --git a/Dockerfile b/Dockerfile index 925a7d1e5..7cd2998b0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,5 @@ +FROM ghcr.io/astral-sh/uv:0.11.8@sha256:3b7b60a81d3c57ef471703e5c83fd4aaa33abcd403596fb22ab07db85ae91347 AS uv + FROM python:3.12.6-bookworm ENV PYTHONUNBUFFERED=1 ENV PYTHONDONTWRITEBYTECODE=1 @@ -32,16 +34,19 @@ RUN case $(uname -m) in \ RUN mkdir /code WORKDIR /code -RUN pip --no-cache-dir --disable-pip-version-check install --upgrade pip setuptools wheel +COPY --from=uv /uv /uvx /usr/local/bin/ -COPY pyproject.toml /code/ +COPY pyproject.toml uv.lock /code/ -RUN --mount=type=cache,target=/root/.cache/pip \ +RUN --mount=type=cache,target=/root/.cache \ set -x \ - && pip --disable-pip-version-check \ - install --group dev \ - . + && uv sync \ + --frozen \ + --no-editable \ + --no-install-project COPY . /code/ -RUN pip --disable-pip-version-check install --no-deps -e '.' +RUN uv sync \ + --frozen \ + --no-editable diff --git a/Dockerfile.cabotage b/Dockerfile.cabotage index 614654d25..d900f4bc7 100644 --- a/Dockerfile.cabotage +++ b/Dockerfile.cabotage @@ -1,3 +1,5 @@ +FROM ghcr.io/astral-sh/uv:0.11.8@sha256:3b7b60a81d3c57ef471703e5c83fd4aaa33abcd403596fb22ab07db85ae91347 AS uv + FROM python:3.12.6-bookworm COPY --from=ewdurbin/nginx-static:1.25.x /usr/bin/nginx /usr/bin/nginx ENV PYTHONUNBUFFERED=1 @@ -33,17 +35,25 @@ RUN case $(uname -m) in \ RUN mkdir /code WORKDIR /code -RUN pip --no-cache-dir --disable-pip-version-check install --upgrade pip setuptools wheel +COPY --from=uv /uv /uvx /usr/local/bin/ -COPY pyproject.toml /code/ +COPY pyproject.toml uv.lock /code/ -RUN --mount=type=cache,target=/root/.cache/pip \ +RUN --mount=type=cache,target=/root/.cache \ set -x \ - && pip --disable-pip-version-check \ - install \ - '.[prod]' + && uv sync \ + --frozen \ + --no-editable \ + --no-dev \ + --extra prod \ + --no-install-project COPY . /code/ -RUN pip --disable-pip-version-check install --no-deps '.' -RUN DJANGO_SETTINGS_MODULE=pydotorg.settings.static python manage.py collectstatic --noinput +RUN uv sync \ + --frozen \ + --no-editable \ + --no-dev \ + --extra prod + +RUN DJANGO_SETTINGS_MODULE=pydotorg.settings.static uv run python manage.py collectstatic --noinput diff --git a/Makefile b/Makefile index 77c976d48..42af8f689 100644 --- a/Makefile +++ b/Makefile @@ -16,8 +16,8 @@ help: ## Display this help text mkdir -p .state && touch .state/db-migrated .state/db-initialized: .state/docker-build-web .state/db-migrated - docker compose run --rm web ./manage.py createcachetable - docker compose run --rm web ./manage.py loaddata fixtures/*.json + docker compose run --rm web uv run ./manage.py createcachetable + docker compose run --rm web uv run ./manage.py loaddata fixtures/*.json mkdir -p .state && touch .state/db-initialized # ============================================================================= @@ -30,16 +30,16 @@ serve: .state/db-initialized ## Start the application docker compose up --remove-orphans migrations: .state/db-initialized ## Generate migrations from models - docker compose run --rm web ./manage.py makemigrations + docker compose run --rm web uv run ./manage.py makemigrations migrate: .state/docker-build-web ## Run Django migrate - docker compose run --rm web ./manage.py migrate + docker compose run --rm web uv run ./manage.py migrate manage: .state/db-initialized ## Run arbitrary manage.py commands - docker compose run --rm web ./manage.py $(filter-out $@,$(MAKECMDGOALS)) + docker compose run --rm web uv run ./manage.py $(filter-out $@,$(MAKECMDGOALS)) shell: .state/db-initialized ## Open Django interactive shell - docker compose run --rm web ./manage.py shell + docker compose run --rm web uv run ./manage.py shell docker_shell: .state/db-initialized ## Open bash in web container docker compose run --rm web /bin/bash @@ -61,7 +61,7 @@ fmt: ## Run ruff formatter @if command -v ruff >/dev/null 2>&1; then ruff format .; else docker compose run --rm web ruff format .; fi test: .state/db-initialized ## Run test suite - docker compose run --rm web ./manage.py test + docker compose run --rm web uv run python ./manage.py test ci: lint fmt test ## Run lint, fmt, then tests diff --git a/docker-compose.yml b/docker-compose.yml index 1f5ea36b4..38c3cebb5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,7 +23,7 @@ services: web: build: . image: pythondotorg:docker-compose - command: python manage.py runserver 0.0.0.0:8000 + command: uv run python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: @@ -39,7 +39,7 @@ services: worker: image: pythondotorg:docker-compose - command: celery -A pydotorg worker -B -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler + command: uv run celery -A pydotorg worker -B -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler volumes: - .:/code environment: