diff --git a/.github/workflows/integration-federation.yml b/.github/workflows/integration-federation.yml new file mode 100644 index 00000000000..9311394309c --- /dev/null +++ b/.github/workflows/integration-federation.yml @@ -0,0 +1,270 @@ +# SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors +# SPDX-License-Identifier: MIT + +name: Integration Federation + +on: + pull_request: + schedule: + - cron: "5 2 * * *" + +permissions: + contents: read + +concurrency: + group: integration-federation-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + changes: + runs-on: ubuntu-latest-low + + outputs: + src: ${{ steps.changes.outputs.src}} + + steps: + - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + id: changes + continue-on-error: true + with: + filters: | + src: + - '.github/workflows/**' + - 'appinfo/**' + - 'lib/**' + - 'templates/**' + - 'tests/integration/**' + - 'vendor/**' + - 'vendor-bin/**' + - '.php-cs-fixer.dist.php' + - 'composer.json' + - 'composer.lock' + + integration-federation: + runs-on: ubuntu-latest + + needs: changes + if: needs.changes.outputs.src != 'false' + + strategy: + fail-fast: false + matrix: + include: + - test-suite: 'federation' + php-versions: '8.2' + host-server-versions: 'master' + host-spreed-versions: ${{ github.event.pull_request.head.sha }} + host-guests-versions: 'master' + host-circles-versions: 'master' + host-call-summary-bot-versions: 'main' + host-notifications-versions: 'master' + remote-server-versions: 'stable30' + remote-spreed-versions: 'stable30' + remote-guests-versions: 'stable30' + remote-circles-versions: 'stable30' + remote-call-summary-bot-versions: 'main' + remote-notifications-versions: 'stable30' + + services: + oracle: + image: ghcr.io/gvenzl/oracle-xe:11 + + # Provide passwords and other environment variables to container + env: + ORACLE_RANDOM_PASSWORD: true + APP_USER: autotest + APP_USER_PASSWORD: owncloud + + # Forward Oracle port + ports: + - 1521:1521/tcp + + # Provide healthcheck script options for startup + options: >- + --health-cmd healthcheck.sh + --health-interval 10s + --health-timeout 5s + --health-retries 10 + + mysql: + image: ghcr.io/nextcloud/continuous-integration-mysql-8.4:latest + ports: + - 4444:3306/tcp + env: + MYSQL_ROOT_PASSWORD: rootpassword + options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10 + + steps: + - name: Set app env + run: | + # Split and keep last + echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV + + - name: Checkout server - Host + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + path: host + submodules: true + repository: nextcloud/server + ref: ${{ matrix.host-server-versions }} + + - name: Checkout spreed app - Host + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + path: host/apps/spreed + ref: ${{ matrix.host-spreed-versions }} + + - name: Checkout call_summary_bot app - Host + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + repository: nextcloud/call_summary_bot + path: host/apps/call_summary_bot + ref: ${{ matrix.host-call-summary-bot-versions }} + + - name: Checkout circles app - Host + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + repository: nextcloud/circles + path: host/apps/circles + ref: ${{ matrix.host-circles-versions }} + + - name: Checkout guests app - Host + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + repository: nextcloud/guests + path: host/apps/guests + ref: ${{ matrix.host-guests-versions }} + + - name: Checkout notifications app - Host + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + repository: nextcloud/notifications + path: host/apps/notifications + ref: ${{ matrix.host-notifications-versions }} + + - name: Checkout server - Remote + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + path: remote + submodules: true + repository: nextcloud/server + ref: ${{ matrix.remote-server-versions }} + + - name: Checkout spreed app - Remote + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + path: remote/apps/spreed + ref: ${{ matrix.remote-spreed-versions }} + + - name: Checkout call_summary_bot app - Remote + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + repository: nextcloud/call_summary_bot + path: remote/apps/call_summary_bot + ref: ${{ matrix.remote-call-summary-bot-versions }} + + - name: Checkout circles app - Remote + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + repository: nextcloud/circles + path: remote/apps/circles + ref: ${{ matrix.remote-circles-versions }} + + - name: Checkout guests app - Remote + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + repository: nextcloud/guests + path: remote/apps/guests + ref: ${{ matrix.remote-guests-versions }} + + - name: Checkout notifications app - Remote + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + repository: nextcloud/notifications + path: remote/apps/notifications + ref: ${{ matrix.remote-notifications-versions }} + + - name: Set up php ${{ matrix.php-versions }} + uses: shivammathur/setup-php@2e947f1f6932d141d076ca441d0e1e881775e95b # v2 + with: + php-version: ${{ matrix.php-versions }} + # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation + extensions: apcu, bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, mysql, pdo_mysql, oci8, sqlite, pdo_sqlite + coverage: none + ini-file: development + # Temporary workaround for missing pcntl_* in PHP 8.3: ini-values: apc.enable_cli=on + ini-values: apc.enable_cli=on, disable_functions= + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up production dependencies - Host + working-directory: host/apps/${{ env.APP_NAME }} + run: composer i --no-dev + + - name: Set up production dependencies - Remote + working-directory: remote/apps/${{ env.APP_NAME }} + run: composer i --no-dev + + - name: Set up behat dependencies + working-directory: host/apps/${{ env.APP_NAME }}/tests/integration + run: composer i + + - name: Set up Nextcloud - Host + env: + DB_PORT: 1521 + run: | + mkdir host-data + ./occ maintenance:install --verbose --database=oci --database-name=XE --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=autotest --database-pass=owncloud --admin-user admin --admin-pass admin --data-dir=$PWD/host-data + ./occ config:system:set debug --value=true --type=boolean + ./occ config:system:set hashing_default_password --value=true --type=boolean + ./occ config:system:set memcache.local --value="\\OC\\Memcache\\APCu" + ./occ config:system:set memcache.distributed --value="\\OC\\Memcache\\APCu" + ./occ app:enable --force ${{ env.APP_NAME }} + ./occ app:enable --force call_summary_bot + ./occ app:enable --force circles + ./occ app:enable --force guests + ./occ app:enable --force notifications + + - name: Set up Nextcloud - Remote + env: + DB_PORT: 1521 + run: | + mkdir remote-data + ./occ maintenance:install --verbose --database=mysql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin --data-dir=$PWD/remote-data + ./occ config:system:set debug --value=true --type=boolean + ./occ config:system:set hashing_default_password --value=true --type=boolean + ./occ config:system:set memcache.local --value="\\OC\\Memcache\\APCu" + ./occ config:system:set memcache.distributed --value="\\OC\\Memcache\\APCu" + ./occ app:enable --force ${{ env.APP_NAME }} + ./occ app:enable --force call_summary_bot + ./occ app:enable --force circles + ./occ app:enable --force guests + ./occ app:enable --force notifications + + - name: Run integration + working-directory: host/apps/${{ env.APP_NAME }}/tests/integration + run: bash run.sh features/${{ matrix.test-suite }} + + - name: Print logs - Host + if: always() + run: | + cat host-data/nextcloud.log + + - name: Print logs - Remote + if: always() + run: | + cat remote-data/nextcloud.log + + summary: + permissions: + contents: none + runs-on: ubuntu-latest-low + needs: [changes, integration-federation] + + if: always() + + name: integration-federation-summary + + steps: + - name: Summary status + run: if ${{ needs.changes.outputs.src != 'false' && needs.integration-federation.result != 'success' }}; then exit 1; fi