mirror of
https://github.com/nextcloud/server.git
synced 2026-10-06 19:42:54 +02:00
Backport of all changes from `master` to migrate from Cypress to Playwright. Assisted-by: ClaudeCode:claude-opus-5 Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
326 lines
11 KiB
YAML
326 lines
11 KiB
YAML
# SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
name: Playwright Tests
|
|
|
|
on:
|
|
pull_request:
|
|
branches:
|
|
- master
|
|
- stable33
|
|
types:
|
|
- opened
|
|
- synchronize
|
|
- reopened
|
|
- ready_for_review
|
|
- labeled
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
gate:
|
|
runs-on: ubuntu-latest-low
|
|
steps:
|
|
- name: Evaluate e2e tests execution conditions
|
|
id: gate-e2e
|
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v8.0.0
|
|
with:
|
|
script: |
|
|
const pr = context.payload.pull_request
|
|
|
|
const hasForceLabel = pr.labels.some((label) => label.name === 'force-e2e-tests')
|
|
const hasToReviewLabel = pr.labels.some((label) => label.name === '3. to review')
|
|
const hasToReleaseLabel = pr.labels.some((label) => label.name === '4. to release')
|
|
|
|
const files = await github.paginate(github.rest.pulls.listFiles, {
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
pull_number: pr.number,
|
|
per_page: 100,
|
|
})
|
|
const playwrightTouched = files.some((file) => file.filename.startsWith('tests/playwright'))
|
|
|
|
if (hasForceLabel || hasToReviewLabel || hasToReleaseLabel || playwrightTouched) {
|
|
return
|
|
} else {
|
|
core.setFailed('Skipping Playwright: draft state, missing labels or no playwright path changes.')
|
|
}
|
|
|
|
playwright-setup:
|
|
timeout-minutes: 15
|
|
name: Playwright setup
|
|
runs-on: ubuntu-latest
|
|
needs: gate
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
submodules: true # for 3rdparty
|
|
- name: Read package.json
|
|
uses: nextcloud-libraries/parse-package-engines-action@122ae05d4257008180a514e1ddeb0c1b9d094bdd # v0.1.0
|
|
id: versions
|
|
- name: Set up node
|
|
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
with:
|
|
node-version: ${{ steps.versions.outputs.node-version }}
|
|
- name: Set up npm
|
|
run: npm i -g 'npm@${{ steps.versions.outputs.package-manager-version }}'
|
|
- name: Install dependencies and build
|
|
run: |
|
|
npm ci
|
|
npm run build --if-present
|
|
- name: Save context
|
|
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
with:
|
|
key: playwright-context-${{ github.run_id }}
|
|
path: ./
|
|
|
|
playwright-tests:
|
|
needs: [gate, playwright-setup]
|
|
timeout-minutes: 60
|
|
name: Playwright tests ${{ matrix.shardIndex }} / ${{ matrix.shardTotal }}
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
shardIndex: [1, 2, 3, 4, 5, 6, 7, 8]
|
|
shardTotal: [8]
|
|
outputs:
|
|
node-version: ${{ steps.versions.outputs.node-version }}
|
|
package-manager-version: ${{ steps.versions.outputs.package-manager-version }}
|
|
|
|
steps:
|
|
- name: Restore context
|
|
id: cache
|
|
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
with:
|
|
key: playwright-context-${{ github.run_id }}
|
|
path: ./
|
|
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
if: steps.cache.outputs.cache-hit != 'true'
|
|
with:
|
|
persist-credentials: false
|
|
submodules: true # for 3rdparty
|
|
|
|
- name: Read package.json
|
|
uses: nextcloud-libraries/parse-package-engines-action@122ae05d4257008180a514e1ddeb0c1b9d094bdd # v0.1.0
|
|
id: versions
|
|
|
|
- name: Set up node
|
|
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
with:
|
|
node-version: ${{ steps.versions.outputs.node-version }}
|
|
|
|
- name: Set up npm
|
|
run: npm i -g 'npm@${{ steps.versions.outputs.package-manager-version }}'
|
|
|
|
- name: Install dependencies and build
|
|
if: steps.cache.outputs.cache-hit != 'true'
|
|
run: |
|
|
npm ci
|
|
npm run build --if-present
|
|
|
|
- name: Install Playwright browsers
|
|
run: npm run playwright:install-ci --if-present
|
|
|
|
- name: Run Playwright tests
|
|
run: npm run playwright -- --shard='${{ matrix.shardIndex }}/${{ matrix.shardTotal }}'
|
|
|
|
- name: Show logs
|
|
if: failure()
|
|
run: |
|
|
for id in $(docker ps -aq); do
|
|
docker container inspect "$id" --format '=== Logs for container {{.Name}} ==='
|
|
docker logs "$id" >> nextcloud.log
|
|
done
|
|
echo '=== Nextcloud server logs ==='
|
|
docker exec nextcloud-e2e-test-server_server cat data/nextcloud.log
|
|
|
|
- name: Upload blob report to GitHub Actions Artifacts
|
|
if: ${{ !cancelled() }}
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: blob-report-${{ matrix.shardIndex }}
|
|
path: blob-report
|
|
retention-days: 1
|
|
|
|
playwright-installer-tests:
|
|
needs: [gate, playwright-setup]
|
|
timeout-minutes: 30
|
|
name: Playwright tests for installer
|
|
runs-on: ubuntu-latest
|
|
|
|
# The installation-wizard tests exercise every supported database backend, so
|
|
# they need reachable database service containers. The Nextcloud container is
|
|
# joined to the GitHub Actions network at startup so it can resolve these by
|
|
# hostname (see tests/playwright/start-nextcloud-server.js).
|
|
services:
|
|
mysql:
|
|
image: mysql:9.7 # zizmor: ignore[unpinned-images]
|
|
ports:
|
|
- '3306/tcp'
|
|
env:
|
|
MYSQL_ROOT_PASSWORD: rootpassword
|
|
MYSQL_USER: nextcloud
|
|
MYSQL_PASSWORD: nextcloud
|
|
MYSQL_DATABASE: nextcloud
|
|
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
|
|
|
|
mariadb:
|
|
image: mariadb:12.3 # zizmor: ignore[unpinned-images]
|
|
ports:
|
|
- '3306/tcp'
|
|
env:
|
|
MARIADB_ROOT_PASSWORD: rootpassword
|
|
MARIADB_USER: nextcloud
|
|
MARIADB_PASSWORD: nextcloud
|
|
MARIADB_DATABASE: nextcloud
|
|
options: --health-cmd="mariadb-admin ping" --health-interval 5s --health-timeout 2s --health-retries 5
|
|
|
|
postgres:
|
|
image: postgres:18 # zizmor: ignore[unpinned-images]
|
|
ports:
|
|
- '5432/tcp'
|
|
env:
|
|
POSTGRES_USER: root
|
|
POSTGRES_PASSWORD: rootpassword
|
|
POSTGRES_DB: nextcloud
|
|
options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5
|
|
|
|
oracle:
|
|
image: ghcr.io/gvenzl/oracle-free:23 # zizmor: ignore[unpinned-images]
|
|
ports:
|
|
- '1521'
|
|
env:
|
|
ORACLE_PASSWORD: oracle
|
|
options: --health-cmd healthcheck.sh --health-interval 20s --health-timeout 10s --health-retries 10
|
|
|
|
steps:
|
|
- name: Restore context
|
|
id: cache
|
|
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
with:
|
|
key: playwright-context-${{ github.run_id }}
|
|
path: ./
|
|
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
if: steps.cache.outputs.cache-hit != 'true'
|
|
with:
|
|
persist-credentials: false
|
|
submodules: true # for 3rdparty
|
|
|
|
- name: Read package.json
|
|
uses: nextcloud-libraries/parse-package-engines-action@122ae05d4257008180a514e1ddeb0c1b9d094bdd # v0.1.0
|
|
id: versions
|
|
|
|
- name: Set up node
|
|
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
with:
|
|
node-version: ${{ steps.versions.outputs.node-version }}
|
|
|
|
- name: Set up npm
|
|
run: npm i -g 'npm@${{ steps.versions.outputs.package-manager-version }}'
|
|
|
|
- name: Install dependencies and build
|
|
if: steps.cache.outputs.cache-hit != 'true'
|
|
run: |
|
|
npm ci
|
|
npm run build --if-present
|
|
|
|
- name: Install Playwright browsers
|
|
run: npm run playwright:install-ci --if-present
|
|
|
|
- name: Run Playwright setup tests
|
|
run: npm run playwright:setup
|
|
env:
|
|
PLAYWRIGHT_SETUP: 'true'
|
|
|
|
- name: Show logs
|
|
if: failure()
|
|
run: |
|
|
for id in $(docker ps -aq); do
|
|
docker container inspect "$id" --format '=== Logs for container {{.Name}} ==='
|
|
docker logs "$id" >> nextcloud.log
|
|
done
|
|
echo '=== Nextcloud server logs ==='
|
|
docker exec nextcloud-e2e-test-server_server cat data/nextcloud.log || true
|
|
|
|
- name: Upload blob report to GitHub Actions Artifacts
|
|
if: ${{ !cancelled() }}
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: blob-report-setup
|
|
path: blob-report
|
|
retention-days: 1
|
|
|
|
merge-reports:
|
|
# Merge reports after playwright-tests, even if some shards have failed
|
|
if: ${{ !cancelled() }}
|
|
needs: [gate, playwright-tests, playwright-installer-tests]
|
|
|
|
runs-on: ubuntu-latest-low
|
|
steps:
|
|
- name: Restore context
|
|
id: cache
|
|
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
with:
|
|
key: playwright-context-${{ github.run_id }}
|
|
path: ./
|
|
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
if: steps.cache.outputs.cache-hit != 'true'
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
if: steps.cache.outputs.cache-hit != 'true'
|
|
with:
|
|
node-version: ${{ needs.playwright-tests.outputs.node-version }}
|
|
|
|
- name: Set up npm
|
|
if: steps.cache.outputs.cache-hit != 'true'
|
|
run: npm i -g 'npm@${{ needs.playwright-tests.outputs.package-manager-version }}'
|
|
|
|
- name: Install dependencies
|
|
if: steps.cache.outputs.cache-hit != 'true'
|
|
run: npm ci
|
|
|
|
- name: Download blob reports from GitHub Actions Artifacts
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
path: all-blob-reports
|
|
pattern: blob-report-*
|
|
merge-multiple: true
|
|
|
|
- name: Merge into HTML Report
|
|
run: npx playwright merge-reports --config tests/playwright/merge.config.ts --reporter html,github ./all-blob-reports
|
|
|
|
- name: Upload HTML report
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: html-report--attempt-${{ github.run_attempt }}
|
|
path: playwright-report
|
|
retention-days: 7
|
|
|
|
- name: Show the logs
|
|
run: |
|
|
echo 'To view the report:'
|
|
echo ' 1. Extract the folder from the zip file'
|
|
echo ' 2. run "npx playwright show-report name-of-my-extracted-playwright-report"'
|
|
|
|
summary:
|
|
permissions:
|
|
contents: none
|
|
runs-on: ubuntu-latest-low
|
|
needs: [gate, playwright-tests, playwright-installer-tests]
|
|
|
|
if: always()
|
|
|
|
name: playwright-test-summary
|
|
|
|
steps:
|
|
- name: Summary status
|
|
run: if ${{ needs.playwright-tests.result != 'success' || needs.playwright-installer-tests.result != 'success' }}; then exit 1; fi
|