Merge pull request #5 from aerospike-community/lyndon/ci-cd #2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | ||
| on: | ||
| pull_request: | ||
| branches: [main] | ||
| push: | ||
| branches: [main] | ||
| concurrency: | ||
| group: ci-${{ github.workflow }}-${{ github.ref }} | ||
| cancel-in-progress: true | ||
| jobs: | ||
| unit: | ||
| name: Unit (Python ${{ matrix.python-version }}) | ||
| runs-on: ubuntu-latest | ||
| strategy: | ||
| fail-fast: false | ||
| matrix: | ||
| python-version: ["3.10", "3.11", "3.12", "3.13"] | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - name: Set up Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: ${{ matrix.python-version }} | ||
| cache: pip | ||
| cache-dependency-path: pyproject.toml | ||
| - name: Install dependencies | ||
| run: | | ||
| python -m pip install --upgrade pip | ||
| pip install -e ".[dev]" | ||
| pip install pre-commit | ||
| - name: Preflight (S0 toolchain contract) | ||
| run: python scripts/preflight.py | ||
| - name: Pre-commit hooks | ||
| run: pre-commit run --all-files | ||
| - name: Unit tests | ||
| run: pytest tests/unit -q | ||
| integration: | ||
| name: Integration (Aerospike CE) | ||
| runs-on: ubuntu-latest | ||
| if: github.event_name == 'push' && github.ref == 'refs/heads/main' | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - name: Set up Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: "3.12" | ||
| cache: pip | ||
| cache-dependency-path: pyproject.toml | ||
| - name: Install dependencies | ||
| run: | | ||
| python -m pip install --upgrade pip | ||
| pip install -e ".[dev]" | ||
| - name: Start Aerospike CE | ||
| working-directory: docker | ||
| run: docker compose up -d | ||
| - name: Wait for Aerospike | ||
| run: | | ||
| for attempt in $(seq 1 30); do | ||
| if python -c " | ||
| import aerospike | ||
| c = aerospike.client({'hosts': [('127.0.0.1', 3000)]}) | ||
| c.connect() | ||
| info = c.info_random_node('namespace/lmcache') | ||
| c.close() | ||
| assert 'nsup-period=120' in info | ||
| "; then | ||
| echo "Aerospike ready after attempt ${attempt}" | ||
| exit 0 | ||
| fi | ||
| echo "Waiting for Aerospike (${attempt}/30)..." | ||
| sleep 2 | ||
| done | ||
| echo "Aerospike did not become ready in time" | ||
| docker compose -f docker/docker-compose.yml logs | ||
| exit 1 | ||
| - name: Integration tests | ||
| env: | ||
| RUN_INTEGRATION: "1" | ||
| run: pytest tests/integration -q | ||
| - name: Stop Aerospike | ||
| if: always() | ||
| working-directory: docker | ||
| run: docker compose down -v | ||