diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml new file mode 100644 index 0000000..542ebf7 --- /dev/null +++ b/.github/workflows/nightly.yml @@ -0,0 +1,52 @@ +name: Nightly (slow tests) + +# Run nightly at 03:00 UTC + on manual dispatch. +# Owns the slow-test lanes that don't fit the PR feedback loop: +# - sitl: pytest -m sitl (gated by ARDUPILOT_SITL_HOST in tests) +# - e2e: pytest -m e2e + e2e_slow against real datasets (when present) +# +# The on-demand SITL workflow lives in .github/workflows/sitl.yml and is unchanged. +on: + schedule: + - cron: "0 3 * * *" + workflow_dispatch: + +jobs: + sitl: + name: SITL marker collection (scaffold — real SITL via sitl.yml) + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: pip + - run: sudo apt-get update -qq && sudo apt-get install -y --no-install-recommends libgl1 libglib2.0-0 + - run: pip install --no-cache-dir -e ".[dev]" + - name: Collect SITL tests (skipped without ARDUPILOT_SITL_HOST) + # In nightly, ARDUPILOT_SITL_HOST is intentionally absent; tests self-skip. + # The on-demand .github/workflows/sitl.yml runs the actual SITL containers. + # This job exists so the -m sitl marker is exercised on a recurring basis + # and a collection regression is caught. + run: python -m pytest tests/ -m sitl --collect-only -q + + e2e: + name: E2E real-flight dataset replay + runs-on: ubuntu-latest + timeout-minutes: 120 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: pip + - run: sudo apt-get update -qq && sudo apt-get install -y --no-install-recommends libgl1 libglib2.0-0 + - run: pip install --no-cache-dir -e ".[dev]" + - name: Run e2e tests (skip when datasets are absent) + # tests/e2e/conftest.py fixtures self-skip tests when their dataset path is missing. + # If no dataset is present in the runner image, the job runs the collection but + # most assertions short-circuit on the skip fixture. + run: python -m pytest tests/ -m "e2e or e2e_slow" -v --tb=short || true + # `|| true` to allow soft-failure during Phase 2 bootstrap; flip to hard-fail in + # Phase 6 when FIXTURE-01 lands a CI-provisioned Azaion dataset.