# SPDX-FileCopyrightText: 2026 Dillard Blom # SPDX-License-Identifier: AGPL-3.0-or-later name: CI on: push: pull_request: permissions: contents: read jobs: unit: runs-on: ubuntu-latest strategy: matrix: php: ['8.2', '8.3', '8.4'] steps: - uses: actions/checkout@v4 - uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} extensions: sodium, zip coverage: none - run: composer install --no-interaction --no-progress - run: vendor/bin/phpunit -c tests/phpunit.xml psalm: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: shivammathur/setup-php@v2 with: php-version: '8.2' extensions: sodium, zip coverage: none - run: composer install --no-interaction --no-progress - run: composer psalm integration: # Full round trip (key, kit, location, backup, incremental, restore modes, database dump and # restore, retention, trash) on a fresh Nextcloud per version and database. runs-on: ubuntu-latest strategy: fail-fast: false matrix: nextcloud: ['32', '33', '34', '35'] database: ['sqlite', 'mariadb', 'pgsql'] steps: - uses: actions/checkout@v4 - name: Round trip on Nextcloud ${{ matrix.nextcloud }} / ${{ matrix.database }} run: tests/integration/matrix.sh "${{ matrix.nextcloud }}" "${{ matrix.database }}" integration-targets: # Same round trip, but through the real S3 (s3mock) and SFTP backends instead of a local # path, so files_external's AmazonS3/SFTP backend and auth classes are actually exercised. # Backend correctness does not depend on the Nextcloud version or database, so this runs once. runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Round trip against S3 and SFTP run: tests/integration/targets-matrix.sh integration-user: # Per-user backup/restore via user_migration (occ backup:backup:user / backup:restore:user), # an optional dependency installed from the app store. Does not depend on the Nextcloud # version or database beyond what the main integration job already covers, so this runs once. runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up a fresh Nextcloud instance run: | docker run -d --name ngbu -e SQLITE_DATABASE=nextcloud -e NEXTCLOUD_ADMIN_USER=admin \ -e NEXTCLOUD_ADMIN_PASSWORD=admin-user-roundtrip -e NEXTCLOUD_TRUSTED_DOMAINS=localhost \ -v "$PWD:/var/www/html/custom_apps/ng_backup:ro" nextcloud:35-apache for i in $(seq 1 90); do docker exec -u www-data ngbu php occ status 2>/dev/null | grep -q "installed: true" && break; sleep 4; done docker exec ngbu chown www-data:www-data /var/www/html/custom_apps - name: Per-user backup/restore round trip run: tests/integration/user-roundtrip.sh "docker exec -u www-data ngbu" /var/www/html/data