This is an automated email from the ASF dual-hosted git repository. jungm pushed a commit to branch ee11 in repository https://gitbox.apache.org/repos/asf/tomee-tck.git
commit f2a4dabcaa84d7850106365af11f1f688c4828b9 Author: Markus Jung <[email protected]> AuthorDate: Sun Jul 19 13:11:09 2026 +0200 Run the faces TCK suite in CI inside a Chrome-bundling container The modern faces suite drives a real Chrome through Selenium in its old-tck-selenium modules, so it cannot run on the bare JDK-tools 'ubuntu && ephemeral' agents that ship no browser. Add a facesBranch that runs run-standalone-suite.sh faces inside markhobson/maven-chrome:jdk-21 (JDK 21, Maven 3.9.15, Chrome + chromedriver 147 on Ubuntu 24.04), pinned by digest like the repo's other inputs. checkout/archive/junit/deleteDir stay on the node around the container; inside it the image's own JDK is used, Maven's local repo is left at the container default (fresh per build, torn down with the container), and --shm-size=2g gives headless Chrome enough shared memory since the TCK driver does not set --disable-dev-shm-usage. The faces branch gets a 300-minute timeout. Verified: the suite runs green in the container (verify-invoker-result OK, 6 modules, 0 failures, 0 errors), with the Selenium/Chrome ITs executing and passing. --- Jenkinsfile | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- KNOWN_ISSUES.md | 42 ++++++++++++++++-------------------- 2 files changed, 81 insertions(+), 28 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index a750ca6..33cf9e1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -154,10 +154,11 @@ from xml.etree import ElementTree // an in-process UnboundID LDAP server on 11389), builds its old-tck // bundle from source on the first run, and lands its JavaTest report // in the target/*report glob so a red run fails the Maven build. - // The modern faces reactor stays workstation-only: its - // old-tck-selenium modules drive Chrome through Selenium, and the ASF - // 'ubuntu && ephemeral' agents ship no browser binary (a JDK-tools - // agent, not a docker-image agent that could bundle one). + // The modern faces reactor's old-tck-selenium modules drive Chrome + // through Selenium, and the ASF 'ubuntu && ephemeral' agents ship no + // browser binary, so its branch runs the suite inside a + // Chrome-bundling container (see facesBranch below) instead of on the + // bare JDK-tools agent the other standalone suites use. // See runner-standalone/README.md and KNOWN_ISSUES.md. def standaloneBranch = { String id, int timeoutMinutes -> { @@ -188,6 +189,58 @@ from xml.etree import ElementTree } } } + // The modern faces suite (298 tests) needs a Chrome binary its + // old-tck-selenium modules drive through Selenium, so its branch runs + // run-standalone-suite.sh inside a container that bundles JDK 21, + // Maven, and a matching Chrome/chromedriver pair. Pinned by digest + // like the rest of the repo's inputs: markhobson/maven-chrome:jdk-21 + // ships Temurin JDK 21, Maven 3.9.15, and Chrome + chromedriver + // 147 on Ubuntu 24.04 (so Selenium Manager resolves the driver + // offline). checkout/archive/junit/deleteDir stay on the node, around + // the container. Inside the container we use the image's JDK (its own + // JAVA_HOME=/opt/java/openjdk), never the host tool(...) install. The + // runner leaves Maven's local repo at the container default: docker + // .inside() runs a fresh container per build, so ~/.m2 is populated + // from scratch and discarded with the container - the faces runner's + // nested install-tck-util/invoker steps must all share one repo, so an + // override would only split them apart. --shm-size=2g gives headless + // Chrome enough shared memory: the TCK's ChromeDevtoolsDriver sets + // --headless=new --no-sandbox --disable-gpu but not + // --disable-dev-shm-usage, so the default 64 MB /dev/shm would crash + // the renderer. + def facesImage = + 'markhobson/maven-chrome@sha256:90b0a104dd7236b5fcef71c342e4f6392fb204a4df030fad4bbf4c7990aaee00' + def facesBranch = { int timeoutMinutes -> + { + stage('standalone - faces') { + node('ubuntu && ephemeral') { + deleteDir() + checkout scm + + try { + timeout(time: timeoutMinutes, unit: 'MINUTES') { + docker.image(facesImage).inside('--shm-size=2g') { + withEnv(['JAVA_HOME=/opt/java/openjdk', + 'PATH+JDK=/opt/java/openjdk/bin']) { + sh 'runner-standalone/run-standalone-suite.sh faces' + } + } + } + } finally { + archiveArtifacts( + artifacts: 'runner-standalone/*/target/surefire-reports/**/*,runner-standalone/*/target/failsafe-reports/**/*,runner-standalone/*/target/**/tck/**/surefire-reports/**/*,runner-standalone/*/target/**/tck/**/failsafe-reports/**/*,runner-standalone/*/target/**/logs/**/*,runner-standalone/*/target/*report/**/*', + allowEmptyArchive: true + ) + junit( + testResults: 'runner-standalone/*/target/surefire-reports/TEST-*.xml,runner-standalone/*/target/failsafe-reports/TEST-*.xml,runner-standalone/*/target/**/tck/**/surefire-reports/TEST-*.xml,runner-standalone/*/target/**/tck/**/failsafe-reports/TEST-*.xml', + allowEmptyResults: true + ) + deleteDir() + } + } + } + } + } // security-old shares the plain 240-minute default: even with the // one-off old-tck source build it runs only ~83 JavaTest tests // (~65 client classes), far below the faces-old sizing that earns @@ -199,6 +252,12 @@ from xml.etree import ElementTree // 245-webapp deployment: a full run takes ~2.5 h on a warm // workstation, so give it more headroom than the other suites. branches['standalone - faces-old'] = standaloneBranch('faces-old', 420) + // The modern faces reactor takes ~45-60 min on a warm workstation + // (TCK download, provision, 298 Selenium/Arquillian/sigtest tests). + // A cold CI node also pulls the browser image and repopulates the + // container-local Maven repo from scratch, so 300 minutes leaves + // ample headroom over the observed runtime. + branches['standalone - faces'] = facesBranch(300) parallel branches } diff --git a/KNOWN_ISSUES.md b/KNOWN_ISSUES.md index 37ccc2c..cb774ba 100644 --- a/KNOWN_ISSUES.md +++ b/KNOWN_ISSUES.md @@ -258,20 +258,7 @@ Need triage/fixes in the upstream projects TomEE ships. Not product bugs — gaps in this repository's coverage. -- **Modern faces reactor stays workstation-only**: the `faces` runner (modern - Arquillian modules, the signature test, and the Chrome/Selenium - `old-tck-selenium` modules) is green with `exclusions/faces.txt`, but its - `old-tck-selenium` modules drive a real Chrome through Selenium. The TCK's - `BaseITNG`/`ChromeDevtoolsDriver` runs headless by default (`--headless=new`, - `--no-sandbox`) and lets Selenium Manager resolve `chromedriver`, but Selenium - Manager still needs a Chrome/Chromium browser binary on the machine. The ASF - `ubuntu && ephemeral` agents the Jenkinsfile targets are JDK-tools agents with - no browser installed; ASF's own pattern for browser-driven CI is to run inside - a Docker image that bundles the browser (e.g. `apache/incubator-kie-tools`), - which this pipeline does not use. So `faces` runs locally via - `run-standalone-suite.sh`; only a browser on the build agent (or a - browser-bundling container image) would let it join CI. The `faces-old` - JavaTest half needs no browser and runs in CI. +_None outstanding._ ## What CI runs @@ -280,17 +267,24 @@ Platform catalog on Plume plus `persistence-javatest` on the webprofile ZIP, and the standalone suites `annotations`, `di`, `el`, `concurrency`, `data`, `servlet`, `pages`, `rest`, `validation`, `websocket`, `jsonp`, `jsonb`, `debugging`, `persistence`, `transactions`, `cdi`, `cdi-ee`, `security`, -`security-old`, `authentication`, `faces-old` — all with default exclusions, -all expected green. Each runner fails its own build on a red result through a -`verify-tck-result` step: the JavaTest runners (`faces-old`, `security-old`, -`transactions`) check the harness exit code, and the invoker-driven source -reactors (`security`, `authentication`, `faces`) aggregate the inner -surefire/failsafe reports and fail on any failure, error, or module that built -but never ran its tests. The `junit`/archive globs also +`security-old`, `authentication`, `faces`, `faces-old` — all with default +exclusions, all expected green. Each runner fails its own build on a red result +through a `verify-tck-result` step: the JavaTest runners (`faces-old`, +`security-old`, `transactions`) check the harness exit code, and the +invoker-driven source reactors (`security`, `authentication`, `faces`) aggregate +the inner surefire/failsafe reports and fail on any failure, error, or module +that built but never ran its tests. The `junit`/archive globs also ingest the surefire/failsafe reports inside the extracted TCK reactors that the source-reactor runners drive through the Maven invoker, plus the JavaTest report directories (`security-old` and `faces-old` write theirs to `target/securityreport/**` and `target/facesreport/**`, matched by the -`target/*report/**` archive glob). The modern `faces` reactor stays -workstation-only because its `old-tck-selenium` modules need a browser the ASF -agents do not provide (see Harness work remaining). +`target/*report/**` archive glob). + +The modern `faces` branch runs its suite inside a container that bundles JDK 21, +Maven, and a matching Chrome/chromedriver pair +(`markhobson/maven-chrome:jdk-21`, pinned by digest in the `Jenkinsfile`), +because its `old-tck-selenium` modules drive a real Chrome through Selenium and +the ASF `ubuntu && ephemeral` agents ship no browser binary. The container runs +with `--shm-size=2g` so headless Chrome has enough shared memory. The +`faces-old` JavaTest half needs no browser and runs on the bare JDK-tools agent +like the other suites.
