name: pipeline on: pull_request permissions: contents: read pull-requests: write env: # Pinned exact version; conformance-weekly.yaml tracks upstream releases. CONFORMANCE_PKG: "@modelcontextprotocol/conformance@0.2.0-alpha.11" jobs: unit: runs-on: ubuntu-latest strategy: matrix: php: ['8.1', '8.2', '8.3', '8.4', '8.5'] dependencies: ['lowest', 'highest'] symfony-version: [''] include: - symfony-version: '5.4.*' dependencies: 'highest' php: '8.2' - symfony-version: '6.4.*' dependencies: 'highest' php: '8.2' - symfony-version: '7.4.*' dependencies: 'highest' php: '8.4' - symfony-version: '8.0.*' dependencies: 'highest' php: '8.4' env: SYMFONY_REQUIRE: ${{ matrix.symfony-version || '>=6.4' }} steps: - name: Checkout uses: actions/checkout@v7 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} tools: flex coverage: "none" - name: Install Composer uses: "ramsey/composer-install@v4" with: dependency-versions: "${{ matrix.dependencies }}" - name: Tests run: vendor/bin/phpunit --testsuite=unit integration: runs-on: ubuntu-latest strategy: matrix: php: ['8.1', '8.2', '8.3', '8.4', '8.5'] steps: - name: Checkout uses: actions/checkout@v7 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} coverage: "none" - name: Install Composer uses: "ramsey/composer-install@v4" - name: Tests run: vendor/bin/phpunit --testsuite=integration inspector: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v7 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.4' coverage: "none" - name: Setup Node uses: actions/setup-node@v7 with: node-version: '22' - name: Install Composer uses: "ramsey/composer-install@v4" - name: Tests run: vendor/bin/phpunit --testsuite=inspector conformance-server: name: conformance / server (${{ matrix.spec-version }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - spec-version: '2025-11-25' path: '/' baseline: conformance-baseline-2025-11-25.yml - spec-version: '2026-07-28' path: '/' baseline: conformance-baseline-2026-07-28.yml steps: - name: Checkout uses: actions/checkout@v7 - name: Setup Node uses: actions/setup-node@v7 with: node-version: '22' - name: Install Composer uses: "ramsey/composer-install@v4" - name: Start conformance server run: | mkdir -p tests/Conformance/sessions tests/Conformance/logs chmod -R 777 tests/Conformance/sessions tests/Conformance/logs docker compose -f tests/Conformance/Fixtures/docker-compose.yml up -d sleep 5 - name: Run conformance tests working-directory: ./tests/Conformance run: >- npx --yes ${{ env.CONFORMANCE_PKG }} server --url http://localhost:8000${{ matrix.path }} --suite all --spec-version ${{ matrix.spec-version }} --expected-failures ${{ matrix.baseline }} - name: Show logs on failure if: failure() run: | echo "=== Docker Compose Logs ===" docker compose -f tests/Conformance/Fixtures/docker-compose.yml logs echo "" echo "=== Conformance Log ===" cat tests/Conformance/logs/conformance.log 2>/dev/null || echo "No conformance log found" echo "" echo "=== Test Results (first failed test) ===" find tests/Conformance/results -name "checks.json" 2>/dev/null | head -3 | while read f; do echo "--- $f ---" cat "$f" echo "" done || echo "No results found" echo "" echo "=== Directory permissions ===" ls -la tests/Conformance/ ls -la tests/Conformance/logs/ 2>/dev/null || echo "logs dir issue" ls -la tests/Conformance/sessions/ 2>/dev/null || echo "sessions dir issue" - name: Cleanup if: always() run: docker compose -f tests/Conformance/Fixtures/docker-compose.yml down conformance-client: name: conformance / client (${{ matrix.spec-version }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - spec-version: '2025-11-25' baseline: conformance-baseline-2025-11-25.yml - spec-version: '2026-07-28' baseline: conformance-baseline-2026-07-28.yml steps: - name: Checkout uses: actions/checkout@v7 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.4' coverage: "none" - name: Setup Node uses: actions/setup-node@v7 with: node-version: '22' - name: Install Composer uses: "ramsey/composer-install@v4" - name: Create log directory run: mkdir -p tests/Conformance/logs - name: Run client conformance tests working-directory: ./tests/Conformance run: >- npx --yes ${{ env.CONFORMANCE_PKG }} client --command "php ${{ github.workspace }}/tests/Conformance/client.php" --suite all --spec-version ${{ matrix.spec-version }} --expected-failures ${{ matrix.baseline }} - name: Show logs on failure if: failure() run: | echo "=== Client Conformance Log ===" cat tests/Conformance/logs/client-conformance.log 2>/dev/null || echo "No client conformance log found" echo "" echo "=== Test Results ===" find tests/Conformance/results -name "checks.json" 2>/dev/null | head -3 | while read f; do echo "--- $f ---" cat "$f" echo "" done || echo "No results found" qa: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v7 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.1' coverage: "none" - name: Composer Validation run: composer validate --strict - name: Install Composer uses: "ramsey/composer-install@v4" - name: Code Style PHP run: vendor/bin/php-cs-fixer fix --dry-run - name: PHPStan run: vendor/bin/phpstan analyse # Only the phpDocumentor half: this job is PHP-only, and the Zensical # guides are built (strictly) by the Documentation workflow. - name: Documentation run: make docs-api