From 0cc64aaea26876b7fba38bc723e6911ba6913b4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= <323649642+oc-tmueller@users.noreply.github.com> Date: Thu, 22 Oct 2026 22:30:09 +0200 Subject: [PATCH 1/5] ci: run ownCloud core's acceptance tests against the image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each release line builds its amd64 image once and runs core's tests/acceptance/run.sh from the release's -qa tarball against it, with MariaDB and the testing app: the @smokeTest API subset plus the CLI suite on every push and PR, and the full API suite weekly, on manual runs and on PRs labelled full-acceptance. Known failures are listed per release in .github/acceptance/expected-failures-*.md. The build job, which publishes, now waits for these tests. Co-Authored-By: Claude Opus 5.5 Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com> --- .../expected-failures-10.16.6-full.md | 4 + .../expected-failures-10.16.6-smoke.md | 4 + .../expected-failures-11.0.1-full.md | 4 + .../expected-failures-11.0.1-smoke.md | 4 + .github/acceptance/run-part.sh | 73 ++++++++ .github/workflows/acceptance.yml | 161 ++++++++++++++++++ .github/workflows/main.yml | 35 +++- 7 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 .github/acceptance/expected-failures-10.16.6-full.md create mode 100644 .github/acceptance/expected-failures-10.16.6-smoke.md create mode 100644 .github/acceptance/expected-failures-11.0.1-full.md create mode 100644 .github/acceptance/expected-failures-11.0.1-smoke.md create mode 100755 .github/acceptance/run-part.sh create mode 100644 .github/workflows/acceptance.yml diff --git a/.github/acceptance/expected-failures-10.16.6-full.md b/.github/acceptance/expected-failures-10.16.6-full.md new file mode 100644 index 0000000..1ef3309 --- /dev/null +++ b/.github/acceptance/expected-failures-10.16.6-full.md @@ -0,0 +1,4 @@ +# Scenarios of ownCloud core 10.16.6's acceptance tests that are expected to fail against this +# image (full run). run.sh fails the job on any other failure, and on a listed +# scenario that passes. One entry per line, as in core's own lists: +# - [apiSuite/file.feature:12](https://github.com/owncloud/core/blob/v10.16.6/tests/acceptance/features/apiSuite/file.feature#L12) diff --git a/.github/acceptance/expected-failures-10.16.6-smoke.md b/.github/acceptance/expected-failures-10.16.6-smoke.md new file mode 100644 index 0000000..0b49abf --- /dev/null +++ b/.github/acceptance/expected-failures-10.16.6-smoke.md @@ -0,0 +1,4 @@ +# Scenarios of ownCloud core 10.16.6's acceptance tests that are expected to fail against this +# image (smoke run). run.sh fails the job on any other failure, and on a listed +# scenario that passes. One entry per line, as in core's own lists: +# - [apiSuite/file.feature:12](https://github.com/owncloud/core/blob/v10.16.6/tests/acceptance/features/apiSuite/file.feature#L12) diff --git a/.github/acceptance/expected-failures-11.0.1-full.md b/.github/acceptance/expected-failures-11.0.1-full.md new file mode 100644 index 0000000..7e96327 --- /dev/null +++ b/.github/acceptance/expected-failures-11.0.1-full.md @@ -0,0 +1,4 @@ +# Scenarios of ownCloud core 11.0.1's acceptance tests that are expected to fail against this +# image (full run). run.sh fails the job on any other failure, and on a listed +# scenario that passes. One entry per line, as in core's own lists: +# - [apiSuite/file.feature:12](https://github.com/owncloud/core/blob/v11.0.1/tests/acceptance/features/apiSuite/file.feature#L12) diff --git a/.github/acceptance/expected-failures-11.0.1-smoke.md b/.github/acceptance/expected-failures-11.0.1-smoke.md new file mode 100644 index 0000000..189bbed --- /dev/null +++ b/.github/acceptance/expected-failures-11.0.1-smoke.md @@ -0,0 +1,4 @@ +# Scenarios of ownCloud core 11.0.1's acceptance tests that are expected to fail against this +# image (smoke run). run.sh fails the job on any other failure, and on a listed +# scenario that passes. One entry per line, as in core's own lists: +# - [apiSuite/file.feature:12](https://github.com/owncloud/core/blob/v11.0.1/tests/acceptance/features/apiSuite/file.feature#L12) diff --git a/.github/acceptance/run-part.sh b/.github/acceptance/run-part.sh new file mode 100755 index 0000000..fa4060f --- /dev/null +++ b/.github/acceptance/run-part.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +# Run one part of ownCloud core's acceptance tests against a server image. +# +# usage: run-part.sh +# image server image under test, e.g. owncloud/server:test +# php PHP version of the test runner (owncloudci/php:), 7.4 or 8.3 +# type suite type for run.sh: api or cli +# part part to run, 1..parts (run.sh --part) +# tags Behat tag filter +# +# environment: +# QA_DIR extracted owncloud-complete-*-qa tarball with Behat installed +# TESTING_DIR the owncloud/testing app +# EXPECTED_FAILURES_FILE optional, a run.sh expected-failures list +# LOG_DIR where to write the server and database logs +set -uo pipefail + +image=$1 php=$2 type=$3 part=$4 parts=$5 tags=$6 +: "${QA_DIR:?}" "${TESTING_DIR:?}" "${LOG_DIR:?}" +net=acceptance db=acceptance-db srv=acceptance-server +mkdir -p "${LOG_DIR}" + +cleanup() { + docker logs "${srv}" >"${LOG_DIR}/server.log" 2>&1 + docker logs "${db}" >"${LOG_DIR}/database.log" 2>&1 + docker rm -f "${srv}" "${db}" >/dev/null 2>&1 + docker network rm "${net}" >/dev/null 2>&1 +} +trap cleanup EXIT + +docker network create "${net}" >/dev/null + +docker run -d --name "${db}" --network "${net}" \ + -e MARIADB_ROOT_PASSWORD=owncloud -e MARIADB_DATABASE=owncloud \ + -e MARIADB_USER=owncloud -e MARIADB_PASSWORD=owncloud \ + mariadb:10.11 --max-allowed-packet=128M --innodb-log-file-size=64M >/dev/null +for _ in $(seq 60); do + docker exec "${db}" healthcheck.sh --connect --innodb_initialized >/dev/null 2>&1 && break + sleep 2 +done + +docker run -d --name "${srv}" --network "${net}" \ + -e OWNCLOUD_DOMAIN="${srv}:8080" -e OWNCLOUD_TRUSTED_DOMAINS="${srv},localhost" \ + -e OWNCLOUD_DB_TYPE=mysql -e OWNCLOUD_DB_HOST="${db}" -e OWNCLOUD_DB_NAME=owncloud \ + -e OWNCLOUD_DB_USERNAME=owncloud -e OWNCLOUD_DB_PASSWORD=owncloud \ + -e OWNCLOUD_ADMIN_USERNAME=admin -e OWNCLOUD_ADMIN_PASSWORD=admin \ + "${image}" >/dev/null +# the image has no HEALTHCHECK; the entrypoint logs this once installation is done +for _ in $(seq 120); do + docker logs "${srv}" 2>&1 | grep -q 'Starting apache daemon' && break + sleep 3 +done +sleep 3 + +docker cp "${TESTING_DIR}" "${srv}:/var/www/owncloud/apps/testing" +docker exec -u 0 "${srv}" chown -R www-data:root /var/www/owncloud/apps/testing +docker exec "${srv}" occ app:enable testing +docker exec "${srv}" occ status + +expected=() +if [[ -n "${EXPECTED_FAILURES_FILE:-}" ]]; then + expected=(-v "${EXPECTED_FAILURES_FILE}:/expected-failures.md:ro" -e EXPECTED_FAILURES_FILE=/expected-failures.md) +fi + +docker run --rm --network "${net}" -v "${QA_DIR}:/src" -w /src "${expected[@]}" \ + -e TEST_SERVER_URL="http://${srv}:8080" \ + -e ALT1_USER_PASSWORD='AaBb2Cc3Dd!' -e ALT2_USER_PASSWORD='AaBb2Cc4Dd!' \ + -e ALT3_USER_PASSWORD='AaBb2Cc5Dd!' -e ALT4_USER_PASSWORD='AaBb2Cc6Dd!' \ + -e ALTERNATE_ADMIN_PASSWORD='AaBb2Cc9D!' -e PUBLIC_LINK_SHARE_PASSWORD='AaBb2Cc3d!' \ + -e REGULAR_USER_PASSWORD='AaBb2Cc7Dd!' -e SUB_ADMIN_PASSWORD='AaBb2Cc8Dd!' \ + -e PLAIN_OUTPUT=true \ + "owncloudci/php:${php}" \ + bash tests/acceptance/run.sh --remote --type "${type}" --tags "${tags}" --part "${part}" "${parts}" diff --git a/.github/workflows/acceptance.yml b/.github/workflows/acceptance.yml new file mode 100644 index 0000000..be71300 --- /dev/null +++ b/.github/workflows/acceptance.yml @@ -0,0 +1,161 @@ +name: Acceptance Tests + +# Runs ownCloud core's acceptance tests (tests/acceptance/run.sh from the +# release's -qa tarball) against the image built from this repository. +on: + workflow_call: + inputs: + version: + description: "ownCloud release, e.g. 11.0.1" + required: true + type: string + base: + description: "Build context, e.g. v24.04" + required: true + type: string + tarball: + description: "owncloud-complete release tarball" + required: true + type: string + qa-sha256: + description: "sha256 of the matching -qa tarball" + required: true + type: string + php: + description: "PHP version of the test runner image owncloudci/php" + required: true + type: string + full: + description: "Run the full API suite instead of the @smokeTest subset" + required: false + type: boolean + default: false + +env: + IMAGE: owncloud/server:acceptance + # owncloud/testing at a commit that supports ownCloud 10 and 11 and PHP 7.4 to 8.3; + # its last release predates PHP 8.3 + TESTING_APP_COMMIT: 5875b15b91b4ba154dcee143bc67907229428a40 + +jobs: + plan: + runs-on: ubuntu-latest + outputs: + suites: ${{ steps.suites.outputs.suites }} + steps: + - id: suites + env: + FULL: ${{ inputs.full }} + run: | + base='~@skip&&~@skipOnDockerContainerTesting&&~@federation-app-required' + if [ "${FULL}" = true ]; then + api_parts=10 api_tags="${base}" + else + api_parts=2 api_tags="@smokeTest&&${base}" + fi + cli_parts=2 + suites=$( + { for p in $(seq "${api_parts}"); do jq -nc --arg t "${api_tags}" --argjson p "$p" --argjson n "${api_parts}" '{type: "api", part: $p, parts: $n, tags: $t}'; done + for p in $(seq "${cli_parts}"); do jq -nc --arg t "${base}" --argjson p "$p" --argjson n "${cli_parts}" '{type: "cli", part: $p, parts: $n, tags: $t}'; done + } | jq -sc . + ) + echo "suites=${suites}" >> "$GITHUB_OUTPUT" + + image: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1 + + - name: Build image + uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0 + with: + context: ${{ inputs.base }} + file: ${{ inputs.base }}/Dockerfile.multiarch + platforms: linux/amd64 + build-args: | + TARBALL_URL=${{ inputs.tarball }} + tags: ${{ env.IMAGE }} + outputs: type=docker,dest=${{ runner.temp }}/image.tar + + - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 + with: + name: acceptance-image-${{ inputs.version }} + path: ${{ runner.temp }}/image.tar + retention-days: 1 + compression-level: 1 + + tests: + name: ${{ matrix.suite.type }} ${{ matrix.suite.part }}/${{ matrix.suite.parts }} + needs: [plan, image] + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + suite: ${{ fromJSON(needs.plan.outputs.suites) }} + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 + with: + name: acceptance-image-${{ inputs.version }} + path: ${{ runner.temp }} + + - name: Load image + run: docker load -i "${RUNNER_TEMP}/image.tar" && rm "${RUNNER_TEMP}/image.tar" + + - name: Fetch the -qa tarball + env: + TARBALL: ${{ inputs.tarball }} + QA_SHA256: ${{ inputs.qa-sha256 }} + run: | + qa="${TARBALL%.tar.bz2}-qa.tar.bz2" + curl -sSfL --retry 3 -o "${RUNNER_TEMP}/qa.tar.bz2" "${qa}" + echo "${QA_SHA256} ${RUNNER_TEMP}/qa.tar.bz2" | sha256sum -c + mkdir "${RUNNER_TEMP}/qa" + tar -xjf "${RUNNER_TEMP}/qa.tar.bz2" -C "${RUNNER_TEMP}/qa" --strip-components 1 + # the release tarball ships its scripts 0644, and run.sh calls + # lint-expected-failures.sh directly + chmod +x "${RUNNER_TEMP}"/qa/tests/acceptance/*.sh + + - name: Install Behat + env: + VERSION: ${{ inputs.version }} + PHP: ${{ inputs.php }} + # symfony/yaml 5.4.52 caps YAML collection aliases at 128, which the + # 10.16 behat.yml exceeds; Composer's advisory check blocks the older releases + run: | + mkdir -p "${RUNNER_TEMP}/qa/vendor-bin/behat" + curl -sSfL --retry 3 -o "${RUNNER_TEMP}/qa/vendor-bin/behat/composer.json" \ + "https://raw.githubusercontent.com/owncloud/core/v${VERSION}/vendor-bin/behat/composer.json" + docker run --rm -v "${RUNNER_TEMP}/qa:/src" -w /src/vendor-bin/behat "owncloudci/php:${PHP}" \ + bash -c "composer config audit.block-insecure false && composer require --no-update 'symfony/yaml:^5.4 <5.4.52' && composer install --no-progress" + + - name: Fetch the testing app + run: | + mkdir "${RUNNER_TEMP}/testing" + curl -sSfL --retry 3 "https://github.com/owncloud/testing/archive/${TESTING_APP_COMMIT}.tar.gz" \ + | tar -xz -C "${RUNNER_TEMP}/testing" --strip-components 1 + + - name: Run tests + env: + PHP: ${{ inputs.php }} + TYPE: ${{ matrix.suite.type }} + PART: ${{ matrix.suite.part }} + PARTS: ${{ matrix.suite.parts }} + TAGS: ${{ matrix.suite.tags }} + EXPECTED: .github/acceptance/expected-failures-${{ inputs.version }}-${{ case(inputs.full, 'full', 'smoke') }}.md + run: | + export QA_DIR="${RUNNER_TEMP}/qa" TESTING_DIR="${RUNNER_TEMP}/testing" LOG_DIR="${RUNNER_TEMP}/logs" + export EXPECTED_FAILURES_FILE="${GITHUB_WORKSPACE}/${EXPECTED}" + .github/acceptance/run-part.sh "${IMAGE}" "${PHP}" "${TYPE}" "${PART}" "${PARTS}" "${TAGS}" + + - name: Upload server logs + if: failure() + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 + with: + name: acceptance-logs-${{ inputs.version }}-${{ matrix.suite.type }}-${{ matrix.suite.part }} + path: ${{ runner.temp }}/logs + retention-days: 7 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2708f20..43ec025 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,15 +5,48 @@ on: branches: [master] tags: ["*"] pull_request: + # labeled: adding the full-acceptance label starts a full acceptance run + types: [opened, synchronize, reopened, labeled] schedule: - cron: 0 0 * * 0 + workflow_dispatch: jobs: lint: uses: owncloud-docker/ubuntu/.github/workflows/lint-editorconfig.yml@master - build: + acceptance: + name: acceptance (${{ matrix.release.version }}) needs: lint + uses: ./.github/workflows/acceptance.yml + with: + version: ${{ matrix.release.version }} + base: ${{ matrix.release.base }} + tarball: ${{ matrix.release.tarball }} + qa-sha256: ${{ matrix.release.qa-sha256 }} + php: ${{ matrix.release.php }} + # The weekly and manual runs, and PRs labelled full-acceptance, run the full + # API suite; everything else runs its @smokeTest subset. + full: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || contains(github.event.pull_request.labels.*.name, 'full-acceptance') }} + + strategy: + fail-fast: false + matrix: + release: + - version: 10.16.6 + tarball: https://github.com/owncloud/core/releases/download/v10.16.6/owncloud-complete-20261006.tar.bz2 + qa-sha256: 5b1bfa2ffc9b0156bf1cee446e56744883b69415948f634baf2bfa4c2d0ea0df + base: v22.04 + php: "7.4" + - version: 11.0.1 + tarball: https://github.com/owncloud/core/releases/download/v11.0.1/owncloud-complete-20260925.tar.bz2 + qa-sha256: 932006415aa75d7cc6161594997dab88cb1cef1960c62eef79d45436700942dc + base: v24.04 + php: "8.3" + + build: + # nothing is published unless the acceptance tests of both release lines pass + needs: [lint, acceptance] uses: owncloud-docker/ubuntu/.github/workflows/docker-build.yml@master with: docker-repo-name: owncloud/${{ github.event.repository.name }} From f64384e023761de901ecfd79a4e859196b637fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= <323649642+oc-tmueller@users.noreply.github.com> Date: Thu, 22 Oct 2026 22:34:05 +0200 Subject: [PATCH 2/5] ci: fail fast on acceptance setup errors and ignore unrelated labels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Capture the server logs before matching them (grep -q under pipefail can fail the pipeline), stop when MariaDB, the server or the testing app does not come up, re-run CI only for the full-acceptance label, and cancel a superseded PR run. Co-Authored-By: Claude Opus 5.5 Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com> --- .github/acceptance/run-part.sh | 21 ++++++++++++++------- .github/workflows/main.yml | 9 ++++++++- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/.github/acceptance/run-part.sh b/.github/acceptance/run-part.sh index fa4060f..219102d 100755 --- a/.github/acceptance/run-part.sh +++ b/.github/acceptance/run-part.sh @@ -34,10 +34,12 @@ docker run -d --name "${db}" --network "${net}" \ -e MARIADB_ROOT_PASSWORD=owncloud -e MARIADB_DATABASE=owncloud \ -e MARIADB_USER=owncloud -e MARIADB_PASSWORD=owncloud \ mariadb:10.11 --max-allowed-packet=128M --innodb-log-file-size=64M >/dev/null +ready=false for _ in $(seq 60); do - docker exec "${db}" healthcheck.sh --connect --innodb_initialized >/dev/null 2>&1 && break + docker exec "${db}" healthcheck.sh --connect --innodb_initialized >/dev/null 2>&1 && ready=true && break sleep 2 done +[[ "${ready}" == true ]] || { echo "MariaDB did not become ready" >&2; exit 1; } docker run -d --name "${srv}" --network "${net}" \ -e OWNCLOUD_DOMAIN="${srv}:8080" -e OWNCLOUD_TRUSTED_DOMAINS="${srv},localhost" \ @@ -45,17 +47,22 @@ docker run -d --name "${srv}" --network "${net}" \ -e OWNCLOUD_DB_USERNAME=owncloud -e OWNCLOUD_DB_PASSWORD=owncloud \ -e OWNCLOUD_ADMIN_USERNAME=admin -e OWNCLOUD_ADMIN_PASSWORD=admin \ "${image}" >/dev/null -# the image has no HEALTHCHECK; the entrypoint logs this once installation is done +# the image has no HEALTHCHECK; the entrypoint logs this once installation is done. +# Capture the logs first: under pipefail, grep -q closing the pipe early can fail it. +ready=false for _ in $(seq 120); do - docker logs "${srv}" 2>&1 | grep -q 'Starting apache daemon' && break + logs=$(docker logs "${srv}" 2>&1) + [[ "${logs}" == *'Starting apache daemon'* ]] && ready=true && break sleep 3 done +[[ "${ready}" == true ]] || { echo "ownCloud server did not start" >&2; exit 1; } sleep 3 -docker cp "${TESTING_DIR}" "${srv}:/var/www/owncloud/apps/testing" -docker exec -u 0 "${srv}" chown -R www-data:root /var/www/owncloud/apps/testing -docker exec "${srv}" occ app:enable testing -docker exec "${srv}" occ status +docker cp "${TESTING_DIR}" "${srv}:/var/www/owncloud/apps/testing" && + docker exec -u 0 "${srv}" chown -R www-data:root /var/www/owncloud/apps/testing && + docker exec "${srv}" occ app:enable testing && + docker exec "${srv}" occ status || + { echo "installing the testing app failed" >&2; exit 1; } expected=() if [[ -n "${EXPECTED_FAILURES_FILE:-}" ]]; then diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 43ec025..bfef233 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,8 +11,14 @@ on: - cron: 0 0 * * 0 workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: lint: + # every other job needs lint, so this also keeps unrelated labels from re-running CI + if: github.event.action != 'labeled' || github.event.label.name == 'full-acceptance' uses: owncloud-docker/ubuntu/.github/workflows/lint-editorconfig.yml@master acceptance: @@ -26,7 +32,8 @@ jobs: qa-sha256: ${{ matrix.release.qa-sha256 }} php: ${{ matrix.release.php }} # The weekly and manual runs, and PRs labelled full-acceptance, run the full - # API suite; everything else runs its @smokeTest subset. + # API suite; everything else runs its @smokeTest subset. The CLI suite always + # runs in full. full: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || contains(github.event.pull_request.labels.*.name, 'full-acceptance') }} strategy: From 3e872a6a9c124484532311d15d0ed778ed1e40fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= <323649642+oc-tmueller@users.noreply.github.com> Date: Thu, 22 Oct 2026 22:36:34 +0200 Subject: [PATCH 3/5] ci: drop the label trigger and concurrency group MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A workflow-level concurrency group let an unrelated label cancel a PR's real run and left skipped checks that branch protection treats as passing, and on master it could cancel pending publish runs. Full runs now come only from the weekly schedule and manual runs. The server readiness loop also stops as soon as the container exits. Co-Authored-By: Claude Opus 5.5 Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com> --- .github/acceptance/run-part.sh | 1 + .github/workflows/main.yml | 15 +++------------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/.github/acceptance/run-part.sh b/.github/acceptance/run-part.sh index 219102d..af53ee5 100755 --- a/.github/acceptance/run-part.sh +++ b/.github/acceptance/run-part.sh @@ -53,6 +53,7 @@ ready=false for _ in $(seq 120); do logs=$(docker logs "${srv}" 2>&1) [[ "${logs}" == *'Starting apache daemon'* ]] && ready=true && break + [[ "$(docker inspect -f '{{.State.Running}}' "${srv}")" == true ]] || break sleep 3 done [[ "${ready}" == true ]] || { echo "ownCloud server did not start" >&2; exit 1; } diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bfef233..eb02c02 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,20 +5,12 @@ on: branches: [master] tags: ["*"] pull_request: - # labeled: adding the full-acceptance label starts a full acceptance run - types: [opened, synchronize, reopened, labeled] schedule: - cron: 0 0 * * 0 workflow_dispatch: -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: ${{ github.event_name == 'pull_request' }} - jobs: lint: - # every other job needs lint, so this also keeps unrelated labels from re-running CI - if: github.event.action != 'labeled' || github.event.label.name == 'full-acceptance' uses: owncloud-docker/ubuntu/.github/workflows/lint-editorconfig.yml@master acceptance: @@ -31,10 +23,9 @@ jobs: tarball: ${{ matrix.release.tarball }} qa-sha256: ${{ matrix.release.qa-sha256 }} php: ${{ matrix.release.php }} - # The weekly and manual runs, and PRs labelled full-acceptance, run the full - # API suite; everything else runs its @smokeTest subset. The CLI suite always - # runs in full. - full: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || contains(github.event.pull_request.labels.*.name, 'full-acceptance') }} + # The weekly and manual runs run the full API suite; pushes and PRs run its + # @smokeTest subset. The CLI suite always runs in full. + full: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} strategy: fail-fast: false From 03d6d1896b1a11e53d1d17b47757b6f348fa6cc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= <323649642+oc-tmueller@users.noreply.github.com> Date: Fri, 23 Oct 2026 09:53:01 +0200 Subject: [PATCH 4/5] ci: list the known acceptance failures and skip @local_storage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The smoke lists hold the CLI failures this PR's first run found on the current images. The full lists add API scenarios that failed in a local full run and again on their own against the published images. @local_storage scenarios are skipped: uploads into a freshly created local mount get 423 Locked, and which ones fail varies from run to run. Co-Authored-By: Claude Opus 5.5 Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com> --- .../expected-failures-10.16.6-full.md | 50 ++++++++++++++++++- .../expected-failures-10.16.6-smoke.md | 23 ++++++++- .../expected-failures-11.0.1-full.md | 47 ++++++++++++++++- .../expected-failures-11.0.1-smoke.md | 22 +++++++- .github/workflows/acceptance.yml | 5 +- 5 files changed, 142 insertions(+), 5 deletions(-) diff --git a/.github/acceptance/expected-failures-10.16.6-full.md b/.github/acceptance/expected-failures-10.16.6-full.md index 1ef3309..f13d246 100644 --- a/.github/acceptance/expected-failures-10.16.6-full.md +++ b/.github/acceptance/expected-failures-10.16.6-full.md @@ -1,4 +1,52 @@ # Scenarios of ownCloud core 10.16.6's acceptance tests that are expected to fail against this # image (full run). run.sh fails the job on any other failure, and on a listed # scenario that passes. One entry per line, as in core's own lists: -# - [apiSuite/file.feature:12](https://github.com/owncloud/core/blob/v10.16.6/tests/acceptance/features/apiSuite/file.feature#L12) +# - [apiSuite/file.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSuite/file.feature#L12) + +## CLI + +# Found in this repository's CI. cliExternalStorage needs a second ownCloud server +# to mount over WebDAV; the others depend on how the image is set up. +- [cliDbConversion/dbConversion.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliDbConversion/dbConversion.feature#L30) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L107) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L128) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:150](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L150) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:212](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L212) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:232](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L232) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L273) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:382](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L382) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L67) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L86) +- [cliMain/configKey.feature:81](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliMain/configKey.feature#L81) +- [cliManageApps/appsPath.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliManageApps/appsPath.feature#L18) +- [cliManageApps/appsPath.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliManageApps/appsPath.feature#L36) +- [cliManageApps/appsPath.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliManageApps/appsPath.feature#L47) +- [cliProvisioning/resetUserPassword.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliProvisioning/resetUserPassword.feature#L19) +- [cliProvisioning/resetUserPasswordOc10Issue36985.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliProvisioning/resetUserPasswordOc10Issue36985.feature#L8) + +## API + +# From local full runs: these failed in the suite and fail again on their own against +# the published image. Check them against the first full run in CI. +- [apiMain/appManagement.feature:16](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/appManagement.feature#L16) +- [apiMain/appManagement.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/appManagement.feature#L28) +- [apiMain/appManagement.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/appManagement.feature#L40) +- [apiMain/appManagement.feature:52](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/appManagement.feature#L52) +- [apiMain/external-storage.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/external-storage.feature#L65) +- [apiShareManagementBasicToRoot/createShareFromLocalStorageToRootFolder.feature:109](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToRoot/createShareFromLocalStorageToRootFolder.feature#L109) +- [apiShareManagementBasicToRoot/createShareFromLocalStorageToRootFolder.feature:57](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToRoot/createShareFromLocalStorageToRootFolder.feature#L57) +- [apiShareManagementBasicToRoot/createShareFromLocalStorageToRootFolder.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToRoot/createShareFromLocalStorageToRootFolder.feature#L83) +- [apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature#L113) +- [apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature:114](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature#L114) +- [apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature#L62) +- [apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature#L87) +- [apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature#L88) +- [apiShareManagementToRoot/moveReceivedShareFromLocalStorage.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToRoot/moveReceivedShareFromLocalStorage.feature#L40) +- [apiShareManagementToRoot/moveReceivedShareFromLocalStorage.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToRoot/moveReceivedShareFromLocalStorage.feature#L63) +- [apiShareManagementToRoot/moveReceivedShareFromLocalStorage.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToRoot/moveReceivedShareFromLocalStorage.feature#L64) +- [apiShareManagementToShares/moveReceivedShareFromLocalStorage.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShareFromLocalStorage.feature#L44) +- [apiShareManagementToShares/moveReceivedShareFromLocalStorage.feature:68](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShareFromLocalStorage.feature#L68) +- [apiShareManagementToShares/moveReceivedShareFromLocalStorage.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShareFromLocalStorage.feature#L89) +- [apiTrashbinRestore/trashbinRestore.feature:171](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbinRestore/trashbinRestore.feature#L171) +- [apiWebdavMove1/moveFileAsync.feature:266](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L266) +- [apiWebdavPreviews/previews.feature:281](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavPreviews/previews.feature#L281) diff --git a/.github/acceptance/expected-failures-10.16.6-smoke.md b/.github/acceptance/expected-failures-10.16.6-smoke.md index 0b49abf..b9d193b 100644 --- a/.github/acceptance/expected-failures-10.16.6-smoke.md +++ b/.github/acceptance/expected-failures-10.16.6-smoke.md @@ -1,4 +1,25 @@ # Scenarios of ownCloud core 10.16.6's acceptance tests that are expected to fail against this # image (smoke run). run.sh fails the job on any other failure, and on a listed # scenario that passes. One entry per line, as in core's own lists: -# - [apiSuite/file.feature:12](https://github.com/owncloud/core/blob/v10.16.6/tests/acceptance/features/apiSuite/file.feature#L12) +# - [apiSuite/file.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSuite/file.feature#L12) + +## CLI + +# Found in this repository's CI. cliExternalStorage needs a second ownCloud server +# to mount over WebDAV; the others depend on how the image is set up. +- [cliDbConversion/dbConversion.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliDbConversion/dbConversion.feature#L30) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L107) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L128) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:150](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L150) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:212](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L212) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:232](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L232) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L273) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:382](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L382) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L67) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L86) +- [cliMain/configKey.feature:81](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliMain/configKey.feature#L81) +- [cliManageApps/appsPath.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliManageApps/appsPath.feature#L18) +- [cliManageApps/appsPath.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliManageApps/appsPath.feature#L36) +- [cliManageApps/appsPath.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliManageApps/appsPath.feature#L47) +- [cliProvisioning/resetUserPassword.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliProvisioning/resetUserPassword.feature#L19) +- [cliProvisioning/resetUserPasswordOc10Issue36985.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliProvisioning/resetUserPasswordOc10Issue36985.feature#L8) diff --git a/.github/acceptance/expected-failures-11.0.1-full.md b/.github/acceptance/expected-failures-11.0.1-full.md index 7e96327..a98500a 100644 --- a/.github/acceptance/expected-failures-11.0.1-full.md +++ b/.github/acceptance/expected-failures-11.0.1-full.md @@ -1,4 +1,49 @@ # Scenarios of ownCloud core 11.0.1's acceptance tests that are expected to fail against this # image (full run). run.sh fails the job on any other failure, and on a listed # scenario that passes. One entry per line, as in core's own lists: -# - [apiSuite/file.feature:12](https://github.com/owncloud/core/blob/v11.0.1/tests/acceptance/features/apiSuite/file.feature#L12) +# - [apiSuite/file.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSuite/file.feature#L12) + +## CLI + +# Found in this repository's CI. cliExternalStorage needs a second ownCloud server +# to mount over WebDAV; the others depend on how the image is set up. +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L107) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L128) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:150](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L150) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:212](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L212) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:232](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L232) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L273) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:382](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L382) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L67) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L86) +- [cliMain/configKey.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliMain/configKey.feature#L101) +- [cliManageApps/appsPath.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliManageApps/appsPath.feature#L18) +- [cliManageApps/appsPath.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliManageApps/appsPath.feature#L36) +- [cliManageApps/appsPath.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliManageApps/appsPath.feature#L47) +- [cliProvisioning/resetUserPassword.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliProvisioning/resetUserPassword.feature#L19) +- [cliProvisioning/resetUserPasswordOc10Issue36985.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliProvisioning/resetUserPasswordOc10Issue36985.feature#L8) + +## API + +# From local full runs: these failed in the suite and fail again on their own against +# the published image. Check them against the first full run in CI. +- [apiMain/appManagement.feature:16](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/appManagement.feature#L16) +- [apiMain/appManagement.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/appManagement.feature#L28) +- [apiMain/appManagement.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/appManagement.feature#L40) +- [apiMain/appManagement.feature:52](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/appManagement.feature#L52) +- [apiMain/external-storage.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/external-storage.feature#L65) +- [apiShareManagementBasicToRoot/createShareFromLocalStorageToRootFolder.feature:109](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToRoot/createShareFromLocalStorageToRootFolder.feature#L109) +- [apiShareManagementBasicToRoot/createShareFromLocalStorageToRootFolder.feature:57](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToRoot/createShareFromLocalStorageToRootFolder.feature#L57) +- [apiShareManagementBasicToRoot/createShareFromLocalStorageToRootFolder.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToRoot/createShareFromLocalStorageToRootFolder.feature#L83) +- [apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature#L113) +- [apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature:114](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature#L114) +- [apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature#L62) +- [apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature#L87) +- [apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareFromLocalStorageToSharesFolder.feature#L88) +- [apiShareManagementToRoot/moveReceivedShareFromLocalStorage.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToRoot/moveReceivedShareFromLocalStorage.feature#L40) +- [apiShareManagementToRoot/moveReceivedShareFromLocalStorage.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToRoot/moveReceivedShareFromLocalStorage.feature#L63) +- [apiShareManagementToRoot/moveReceivedShareFromLocalStorage.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToRoot/moveReceivedShareFromLocalStorage.feature#L64) +- [apiShareManagementToShares/moveReceivedShareFromLocalStorage.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShareFromLocalStorage.feature#L44) +- [apiShareManagementToShares/moveReceivedShareFromLocalStorage.feature:68](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShareFromLocalStorage.feature#L68) +- [apiShareManagementToShares/moveReceivedShareFromLocalStorage.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShareFromLocalStorage.feature#L89) +- [apiTrashbinRestore/trashbinRestore.feature:171](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbinRestore/trashbinRestore.feature#L171) diff --git a/.github/acceptance/expected-failures-11.0.1-smoke.md b/.github/acceptance/expected-failures-11.0.1-smoke.md index 189bbed..8f3d3cf 100644 --- a/.github/acceptance/expected-failures-11.0.1-smoke.md +++ b/.github/acceptance/expected-failures-11.0.1-smoke.md @@ -1,4 +1,24 @@ # Scenarios of ownCloud core 11.0.1's acceptance tests that are expected to fail against this # image (smoke run). run.sh fails the job on any other failure, and on a listed # scenario that passes. One entry per line, as in core's own lists: -# - [apiSuite/file.feature:12](https://github.com/owncloud/core/blob/v11.0.1/tests/acceptance/features/apiSuite/file.feature#L12) +# - [apiSuite/file.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSuite/file.feature#L12) + +## CLI + +# Found in this repository's CI. cliExternalStorage needs a second ownCloud server +# to mount over WebDAV; the others depend on how the image is set up. +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L107) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L128) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:150](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L150) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:212](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L212) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:232](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L232) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L273) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:382](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L382) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L67) +- [cliExternalStorage/filesExternalWebdavOwncloud.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliExternalStorage/filesExternalWebdavOwncloud.feature#L86) +- [cliMain/configKey.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliMain/configKey.feature#L101) +- [cliManageApps/appsPath.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliManageApps/appsPath.feature#L18) +- [cliManageApps/appsPath.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliManageApps/appsPath.feature#L36) +- [cliManageApps/appsPath.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliManageApps/appsPath.feature#L47) +- [cliProvisioning/resetUserPassword.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliProvisioning/resetUserPassword.feature#L19) +- [cliProvisioning/resetUserPasswordOc10Issue36985.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/cliProvisioning/resetUserPasswordOc10Issue36985.feature#L8) diff --git a/.github/workflows/acceptance.yml b/.github/workflows/acceptance.yml index be71300..81fa696 100644 --- a/.github/workflows/acceptance.yml +++ b/.github/workflows/acceptance.yml @@ -47,7 +47,10 @@ jobs: env: FULL: ${{ inputs.full }} run: | - base='~@skip&&~@skipOnDockerContainerTesting&&~@federation-app-required' + # @local_storage: uploads into a local mount created during the test get 423 + # Locked, and which scenarios fail changes from run to run, so no + # expected-failures list can hold them. Excluded until that is solved. + base='~@skip&&~@skipOnDockerContainerTesting&&~@federation-app-required&&~@local_storage' if [ "${FULL}" = true ]; then api_parts=10 api_tags="${base}" else From ecd8c64f63136052265147557ca833c16f8e4c05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= <323649642+oc-tmueller@users.noreply.github.com> Date: Fri, 23 Oct 2026 10:36:32 +0200 Subject: [PATCH 5/5] ci: let run.sh match expected failures with Behat's line suffix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Behat in 11.0.1's test setup prints failed scenarios as 'file.feature:67 (on line 77)'. run.sh's check that a listed scenario really failed greps for the path at the end of the line, so every expected failure counted as an unexpected pass. Patch that grep after extracting the -qa tarball, and stop if the line is not found. Co-Authored-By: Claude Opus 5.5 Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com> --- .github/workflows/acceptance.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/acceptance.yml b/.github/workflows/acceptance.yml index 81fa696..8c602f8 100644 --- a/.github/workflows/acceptance.yml +++ b/.github/workflows/acceptance.yml @@ -122,6 +122,15 @@ jobs: # the release tarball ships its scripts 0644, and run.sh calls # lint-expected-failures.sh directly chmod +x "${RUNNER_TEMP}"/qa/tests/acceptance/*.sh + # run.sh checks that each expected failure really failed with + # `grep ${SUITE_SCENARIO}$`, but newer Behat (11.0.1's) appends " (on line N)" + # to the failed path, so every listed scenario counts as an unexpected pass. + # Allow the suffix; still owncloud/core master's code as of 2026-10. + run="${RUNNER_TEMP}/qa/tests/acceptance/run.sh" + # shellcheck disable=SC2016 # ${SUITE_SCENARIO} is text in run.sh, not ours to expand + sed -i 's/grep ${SUITE_SCENARIO}\$ > \/dev\/null/grep -E "${SUITE_SCENARIO}( [(]on line [0-9]+[)])?$" > \/dev\/null/' "${run}" + # shellcheck disable=SC2016 + grep -qF 'grep -E "${SUITE_SCENARIO}( [(]on line' "${run}" - name: Install Behat env: