Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 16 additions & 8 deletions .envrc
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
#!/bin/bash
#!/not/executable/bash

# Our policy is that the .envrc is entirely optional, and a user
# without direnv should not really have a worse dev experience in any way.

# 'make' is in charge of creating and managing virtualenvs, and things like
# pytest can still be directly invoked using .venv/bin/pytest
if [[ -f "${PWD}/.env" ]]; then
dotenv
fi

PATH_add "${HOME}/.local/share/sentry-devenv/bin"

if ! source .venv/bin/activate; then
echo "!!! you have no virtualenv, run 'make setup' to fix that."
# XXX: ideally, direnv is able to export PS1 as modified by sourcing venvs
# but we'd have to patch direnv, and ".venv" isn't descriptive anyways
unset PS1
if ! command -v devenv >/dev/null; then
echo "install devenv: https://github.com/getsentry/devenv#install"
return 1
fi

PATH_add "${PWD}/.devenv/bin"

export VIRTUAL_ENV="${PWD}/.venv"
PATH_add "${PWD}/.venv/bin"

PATH_add /opt/homebrew/opt/rustup/bin
28 changes: 20 additions & 8 deletions .github/workflows/build_library.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,21 @@ jobs:
rustup override set stable
rustup target add --toolchain stable ${{ matrix.target }}

- uses: actions/setup-python@v6
- uses: astral-sh/setup-uv@884ad927a57e558e7a70b92f2bccf9198a4be546 # v6
with:
python-version: "3.13"
version: '0.8.2'
# we just cache the venv-dir directly in action-setup-venv
enable-cache: false

- uses: getsentry/action-setup-venv@0958463ee0e02b9e8aa8f8e031afae1f84b80881 # v3.0.0
with:
cache-dependency-path: uv.lock
install-cmd: uv sync --frozen --only-dev --active

- name: Build Wheel
run: |
pip install setuptools wheel
python setup.py bdist_wheel -p ${{ matrix.py-platform }}
python tools/verify_wheel.py dist/*.whl
working-directory: py
env:
# consumed by cargo and setup.py to obtain the target dir
Expand All @@ -100,14 +107,19 @@ jobs:
with:
submodules: recursive

- uses: actions/setup-python@v6
- uses: astral-sh/setup-uv@884ad927a57e558e7a70b92f2bccf9198a4be546 # v6
with:
python-version: "3.13"
version: '0.8.2'
# we just cache the venv-dir directly in action-setup-venv
enable-cache: false

- uses: getsentry/action-setup-venv@0958463ee0e02b9e8aa8f8e031afae1f84b80881 # v3.0.0
with:
cache-dependency-path: uv.lock
install-cmd: uv sync --frozen --only-dev --active

- name: Build sdist
run: |
pip install setuptools
python setup.py sdist
run: python setup.py sdist
working-directory: py

- uses: actions/upload-artifact@v5
Expand Down
100 changes: 76 additions & 24 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,21 @@ jobs:
with:
submodules: recursive

- name: Get changed files
id: changes
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
with:
list-files: json
filters: |
all:
- added|modified: '**/*'

- name: Setup SSH agent
if: env.SSH_PRIVATE_KEY != ''
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ env.SSH_PRIVATE_KEY }}

- uses: actions/setup-python@v6
with:
python-version: "3.13"

- name: Install Rust Toolchain
run: |
rustup toolchain install stable --profile minimal --no-self-update
Expand All @@ -58,7 +63,34 @@ jobs:
with:
key: ${{ github.job }}

- run: make style lint
- uses: astral-sh/setup-uv@884ad927a57e558e7a70b92f2bccf9198a4be546 # v6
with:
version: '0.8.2'
# we just cache the venv-dir directly in action-setup-venv
enable-cache: false

- uses: getsentry/action-setup-venv@0958463ee0e02b9e8aa8f8e031afae1f84b80881 # v3.0.0
with:
cache-dependency-path: uv.lock
install-cmd: uv sync --frozen --only-dev --active

- uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ~/.cache/pre-commit
key: cache-epoch-1|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml', 'uv.lock') }}

- name: Setup pre-commit
run: pre-commit install-hooks

- name: Run pre-commit
run: |
jq '.[]' --raw-output <<< '${{steps.changes.outputs.all_files}}' |
# Run pre-commit to lint and format check files that were changed (but not deleted)
xargs pre-commit run --files

# running lint-python will unnecessarily go through setup-venv via devenv
# we want to take advantage of cached action-setup-venv
- run: make style-rust lint-rust

- name: Check Docs
run: cargo doc --workspace --all-features --no-deps --document-private-items
Expand Down Expand Up @@ -214,19 +246,23 @@ jobs:
- name: Install Rust Toolchain
run: rustup toolchain install stable --profile minimal --no-self-update

- uses: actions/setup-python@v6
- uses: swatinem/rust-cache@v2
with:
python-version: "3.13"
key: ${{ github.job }}

- name: Install Dependencies
run: pip install -U pytest
- uses: astral-sh/setup-uv@884ad927a57e558e7a70b92f2bccf9198a4be546 # v6
with:
version: '0.8.2'
# we just cache the venv-dir directly in action-setup-venv
enable-cache: false

- uses: swatinem/rust-cache@v2
- uses: getsentry/action-setup-venv@0958463ee0e02b9e8aa8f8e031afae1f84b80881 # v3.0.0
with:
key: ${{ github.job }}
cache-dependency-path: uv.lock
install-cmd: uv sync --frozen --active

- name: Build and Install Library
run: pip install -v --editable py
run: uv pip install py/
env:
RELAY_DEBUG: 1

Expand Down Expand Up @@ -749,9 +785,16 @@ jobs:
with:
ssh-private-key: ${{ env.SSH_PRIVATE_KEY }}

- uses: actions/setup-python@v6
- uses: astral-sh/setup-uv@884ad927a57e558e7a70b92f2bccf9198a4be546 # v6
with:
python-version: "3.13"
version: '0.8.2'
# we just cache the venv-dir directly in action-setup-venv
enable-cache: false

- uses: getsentry/action-setup-venv@0958463ee0e02b9e8aa8f8e031afae1f84b80881 # v3.0.0
with:
cache-dependency-path: uv.lock
install-cmd: uv sync --frozen --only-dev --active

- run: make test-integration
env:
Expand Down Expand Up @@ -839,13 +882,22 @@ jobs:
docker compose logs

validate-devservices-config:
runs-on: ubuntu-24.04
needs: devservices-files-changed
if: needs.devservices-files-changed.outputs.devservices-files-changed == 'true'
steps:
- uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v4.1.7
name: Checkout repository
- uses: getsentry/action-validate-devservices-config@02a078d1280293e6598cabfbd318a01609c12c83
name: Validate devservices config
with:
requirements-file-path: requirements-dev.txt
runs-on: ubuntu-24.04
needs: devservices-files-changed
if: needs.devservices-files-changed.outputs.devservices-files-changed == 'true'
steps:
- uses: actions/[email protected]
name: Checkout repository

- name: Get devservices version
id: get-devservices-version
run: |
awk -F'"' '
/name/ { pkg = $2 }
/version/ { if (pkg == "devservices") print "version="$2 }
' uv.lock >> $GITHUB_OUTPUT

- uses: getsentry/action-validate-devservices-config@711ae7221998ddf81211f25f5e3873ecffd22387
name: Validate devservices config
with:
devservices-version: ${{ steps.get-devservices-version.outputs.version }}
37 changes: 36 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,39 @@ repos:
rev: 0.16.0
hooks:
- id: check-github-actions
- id: check-github-workflows
# TODO: reactivate when fixed
# - id: check-github-workflows
Comment on lines +6 to +7
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this TODO for this PR, or for later?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


- repo: local
hooks:
# Configuration for black exists in pyproject.toml,
# but we let pre-commit take care of the file filtering.
- id: black
name: black
entry: .venv/bin/black
language: system
types_or: [python, pyi]
require_serial: true
# Configuration for flake8 exists in setup.cfg,
# but we let pre-commit take care of the file filtering.
- id: flake8
name: flake8
entry: .venv/bin/flake8
language: system
types: [python]
require_serial: true
- id: mypy
name: mypy
entry: .venv/bin/mypy
language: system
types: [python]
require_serial: true
- id: rustfmt
name: format rust code
language: system
types: [rust]
# keep edition in sync with Cargo.toml
# There is no way to run cargo fmt for specific files,
# rustfmt can do it but doesn't read Cargo.toml.
# https://github.com/rust-lang/rustfmt/issues/4485
entry: rustfmt --edition=2024
2 changes: 1 addition & 1 deletion .python-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.11.9
3.13.5
3 changes: 3 additions & 0 deletions Brewfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
brew 'librdkafka'

brew 'rustup'
46 changes: 11 additions & 35 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
SHELL=/bin/bash
export RELAY_PYTHON_VERSION := python3
export RELAY_FEATURES :=
RELAY_CARGO_ARGS ?= ${CARGO_ARGS}

Expand Down Expand Up @@ -87,31 +86,27 @@ doc-rust: setup-git ## generate API docs for Rust code

# Style checking

style: style-rust style-python ## check code style
style: style-rust ## check code style
.PHONY: style

style-rust: ## check Rust code style
@rustup component add rustfmt --toolchain stable 2> /dev/null
cargo +stable fmt --all -- --check
.PHONY: style-rust

style-python: setup-venv ## check Python code style
.venv/bin/black --check py tests --exclude '\.eggs|sentry_relay/_lowlevel.*'
.PHONY: style-python

# Linting

lint: lint-rust lint-python ## runt lint on Python and Rust code
lint: lint-rust lint-python ## run lint on Python and Rust code
.PHONY: lint

lint-rust: setup-git ## run lint on Rust code using clippy
@rustup component add clippy --toolchain stable 2> /dev/null
cargo +stable clippy --workspace --all-targets --all-features --no-deps -- -D warnings
.PHONY: lint-rust

lint-python: setup-venv ## run lint on Python code using flake8
.venv/bin/flake8 py tests
.venv/bin/mypy py tests
lint-python: ## run lint on Python code using flake8
.venv/bin/pre-commit run flake8 -a
.venv/bin/pre-commit run mypy -a
.PHONY: lint-python

lint-rust-beta: setup-git ## run lint on Rust using clippy and beta toolchain
Expand All @@ -130,8 +125,8 @@ format-rust: ## format the Rust code
cargo +stable fmt --all
.PHONY: format-rust

format-python: setup-venv ## format the Python code
.venv/bin/black py tests scripts --exclude '\.eggs|sentry_relay/_lowlevel.*'
format-python: ## format the Python code
.venv/bin/pre-commit run black -a
.PHONY: format-python

# Development
Expand All @@ -143,10 +138,12 @@ init-submodules:
@git submodule update --init --recursive
.PHONY: init-submodules

setup-git: .git/hooks/pre-commit init-submodules ## make sure all git configured and all the submodules are fetched
setup-git: init-submodules ## make sure all git configured and all the submodules are fetched
.PHONY: setup-git

setup-venv: .venv/bin/python .venv/python-requirements-stamp ## create a Python virtual environment with development requirements installed
setup-venv: uv.lock ## create a Python virtual environment with development requirements installed
devenv sync
RELAY_DEBUG=1 uv pip install -v -e py
.PHONY: setup-venv

clean-target-dir:
Expand All @@ -155,27 +152,6 @@ clean-target-dir:
fi
.PHONY: clean-target-dir

# Dependencies

.venv/bin/python: Makefile
rm -rf .venv

@# --copies is necessary because OS X make checks the mtime of the symlink
@# target (/usr/local/bin/python), which is always much older than the
@# Makefile, and then proceeds to unconditionally rebuild the venv.
$$RELAY_PYTHON_VERSION -m venv --copies .venv
.venv/bin/pip install -U pip wheel

.venv/python-requirements-stamp: requirements-dev.txt
.venv/bin/pip install -U -r requirements-dev.txt
RELAY_DEBUG=1 .venv/bin/pip install -v --editable py
# Bump the mtime of an empty file.
# Make will re-run 'pip install' if the mtime on requirements-dev.txt is higher again.
touch .venv/python-requirements-stamp

.git/hooks/pre-commit:
@cd .git/hooks && ln -sf ../../scripts/git-precommit-hook pre-commit

help: ## this help
@ awk 'BEGIN {FS = ":.*##"; printf "Usage: make \033[36m<target>\033[0m\n\nTargets:\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-10s\033[0m\t%s\n", $$1, $$2 }' $(MAKEFILE_LIST) | column -s$$'\t' -t
.PHONY: help
Expand Down
Loading
Loading