Switch to uv Python package installer/resolver (#4005)

[uv](https://github.com/astral-sh/uv) is an extremely fast Python
package installer and resolver, written in Rust, and designed as a
drop-in replacement for pip and pip-tools workflows (see
[post](https://astral.sh/blog/uv))
This commit is contained in:
Matias Bordese 2024-04-26 11:30:38 -03:00 committed by GitHub
parent 3fd9a73a52
commit 242ace7724
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 67 additions and 24 deletions

View file

@ -69,7 +69,8 @@ steps:
commands: commands:
- apt-get update && apt-get install -y netcat-traditional - apt-get update && apt-get install -y netcat-traditional
- cd engine/ - cd engine/
- pip install -r requirements.txt -r requirements-dev.txt - pip install uv
- uv pip install -r requirements.txt -r requirements-dev.txt
- ./wait_for_test_mysql_start.sh && pytest - ./wait_for_test_mysql_start.sh && pytest
depends_on: depends_on:
- rabbit_test - rabbit_test

View file

@ -127,8 +127,8 @@ jobs:
# makemigrations --check = Exit with a non-zero status if model changes are missing migrations # makemigrations --check = Exit with a non-zero status if model changes are missing migrations
# and don't actually write them. # and don't actually write them.
run: | run: |
pip install pip-tools pip install uv
pip-sync requirements.txt requirements-dev.txt uv pip sync --system requirements.txt requirements-dev.txt
python manage.py makemigrations --check python manage.py makemigrations --check
python manage.py lintmigrations python manage.py lintmigrations
@ -185,8 +185,8 @@ jobs:
working-directory: engine working-directory: engine
run: | run: |
apt-get update && apt-get install -y netcat-traditional apt-get update && apt-get install -y netcat-traditional
pip install pip-tools pip install uv
pip-sync requirements.txt requirements-dev.txt uv pip sync --system requirements.txt requirements-dev.txt
./wait_for_test_mysql_start.sh && pytest -x ./wait_for_test_mysql_start.sh && pytest -x
unit-test-backend-postgresql-rabbitmq: unit-test-backend-postgresql-rabbitmq:
@ -235,8 +235,8 @@ jobs:
- name: Unit Test Backend - name: Unit Test Backend
working-directory: engine working-directory: engine
run: | run: |
pip install pip-tools pip install uv
pip-sync requirements.txt requirements-dev.txt uv pip sync --system requirements.txt requirements-dev.txt
pytest -x pytest -x
unit-test-backend-sqlite-redis: unit-test-backend-sqlite-redis:
@ -275,8 +275,8 @@ jobs:
working-directory: engine working-directory: engine
run: | run: |
apt-get update && apt-get install -y netcat-traditional apt-get update && apt-get install -y netcat-traditional
pip install pip-tools pip install uv
pip-sync requirements.txt requirements-dev.txt uv pip sync --system requirements.txt requirements-dev.txt
pytest -x pytest -x
unit-test-pd-migrator: unit-test-pd-migrator:
@ -292,8 +292,8 @@ jobs:
- name: Unit Test PD Migrator - name: Unit Test PD Migrator
working-directory: tools/pagerduty-migrator working-directory: tools/pagerduty-migrator
run: | run: |
pip install pip-tools pip install uv
pip-sync requirements.txt uv pip sync --system requirements.txt
pytest -x pytest -x
mypy: mypy:
@ -311,8 +311,8 @@ jobs:
- name: mypy Static Type Checking - name: mypy Static Type Checking
working-directory: engine working-directory: engine
run: | run: |
pip install pip-tools pip install uv
pip-sync requirements.txt requirements-dev.txt uv pip sync --system requirements.txt requirements-dev.txt
mypy . mypy .
end-to-end-tests: end-to-end-tests:

View file

@ -248,21 +248,21 @@ endef
backend-bootstrap: backend-bootstrap:
python3.11 -m venv $(VENV_DIR) python3.11 -m venv $(VENV_DIR)
$(VENV_DIR)/bin/pip install -U pip wheel pip-tools $(VENV_DIR)/bin/pip install -U pip wheel uv
$(VENV_DIR)/bin/pip-sync $(REQUIREMENTS_TXT) $(REQUIREMENTS_DEV_TXT) $(VENV_DIR)/bin/uv pip sync $(REQUIREMENTS_TXT) $(REQUIREMENTS_DEV_TXT)
@if [ -f $(REQUIREMENTS_ENTERPRISE_TXT) ]; then \ @if [ -f $(REQUIREMENTS_ENTERPRISE_TXT) ]; then \
$(VENV_DIR)/bin/pip install -r $(REQUIREMENTS_ENTERPRISE_TXT); \ $(VENV_DIR)/bin/uv pip install -r $(REQUIREMENTS_ENTERPRISE_TXT); \
fi fi
backend-migrate: backend-migrate:
$(call backend_command,python manage.py migrate) $(call backend_command,python manage.py migrate)
backend-compile-deps: backend-compile-deps:
pip-compile --strip-extras $(REQUIREMENTS_IN) uv pip compile --strip-extras $(REQUIREMENTS_IN)
pip-compile --strip-extras $(REQUIREMENTS_DEV_IN) uv pip compile --strip-extras $(REQUIREMENTS_DEV_IN)
backend-upgrade-deps: backend-upgrade-deps:
pip-compile --strip-extras --upgrade $(REQUIREMENTS_IN) uv pip compile --strip-extras --upgrade $(REQUIREMENTS_IN)
run-backend-server: run-backend-server:
$(call backend_command,python manage.py runserver 0.0.0.0:8080) $(call backend_command,python manage.py runserver 0.0.0.0:8080)

View file

@ -27,10 +27,12 @@ RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
&& rm grpcio-1.57.0-cp311-cp311-linux_aarch64.whl; \ && rm grpcio-1.57.0-cp311-cp311-linux_aarch64.whl; \
fi fi
RUN pip install uv
# TODO: figure out how to get this to work.. see comment in .github/workflows/e2e-tests.yml # TODO: figure out how to get this to work.. see comment in .github/workflows/e2e-tests.yml
# https://stackoverflow.com/a/71846527 # https://stackoverflow.com/a/71846527
# RUN --mount=type=cache,target=/root/.cache/pip,from=pip_cache pip install -r requirements.txt # RUN --mount=type=cache,target=/root/.cache/pip,from=pip_cache pip install -r requirements.txt
RUN pip install -r requirements.txt RUN uv pip install --system -r requirements.txt
# we intentionally have two COPY commands, this is to have the requirements.txt in a separate build step # we intentionally have two COPY commands, this is to have the requirements.txt in a separate build step
# which only invalidates when the requirements.txt actually changes. This avoids having to unneccasrily reinstall deps (which is time-consuming) # which only invalidates when the requirements.txt actually changes. This avoids having to unneccasrily reinstall deps (which is time-consuming)
@ -63,13 +65,13 @@ RUN apk add sqlite mysql-client postgresql-client
# TODO: figure out how to get this to work.. see comment in .github/workflows/e2e-tests.yml # TODO: figure out how to get this to work.. see comment in .github/workflows/e2e-tests.yml
# https://stackoverflow.com/a/71846527 # https://stackoverflow.com/a/71846527
# RUN --mount=type=cache,target=/root/.cache/pip,from=pip_cache pip install -r requirements-dev.txt # RUN --mount=type=cache,target=/root/.cache/pip,from=pip_cache pip install -r requirements-dev.txt
RUN pip install -r requirements-dev.txt RUN uv pip install --system -r requirements-dev.txt
FROM dev AS dev-enterprise FROM dev AS dev-enterprise
# TODO: figure out how to get this to work.. see comment in .github/workflows/e2e-tests.yml # TODO: figure out how to get this to work.. see comment in .github/workflows/e2e-tests.yml
# https://stackoverflow.com/a/71846527 # https://stackoverflow.com/a/71846527
# RUN --mount=type=cache,target=/root/.cache/pip,from=pip_cache pip install -r requirements-enterprise-docker.txt # RUN --mount=type=cache,target=/root/.cache/pip,from=pip_cache pip install -r requirements-enterprise-docker.txt
RUN pip install -r requirements-enterprise-docker.txt RUN uv pip install --system -r requirements-enterprise-docker.txt
FROM base AS prod FROM base AS prod

View file

@ -0,0 +1,4 @@
requests==2.31.0
pdpyras==4.5.0
pytest==7.1.2
pytest-env==0.6.2

View file

@ -1,4 +1,40 @@
requests==2.31.0 #
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
# pip-compile requirements.in
#
attrs==23.2.0
# via pytest
certifi==2024.2.2
# via requests
charset-normalizer==3.3.2
# via requests
idna==3.6
# via requests
iniconfig==2.0.0
# via pytest
packaging==23.2
# via pytest
pdpyras==4.5.0 pdpyras==4.5.0
# via -r requirements.in
pluggy==1.4.0
# via pytest
py==1.11.0
# via pytest
pytest==7.1.2 pytest==7.1.2
pytest-env==0.6.2 # via
# -r requirements.in
# pytest-env
pytest-env==0.6.2
# via -r requirements.in
requests==2.31.0
# via
# -r requirements.in
# pdpyras
tomli==2.0.1
# via pytest
urllib3==2.2.1
# via
# pdpyras
# requests