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.

Reply via email to