ble-reticulum/.github/workflows
torlando-tech 29313c4104 Add deployment workflow for Raspberry Pi
This workflow automates the deployment of code to multiple Raspberry Pi devices and validates the BLE interface after deployment. It includes setup, deployment, validation, and summary steps.
2025-11-15 19:50:35 -05:00
..
deploy.sh Add deployment workflow for Raspberry Pi 2025-11-15 19:50:35 -05:00
README.md Initial commit: BLE Reticulum interface 2025-10-26 19:14:14 -04:00
release.yml fix(ci): Use gh CLI for atomic release creation 2025-11-10 14:46:22 -05:00
test.yml ci: make tests conditional based on changed files 2025-10-29 12:01:20 -04:00

CI/CD Workflows

This directory contains GitHub Actions and Gitea Actions workflows for automated testing.

Workflows

test.yml - Automated Test Suite

This workflow runs on every push and pull request. It includes two separate jobs that run in parallel:

Job 1: Unit Tests

  • Purpose: Test core fragmentation and prioritization logic
  • Files tested:
    • tests/test_fragmentation.py
    • tests/test_prioritization.py
  • Coverage: BLEFragmentation.py module
  • Matrix: Python 3.8, 3.9, 3.10, 3.11

Job 2: Integration Tests

  • Purpose: Test full BLE stack integration without hardware
  • Files tested: All test files with marker -m "not hardware"
  • Coverage: All src/RNS/Interfaces/ modules
  • Runtime: ~2 minutes per Python version
  • Matrix: Python 3.8, 3.9, 3.10, 3.11
  • Tests included:
    • Error recovery tests
    • Peer interface tests
    • Integration tests
    • Prioritization tests
    • Plus fragmentation unit tests

PR Status Checks

When you create a pull request, you'll see two separate status checks:

✓ Unit Tests (Python 3.8)
✓ Unit Tests (Python 3.9)
✓ Unit Tests (Python 3.10)
✓ Unit Tests (Python 3.11)

✓ Integration Tests (Python 3.8)
✓ Integration Tests (Python 3.9)
✓ Integration Tests (Python 3.10)
✓ Integration Tests (Python 3.11)

Both sets of checks must pass before merging.

Coverage Reports

Coverage reports are uploaded to Codecov for Python 3.11 runs:

  • Unit coverage: Tagged with flags: unit
  • Integration coverage: Tagged with flags: integration

This allows tracking coverage trends separately for unit vs integration tests.

Local Testing

To run the same tests locally that CI runs:

# Unit tests
pytest tests/test_fragmentation.py tests/test_prioritization.py -v \
  --cov=src/RNS/Interfaces/BLEFragmentation.py \
  --cov-report=term-missing

# Integration tests
pytest tests/ -v -m "not hardware" \
  --cov=src/RNS/Interfaces \
  --cov-report=term-missing \
  --tb=short

Why Two Jobs?

Separating unit and integration tests provides several benefits:

  1. Faster Feedback: Unit tests complete quickly (~30s), giving rapid feedback
  2. Clearer Failures: Know immediately if it's a core logic issue or integration problem
  3. Parallel Execution: Both jobs run simultaneously, total time = max(unit, integration)
  4. Separate Coverage: Track unit test coverage separately from integration coverage
  5. Granular Status: See exactly which test category failed in PR checks

Workflow Triggers

Both workflows trigger on:

  • Push to any branch
  • Pull request to any branch

Dependencies

The workflows install:

  • System: libglib2.0-dev, libdbus-1-dev (for BLE D-Bus support)
  • Python: pytest, pytest-asyncio, pytest-cov, pytest-timeout
  • BLE: bleak (BLE client library), bluezero (GATT server), dbus-python
  • Reticulum: rns (required for tests)

Modifying Workflows

To add new tests:

  1. Add test file to tests/ directory
  2. Mark appropriately:
    • Unit tests: Include in unit test job command
    • Integration tests: Will run automatically with -m "not hardware"
    • Hardware tests: Mark with @pytest.mark.hardware to exclude from CI

The workflow will automatically pick up marked integration tests.

Troubleshooting

Workflow not triggering

  • Check that workflow file is in .github/workflows/ (GitHub) or .gitea/workflows/ (Gitea)
  • Ensure YAML syntax is valid
  • Check branch name matches trigger pattern

Tests failing in CI but passing locally

  • Check Python version (CI tests multiple versions)
  • Verify all dependencies are in requirements.txt
  • Check for environment-specific paths or configs

Coverage upload failing

  • This is non-fatal (continue-on-error: true)
  • Usually due to Codecov token issues
  • Tests still pass/fail correctly