Files
hatchet/.github/workflows/sdk-python.yml
Matt Kaye 993817b049 [Python] Single listener base class + bug fixes + refactors (#1470)
* fix: register durable steps and workflows separately

* chore: initial copy of pooled listener

* feat: initial generic impl

* feat: use pooled listener for wf run listener

* refactor: move listeners to subdir

* feat: refactor durable event listener

* fix: bug

* feat: share single pooled workflow listener and event listener everywhere

* cruft: rm hatchet fixture

* fix: rebase issue

* feat: remove asyncio api client in favor of sync one

* chore: minor version

* proposal: crazy hack idea to make the workflow run listener work

* fix: sleeps and error handling

* Revert "cruft: rm hatchet fixture"

This reverts commit b75f625e6ccec095e8c4e294d6727db166796411.

* fix: set timeout

* fix: rm pytest-timeout

* fix: rm retry

* fix: use v1 by default

* fix: try removing retry state

* fix: try using async client?

* fix: try running sequentially

* debug: loop

* debug: maybe it's this?

* fix: lint

* fix: re-remove unused fixtures

* fix: lazily create clients in admin client

* fix: default

* fix: lazily initialize dispatcher client

* fix: hint

* fix: no. way.

* feat: add back retries in ci

* fix: clients + imports

* fix: loop scope

* debug: try running skipped tests in ci again

* Revert "debug: try running skipped tests in ci again"

This reverts commit 8d9e18150e5207ee6051d8df8a6fe2a7504c722e.

* fix: rm duped code

* refactor: rename everything as `to_proto`

* refactor: removals of `namespace` being passed around

* fix: task output stupidity

* feat: add deprecation warning

* fix: remove more unused code

* feat: mix sync and async in dag example

* fix: autouse

* fix: more input types

* feat: remove ability to pass in loop

* fix: overload key gen
2025-04-10 08:18:17 -04:00

187 lines
5.1 KiB
YAML

name: python
on:
pull_request:
paths:
- '.github/**'
- 'api/**'
- 'api-contracts/**'
- 'internal/**'
- 'pkg/**'
- 'sdks/python/**'
push:
branches:
- main
paths:
- 'sdks/python/**'
defaults:
run:
working-directory: ./sdks/python
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install Poetry
uses: snok/install-poetry@v1
with:
version: 1.5.1
virtualenvs-create: true
virtualenvs-in-project: true
- name: Install linting tools
run: poetry install --all-extras
- name: Run Black
run: poetry run black . --check --verbose --diff --color
- name: Run Isort
run: poetry run isort . --check-only --diff
- name: Run MyPy
run: poetry run mypy --config-file=pyproject.toml
- name: Run Ruff
run: poetry run ruff check .
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13"]
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- name: Install Protoc
uses: arduino/setup-protoc@v3
with:
version: '25.1'
- name: Install Task
uses: arduino/setup-task@v2
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.21'
- name: Start Docker dependencies
working-directory: .
run: docker compose up -d
- name: Generate
working-directory: .
run: |
export DATABASE_URL="postgresql://hatchet:hatchet@127.0.0.1:5431/hatchet"
go run ./cmd/hatchet-migrate
task generate-go
- name: Setup
working-directory: .
run: |
export SEED_DEVELOPMENT=true
export SERVER_PORT=8080
export SERVER_URL=http://localhost:8080
export SERVER_AUTH_COOKIE_DOMAIN=localhost
export SERVER_AUTH_COOKIE_INSECURE=true
export SERVER_DEFAULT_ENGINE_VERSION=V1
go run ./cmd/hatchet-admin quickstart
go run ./cmd/hatchet-engine --config ./generated/ > engine.log 2>&1 &
go run ./cmd/hatchet-api --config ./generated/ > api.log 2>&1 &
sleep 30
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Display Python version
run: python -c "import sys; print(sys.version)"
- name: Install Poetry
uses: snok/install-poetry@v1
with:
version: 1.5.1
virtualenvs-create: true
virtualenvs-in-project: true
- name: Install dependencies
run: poetry install --no-interaction --all-extras
- name: Generate Env File
working-directory: .
run: |
echo "HATCHET_CLIENT_TOKEN=$(go run ./cmd/hatchet-admin token create --config ./generated/ --tenant-id 707d0855-80ab-4e1f-a156-f1c4546cbf52)" >> $GITHUB_ENV
echo "HATCHET_CLIENT_TLS_ROOT_CA_FILE=../../certs/ca.cert" >> $GITHUB_ENV
echo "HATCHET_CLIENT_WORKER_HEALTHCHECK_ENABLED=True" >> $GITHUB_ENV
- name: Set HATCHET_CLIENT_NAMESPACE
run: |
PYTHON_VERSION=$(python -c "import sys; print(f'py{sys.version_info.major}{sys.version_info.minor}')")
SHORT_SHA=$(git rev-parse --short HEAD)
echo "HATCHET_CLIENT_NAMESPACE=${PYTHON_VERSION}-${SHORT_SHA}" >> $GITHUB_ENV
- name: Run pytest
run: |
echo "Using HATCHET_CLIENT_NAMESPACE: $HATCHET_CLIENT_NAMESPACE"
poetry run pytest -s -vvv --maxfail=5 --capture=no --retries 3 --retry-delay 2
- name: Upload engine logs
if: always()
uses: actions/upload-artifact@v4
with:
name: $HATCHET_CLIENT_NAMESPACE-engine-logs
path: $HATCHET_CLIENT_NAMESPACE-engine.log
- name: Upload API logs
if: always()
uses: actions/upload-artifact@v4
with:
name: $HATCHET_CLIENT_NAMESPACE-api-logs
path: $HATCHET_CLIENT_NAMESPACE-api.log
publish:
runs-on: ubuntu-latest
needs: [lint, test]
if: github.ref == 'refs/heads/main'
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Install Poetry
run: |
pipx install poetry==1.7.1
- name: Run publish.sh script
run: |
CURRENT_PYPI_VERSION=$(pip index versions hatchet-sdk | awk 'NR==1 {gsub(/[()]/,"",$2); print $2}')
NEW_VERSION=$(cat pyproject.toml| grep "^version =" | cut -d '"' -f 2)
if [ "$CURRENT_PYPI_VERSION" == "$NEW_VERSION" ]; then
echo "Version has not changed. Skipping publish."
exit 0
fi
sh publish.sh
env:
POETRY_PYPI_TOKEN_PYPI: ${{ secrets.POETRY_PYPI_TOKEN_PYPI }}