d8ef50732f
Backups now record each table's structure in the dump manifest. The full restore creates tables that do not exist on the new instance (left behind by apps that were removed or are switched off), lists all problems at once, and no longer stops on apps that are missing. Foreign keys are not checked while rows are loaded in name order, and checked again before the restore commits (PostgreSQL: dropped and added back in the transaction). --install-apps installs or enables the apps that were enabled at backup time; --skip-missing-tables leaves out tables of older backups whose structure is unknown. nextcloud-aio is never required. backup:target:add without a key points to backup:key:import, and says that connecting can take a while. Removing a location drops its cached index; a migration removes the cache of locations that are gone. The full-restore test now also runs on PostgreSQL with Mail (foreign keys) and a disabled app.
109 lines
4.2 KiB
YAML
109 lines
4.2 KiB
YAML
# 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
|
|
with:
|
|
persist-credentials: false
|
|
- 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
|
|
with:
|
|
persist-credentials: false
|
|
- 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
|
|
with:
|
|
persist-credentials: false
|
|
- 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
|
|
with:
|
|
persist-credentials: false
|
|
- name: Round trip against S3 and SFTP
|
|
run: tests/integration/targets-matrix.sh
|
|
|
|
integration-user:
|
|
# Per-user backup/restore via user_migration (occ backup:user:backup / backup:user:restore),
|
|
# an optional dependency installed from the app store. It calls user_migration's internal
|
|
# UserMigrationService, whose API can change between Nextcloud versions, so this runs on every
|
|
# supported version (not the database, which the main integration job already covers).
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
nextcloud: ['32', '33', '34', '35']
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- 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:${{ matrix.nextcloud }}-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 on Nextcloud ${{ matrix.nextcloud }}
|
|
run: tests/integration/user-roundtrip.sh "docker exec -u www-data ngbu" /var/www/html/data
|
|
|
|
integration-full-restore:
|
|
# Disaster recovery (occ backup:restore:full) on a SECOND, fresh Nextcloud instance that
|
|
# never saw the first one, sharing only the backup location. Does not depend on the database
|
|
# beyond what the main integration job already covers, so this runs once, on one NC version.
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- name: Full restore round trip
|
|
run: tests/integration/full-restore-roundtrip.sh 35-apache
|
|
- name: Full restore round trip on PostgreSQL, with Mail (foreign keys) and a disabled app
|
|
run: tests/integration/full-restore-roundtrip.sh 35-apache pgsql
|