From e420d48e95c106fda80722e0758e88b4c9c0c885 Mon Sep 17 00:00:00 2001 From: TheFox0x7 Date: Tue, 21 Apr 2026 22:33:31 +0200 Subject: [PATCH] move the detection to the script Assisted-by: gemini-cli:gemini-3-flash --- Makefile | 9 ++++--- tools/test-e2e.sh | 60 ++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 58 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 13a2d064fe..e5e6cbab54 100644 --- a/Makefile +++ b/Makefile @@ -519,12 +519,11 @@ test-mssql-migration: migrations.mssql.test migrations.individual.mssql.test .PHONY: playwright playwright: deps-frontend - @# on GitHub Actions VMs, playwright's system deps are pre-installed - @pnpm exec playwright install $(if $(GITHUB_ACTIONS),,--with-deps) chromium firefox $(PLAYWRIGHT_FLAGS) + @./tools/test-e2e.sh install .PHONY: test-e2e -test-e2e: $(EXECUTABLE_E2E) - @CONTAINER_RUNTIME=$(CONTAINER_RUNTIME) EXECUTABLE=$(EXECUTABLE_E2E) ./tools/test-e2e.sh $(GITEA_TEST_E2E_FLAGS) +test-e2e: playwright $(EXECUTABLE_E2E) + @CONTAINER_RUNTIME=$(CONTAINER_RUNTIME) EXECUTABLE=$(EXECUTABLE_E2E) ./tools/test-e2e.sh run $(GITEA_TEST_E2E_FLAGS) .PHONY: bench-sqlite bench-sqlite: integrations.sqlite.test generate-ini-sqlite @@ -820,7 +819,7 @@ generate-manpage: ## generate manpage .PHONY: docker docker: - docker build --disable-content-trust=false -t $(DOCKER_REF) . + $(CONTAINER_RUNTIME) build --disable-content-trust=false -t $(DOCKER_REF) . # support also build args docker build --build-arg GITEA_VERSION=v1.2.3 --build-arg TAGS="bindata sqlite sqlite_unlock_notify" . # Disable parallel execution because it would break some targets that don't diff --git a/tools/test-e2e.sh b/tools/test-e2e.sh index ba42f725d6..bce3973a9d 100755 --- a/tools/test-e2e.sh +++ b/tools/test-e2e.sh @@ -1,14 +1,39 @@ #!/bin/bash set -euo pipefail +# Extract Playwright version from package.json +PLAYWRIGHT_VERSION=$(node -e "process.stdout.write(require('./package.json').devDependencies['@playwright/test'])") + +detect_playwright_mode() { + # If PLAYWRIGHT_MODE is already set to local or container, use it + if [ "${PLAYWRIGHT_MODE:-auto}" = "local" ] || [ "${PLAYWRIGHT_MODE:-auto}" = "container" ]; then + return + fi + + # Default to local + PLAYWRIGHT_MODE="local" + + if [ "$(uname -s)" = "Linux" ]; then + if [ -f /etc/os-release ]; then + # Check ID and ID_LIKE for ubuntu or debian + if ! grep -qE '^ID(_LIKE)?=.*(ubuntu|debian)' /etc/os-release; then + PLAYWRIGHT_MODE="container" + fi + else + PLAYWRIGHT_MODE="container" + fi + fi +} + wait_for_container() { local max_attempts=$1 local attempt=1 local wait_time=1 + echo "Waiting for container to start..." sleep 5 # give the container some time to start listening. while [ $attempt -le $max_attempts ]; do - if $CONTAINER_RUNTIME logs gitea-e2e-runner 2>&1 | grep -q "Listening on"; then + if ${CONTAINER_RUNTIME:-docker} logs gitea-e2e-runner 2>&1 | grep -q "Listening on"; then echo "Container is ready." return 0 # Success fi @@ -25,6 +50,26 @@ wait_for_container() { done } +CMD="${1:-run}" +if [ "$CMD" = "install" ] || [ "$CMD" = "run" ]; then + shift +else + CMD="run" +fi + +detect_playwright_mode + +if [ "$CMD" = "install" ]; then + if [ "$PLAYWRIGHT_MODE" = "local" ]; then + # on Github Actions VMs, playwright's system deps are preinstalled + pnpm exec playwright install "$(if [ -z "${GITHUB_ACTIONS:-}" ]; then echo "--with-deps"; fi)" chromium firefox ${PLAYWRIGHT_FLAGS:-} + else + echo "Running playwright in container as host distro is not supported by playwright directly" + ${CONTAINER_RUNTIME:-docker} pull "mcr.microsoft.com/playwright:v${PLAYWRIGHT_VERSION}-noble" + fi + exit 0 +fi + # Create isolated work directory WORK_DIR=$(mktemp -d) @@ -32,8 +77,8 @@ WORK_DIR=$(mktemp -d) FREE_PORT=$(node -e "const s=require('net').createServer();s.listen(0,'127.0.0.1',()=>{process.stdout.write(String(s.address().port));s.close()})") cleanup() { - if [ -z "$PLAYWRIGHT_CONTAINER" ]; then - $CONTAINER_RUNTIME stop gitea-e2e-runner + if [ "${PLAYWRIGHT_MODE:-}" = "container" ]; then + ${CONTAINER_RUNTIME:-docker} stop gitea-e2e-runner fi if [ -n "${SERVER_PID:-}" ]; then kill "$SERVER_PID" 2>/dev/null || true @@ -43,9 +88,9 @@ cleanup() { } trap cleanup EXIT -if [ -z "$PLAYWRIGHT_CONTAINER" ]; then +if [ "${PLAYWRIGHT_MODE:-}" = "container" ]; then # Start playwright worker - $CONTAINER_RUNTIME run --network=host --name gitea-e2e-runner -d --rm --init -it --workdir /home/pwuser --user pwuser mcr.microsoft.com/playwright:v1.59.1-noble /bin/sh -c "npx -y playwright@1.59.1 run-server --port 4000 --host 0.0.0.0" + ${CONTAINER_RUNTIME:-docker} run --network=host --name gitea-e2e-runner -d --rm --init -it --workdir /home/pwuser --user pwuser "mcr.microsoft.com/playwright:v${PLAYWRIGHT_VERSION}-noble" /bin/sh -c "npx -y playwright@${PLAYWRIGHT_VERSION} run-server --port 4000 --host 0.0.0.0" if ! wait_for_container 5; then exit 1 @@ -137,6 +182,9 @@ GITEA_TEST_E2E_EMAIL="$GITEA_TEST_E2E_USER@$GITEA_TEST_E2E_DOMAIN" if [ -z "${GITEA_TEST_E2E_TIMEOUT_FACTOR:-}" ]; then if [ -n "${CI:-}" ]; then GITEA_TEST_E2E_TIMEOUT_FACTOR=4 + # Container based runs seem slower so bump the default timeout to avoid failing tests + elif [ "${PLAYWRIGHT_MODE}" = "container" ]; then + GITEA_TEST_E2E_TIMEOUT_FACTOR=1.5 else GITEA_TEST_E2E_TIMEOUT_FACTOR=1 fi @@ -149,7 +197,7 @@ export GITEA_TEST_E2E_PASSWORD export GITEA_TEST_E2E_EMAIL export GITEA_TEST_E2E_TIMEOUT_FACTOR -if [ -z "$PLAYWRIGHT_CONTAINER" ]; then +if [ "$PLAYWRIGHT_MODE" = "container" ]; then export PW_TEST_CONNECT_WS_ENDPOINT=ws://127.0.0.1:4000/ fi pnpm exec playwright test "$@"