Page MenuHomePhabricator

wikilambda-catalyst-end-to-end broken due to new version of composer after PHP 8.1 -> 8.3 migration
Closed, ResolvedPublic

Details

Related Changes in Gerrit:
Related Changes in GitLab:
TitleReferenceAuthorSource BranchDest Branch
Allow running composer update as root, it tries to stop us now for securityrepos/abstract-wiki/aw-ci-chart!46jforrestercomposer-not-rootmain
Customize query in GitLab

Event Timeline

https://integration.wikimedia.org/ci/job/wikilambda-catalyst-end-to-end/1542/console

Execution of 5 workers started at 2025-12-01T14:29:01.148Z

Run test targeting https://mw-ext-wl-ci-1212610-75389.catalyst.wmcloud.org/w
[0-0] RUNNING in chrome - file:///tests/selenium/specs/basic.js
[0-0] PASSED in chrome - file:///tests/selenium/specs/basic.js
[0-1] RUNNING in chrome - file:///tests/selenium/specs/connect.js
[0-1] Error in "Dynamic Test for Implementation and Test Case Connection.Admin user.should dynamically connect or disconnect the implementation based on its initial state"
Error: element ("button[data-testid="connect"]") still existing after 10000ms
    at async FunctionPage.checkImplementationsTableRow (/src/tests/selenium/pageobjects/function/Function.page.js:295:3)
    at async Context.<anonymous> (/src/tests/selenium/specs/connect.js:72:5)
[0-1] Error in "Dynamic Test for Implementation and Test Case Connection.Admin user.should dynamically connect or disconnect the test case based on its initial state"
Error: element ("button[data-testid="connect"]") still existing after 10000ms
    at async FunctionPage.checkTestCasesTableRow (/src/tests/selenium/pageobjects/function/Function.page.js:394:3)
    at async Context.<anonymous> (/src/tests/selenium/specs/connect.js:103:5)
[0-1] RETRYING in chrome - file:///tests/selenium/specs/connect.js
[0-1] RUNNING in chrome - file:///tests/selenium/specs/connect.js
[0-1] Error in "Dynamic Test for Implementation and Test Case Connection.Admin user.should dynamically connect or disconnect the implementation based on its initial state"
Error: element ("button[data-testid="connect"]") still existing after 10000ms
    at async FunctionPage.checkImplementationsTableRow (/src/tests/selenium/pageobjects/function/Function.page.js:295:3)
    at async Context.<anonymous> (/src/tests/selenium/specs/connect.js:72:5)
[0-1] Error in "Dynamic Test for Implementation and Test Case Connection.Admin user.should dynamically connect or disconnect the test case based on its initial state"
Error: element ("button[data-testid="connect"]") still existing after 10000ms
    at async FunctionPage.checkTestCasesTableRow (/src/tests/selenium/pageobjects/function/Function.page.js:394:3)
    at async Context.<anonymous> (/src/tests/selenium/specs/connect.js:103:5)
[0-1] FAILED in chrome - file:///tests/selenium/specs/connect.js (1 retries)
[0-2] RUNNING in chrome - file:///tests/selenium/specs/function.js
[0-2] PASSED in chrome - file:///tests/selenium/specs/function.js
[0-3] RUNNING in chrome - file:///tests/selenium/specs/implementation.js
[0-3] PASSED in chrome - file:///tests/selenium/specs/implementation.js
[0-4] RUNNING in chrome - file:///tests/selenium/specs/tester.js
[0-4] Error in "Tester.Edit the test.should edit the about block test"
Error: element ("[data-testid="about-description"]") still not existing after 5000ms
    at async Context.<anonymous> (/src/tests/selenium/specs/tester.js:179:4)
[0-4] RETRYING in chrome - file:///tests/selenium/specs/tester.js
[0-4] RUNNING in chrome - file:///tests/selenium/specs/tester.js
[0-4] Error in "Tester.Edit the test.should edit the about block test"
Error: element ("[data-testid="about-description"]") still not existing after 5000ms
    at async Context.<anonymous> (/src/tests/selenium/specs/tester.js:179:4)
[0-4] FAILED in chrome - file:///tests/selenium/specs/tester.js (1 retries)

 "spec" Reporter:
------------------------------------------------------------------
[chrome 140.0.7339.80 linux #0-0] Running: chrome (v140.0.7339.80) on linux
[chrome 140.0.7339.80 linux #0-0] Session ID: f9570a0e29a18328b4a20b9bbcb69d0f
[chrome 140.0.7339.80 linux #0-0]
[chrome 140.0.7339.80 linux #0-0] » tests/selenium/specs/basic.js
[chrome 140.0.7339.80 linux #0-0] Installation checks
[chrome 140.0.7339.80 linux #0-0]     CreateObject
[chrome 140.0.7339.80 linux #0-0]        ✓ page should exist on installation but deny to logged-out user
[chrome 140.0.7339.80 linux #0-0]        ✓ page should exist on installation and work when logged in
[chrome 140.0.7339.80 linux #0-0]
[chrome 140.0.7339.80 linux #0-0]     RunFunction
[chrome 140.0.7339.80 linux #0-0]        ✓ page should exist on installation
[chrome 140.0.7339.80 linux #0-0]
[chrome 140.0.7339.80 linux #0-0]     ListObjectsByType
[chrome 140.0.7339.80 linux #0-0]        ✓ page should exist on installation
[chrome 140.0.7339.80 linux #0-0]
[chrome 140.0.7339.80 linux #0-0] 4 passing (22.8s)
------------------------------------------------------------------
[chrome 140.0.7339.80 linux #0-1] Running: chrome (v140.0.7339.80) on linux
[chrome 140.0.7339.80 linux #0-1] Session ID: 6d2be4b7de363559f879fc4dcf9863d7
[chrome 140.0.7339.80 linux #0-1]
[chrome 140.0.7339.80 linux #0-1] » tests/selenium/specs/connect.js
[chrome 140.0.7339.80 linux #0-1] Dynamic Test for Implementation and Test Case Connection
[chrome 140.0.7339.80 linux #0-1]     Admin user
[chrome 140.0.7339.80 linux #0-1]        ✖ should dynamically connect or disconnect the implementation based on its initial state
[chrome 140.0.7339.80 linux #0-1]        ✖ should dynamically connect or disconnect the test case based on its initial state
[chrome 140.0.7339.80 linux #0-1]
[chrome 140.0.7339.80 linux #0-1] 2 failing (33.8s)
[chrome 140.0.7339.80 linux #0-1]
[chrome 140.0.7339.80 linux #0-1] 1) Admin user should dynamically connect or disconnect the implementation based on its initial state
[chrome 140.0.7339.80 linux #0-1] element ("button[data-testid="connect"]") still existing after 10000ms
[chrome 140.0.7339.80 linux #0-1] Error: element ("button[data-testid="connect"]") still existing after 10000ms
[chrome 140.0.7339.80 linux #0-1]     at async FunctionPage.checkImplementationsTableRow (/src/tests/selenium/pageobjects/function/Function.page.js:295:3)
[chrome 140.0.7339.80 linux #0-1]     at async Context.<anonymous> (/src/tests/selenium/specs/connect.js:72:5)
[chrome 140.0.7339.80 linux #0-1]
[chrome 140.0.7339.80 linux #0-1] 2) Admin user should dynamically connect or disconnect the test case based on its initial state
[chrome 140.0.7339.80 linux #0-1] element ("button[data-testid="connect"]") still existing after 10000ms
[chrome 140.0.7339.80 linux #0-1] Error: element ("button[data-testid="connect"]") still existing after 10000ms
[chrome 140.0.7339.80 linux #0-1]     at async FunctionPage.checkTestCasesTableRow (/src/tests/selenium/pageobjects/function/Function.page.js:394:3)
[chrome 140.0.7339.80 linux #0-1]     at async Context.<anonymous> (/src/tests/selenium/specs/connect.js:103:5)
------------------------------------------------------------------
[chrome 140.0.7339.80 linux #0-1] Running: chrome (v140.0.7339.80) on linux
[chrome 140.0.7339.80 linux #0-1] Session ID: e1f127f7e254d7117120f0beca941f0a
[chrome 140.0.7339.80 linux #0-1]
[chrome 140.0.7339.80 linux #0-1] » tests/selenium/specs/connect.js
[chrome 140.0.7339.80 linux #0-1] Dynamic Test for Implementation and Test Case Connection
[chrome 140.0.7339.80 linux #0-1]     Admin user
[chrome 140.0.7339.80 linux #0-1]        ✖ should dynamically connect or disconnect the implementation based on its initial state
[chrome 140.0.7339.80 linux #0-1]        ✖ should dynamically connect or disconnect the test case based on its initial state
[chrome 140.0.7339.80 linux #0-1]
[chrome 140.0.7339.80 linux #0-1] 2 failing (34.3s)
[chrome 140.0.7339.80 linux #0-1]
[chrome 140.0.7339.80 linux #0-1] 1) Admin user should dynamically connect or disconnect the implementation based on its initial state
[chrome 140.0.7339.80 linux #0-1] element ("button[data-testid="connect"]") still existing after 10000ms
[chrome 140.0.7339.80 linux #0-1] Error: element ("button[data-testid="connect"]") still existing after 10000ms
[chrome 140.0.7339.80 linux #0-1]     at async FunctionPage.checkImplementationsTableRow (/src/tests/selenium/pageobjects/function/Function.page.js:295:3)
[chrome 140.0.7339.80 linux #0-1]     at async Context.<anonymous> (/src/tests/selenium/specs/connect.js:72:5)
[chrome 140.0.7339.80 linux #0-1]
[chrome 140.0.7339.80 linux #0-1] 2) Admin user should dynamically connect or disconnect the test case based on its initial state
[chrome 140.0.7339.80 linux #0-1] element ("button[data-testid="connect"]") still existing after 10000ms
[chrome 140.0.7339.80 linux #0-1] Error: element ("button[data-testid="connect"]") still existing after 10000ms
[chrome 140.0.7339.80 linux #0-1]     at async FunctionPage.checkTestCasesTableRow (/src/tests/selenium/pageobjects/function/Function.page.js:394:3)
[chrome 140.0.7339.80 linux #0-1]     at async Context.<anonymous> (/src/tests/selenium/specs/connect.js:103:5)
------------------------------------------------------------------
[chrome 140.0.7339.80 linux #0-2] Running: chrome (v140.0.7339.80) on linux
[chrome 140.0.7339.80 linux #0-2] Session ID: 4d8d37b183226171d06076fd0e9fc754
[chrome 140.0.7339.80 linux #0-2]
[chrome 140.0.7339.80 linux #0-2] » tests/selenium/specs/function.js
[chrome 140.0.7339.80 linux #0-2] Function
[chrome 140.0.7339.80 linux #0-2]     Function viewer (CUJ1)
[chrome 140.0.7339.80 linux #0-2]        ✓ should allow to evaluate a function
[chrome 140.0.7339.80 linux #0-2]
[chrome 140.0.7339.80 linux #0-2]     Function editor (CUJ2)
[chrome 140.0.7339.80 linux #0-2]        ✓ should create a new function and display the function name
[chrome 140.0.7339.80 linux #0-2]        ✓ should create a new function and display function aliases
[chrome 140.0.7339.80 linux #0-2]        ✓ should create a new function and display function input labels and types
[chrome 140.0.7339.80 linux #0-2]        ✓ should create a new function and display function output type
[chrome 140.0.7339.80 linux #0-2]
[chrome 140.0.7339.80 linux #0-2] 5 passing (30.2s)
------------------------------------------------------------------
[chrome 140.0.7339.80 linux #0-3] Running: chrome (v140.0.7339.80) on linux
[chrome 140.0.7339.80 linux #0-3] Session ID: 74d451c5cd9b4b87c0cbc07a0d7029e7
[chrome 140.0.7339.80 linux #0-3]
[chrome 140.0.7339.80 linux #0-3] » tests/selenium/specs/implementation.js
[chrome 140.0.7339.80 linux #0-3] Implementation (CUJ 5)
[chrome 140.0.7339.80 linux #0-3]     Implementation via code
[chrome 140.0.7339.80 linux #0-3]        ✓ should create and publish a new implementation
[chrome 140.0.7339.80 linux #0-3]
[chrome 140.0.7339.80 linux #0-3]     Implementation via composition
[chrome 140.0.7339.80 linux #0-3]        ✓ should create and publish a new implementation
[chrome 140.0.7339.80 linux #0-3]
[chrome 140.0.7339.80 linux #0-3] 2 passing (1m 2.8s)
------------------------------------------------------------------
[chrome 140.0.7339.80 linux #0-4] Running: chrome (v140.0.7339.80) on linux
[chrome 140.0.7339.80 linux #0-4] Session ID: 7a85c19d8f50136543cd3d43dd3dac60
[chrome 140.0.7339.80 linux #0-4]
[chrome 140.0.7339.80 linux #0-4] » tests/selenium/specs/tester.js
[chrome 140.0.7339.80 linux #0-4] Tester
[chrome 140.0.7339.80 linux #0-4]     Create a new test (CUJ 4)
[chrome 140.0.7339.80 linux #0-4]        ✓ should fill and submit the tester form
[chrome 140.0.7339.80 linux #0-4]
[chrome 140.0.7339.80 linux #0-4]     Edit the test
[chrome 140.0.7339.80 linux #0-4]        ✖ should edit the about block test
[chrome 140.0.7339.80 linux #0-4]
[chrome 140.0.7339.80 linux #0-4] 1 passing (48.9s)
[chrome 140.0.7339.80 linux #0-4] 1 failing
[chrome 140.0.7339.80 linux #0-4]
[chrome 140.0.7339.80 linux #0-4] 1) Edit the test should edit the about block test
[chrome 140.0.7339.80 linux #0-4] element ("[data-testid="about-description"]") still not existing after 5000ms
[chrome 140.0.7339.80 linux #0-4] Error: element ("[data-testid="about-description"]") still not existing after 5000ms
[chrome 140.0.7339.80 linux #0-4]     at async Context.<anonymous> (/src/tests/selenium/specs/tester.js:179:4)
------------------------------------------------------------------
[chrome 140.0.7339.80 linux #0-4] Running: chrome (v140.0.7339.80) on linux
[chrome 140.0.7339.80 linux #0-4] Session ID: 20be5a4df71aced901e8e10808846b13
[chrome 140.0.7339.80 linux #0-4]
[chrome 140.0.7339.80 linux #0-4] » tests/selenium/specs/tester.js
[chrome 140.0.7339.80 linux #0-4] Tester
[chrome 140.0.7339.80 linux #0-4]     Create a new test (CUJ 4)
[chrome 140.0.7339.80 linux #0-4]        ✓ should fill and submit the tester form
[chrome 140.0.7339.80 linux #0-4]
[chrome 140.0.7339.80 linux #0-4]     Edit the test
[chrome 140.0.7339.80 linux #0-4]        ✖ should edit the about block test
[chrome 140.0.7339.80 linux #0-4]
[chrome 140.0.7339.80 linux #0-4] 1 passing (47s)
[chrome 140.0.7339.80 linux #0-4] 1 failing
[chrome 140.0.7339.80 linux #0-4]
[chrome 140.0.7339.80 linux #0-4] 1) Edit the test should edit the about block test
[chrome 140.0.7339.80 linux #0-4] element ("[data-testid="about-description"]") still not existing after 5000ms
[chrome 140.0.7339.80 linux #0-4] Error: element ("[data-testid="about-description"]") still not existing after 5000ms
[chrome 140.0.7339.80 linux #0-4]     at async Context.<anonymous> (/src/tests/selenium/specs/tester.js:179:4)

Mentioned in SAL (#wikimedia-releng) [2025-12-01T14:38:11Z] <James_F> Zuul: Temporarily make wikilambda-catalyst-end-to-end non-voting, for T411372

Errors from connect.js point at a missing Diff\Comparer\StrictComparer

{
    "error": {
        "code": "internal_api_error_Error",
        "info": "[1154817524a993c26712257e] Exception caught: Class \"Diff\\Comparer\\StrictComparer\" not found",
        "errorclass": "Error",
        "trace": "Error at /var/www/html/w/extensions/WikiLambda/includes/Diff/ZObjectDiffer.php(33)\nfrom /var/www/html/w/extensions/WikiLambda/includes/Diff/ZObjectDiffer.php(33)\n#0 /var/www/html/w/extensions/WikiLambda/includes/Authorization/ZObjectAuthorization.php(290): MediaWiki\\Extension\\WikiLambda\\Diff\\ZObjectDiffer->__construct()\n#1 /var/www/html/w/extensions/WikiLambda/includes/Authorization/ZObjectAuthorization.php(178): MediaWiki\\Extension\\WikiLambda\\Authorization\\ZObjectAuthorization->getDiffOps()\n#2 /var/www/html/w/extensions/WikiLambda/includes/Authorization/ZObjectAuthorization.php(55): MediaWiki\\Extension\\WikiLambda\\Authorization\\ZObjectAuthorization->getRequiredEditRights()\n#3 /var/www/html/w/extensions/WikiLambda/includes/ZObjectStore.php(456): MediaWiki\\Extension\\WikiLambda\\Authorization\\ZObjectAuthorization->authorize()\n#4 /var/www/html/w/extensions/WikiLambda/includes/ActionAPI/ApiZObjectEditor.php(73): MediaWiki\\Extension\\WikiLambda\\ZObjectStore->updateZObject()\n#5 /var/www/html/w/extensions/WikiLambda/includes/ActionAPI/WikiLambdaApiBase.php(103): MediaWiki\\Extension\\WikiLambda\\ActionAPI\\ApiZObjectEditor->run()\n#6 /var/www/html/w/includes/Api/ApiMain.php(2053): MediaWiki\\Extension\\WikiLambda\\ActionAPI\\WikiLambdaApiBase->execute()\n#7 /var/www/html/w/includes/Api/ApiMain.php(956): MediaWiki\\Api\\ApiMain->executeAction()\n#8 /var/www/html/w/includes/Api/ApiMain.php(927): MediaWiki\\Api\\ApiMain->executeActionWithErrorHandling()\n#9 /var/www/html/w/includes/Api/ApiEntryPoint.php(138): MediaWiki\\Api\\ApiMain->execute()\n#10 /var/www/html/w/includes/MediaWikiEntryPoint.php(184): MediaWiki\\Api\\ApiEntryPoint->execute()\n#11 /var/www/html/w/api.php(30): MediaWiki\\MediaWikiEntryPoint->run()\n#12 {main}"
    },
    "servedby": "test-120125-3098-mediawiki-66746f69d7-fqxwb"
}

From wikilambda/composer.json

{
  "require": {
    "diff/diff": "^3.2.0",

Looking in the output of the job, I see:

INFO: 2025-12-01T14:23:19.893797547Z:   - Installing wikimedia/composer-merge-plugin (v2.1.0): Extracting archive
INFO: 2025-12-01T14:23:19.926198786Z: The "wikimedia/composer-merge-plugin" plugin was not loaded as plugins are disabled.

… which would explain why our composer directives are being ignored. This is a security check by composer, as the command is being run as root(!). But we've not changed anything recently except the PHP binary. Why is Catalyst now doing this? Maybe in bumping PHP we also updated composer to bring in this new feature?

jforrester opened https://gitlab.wikimedia.org/repos/abstract-wiki/aw-ci-chart/-/merge_requests/46

Don't try to run composer update as root, it now ignores things for security

jnuche merged https://gitlab.wikimedia.org/repos/abstract-wiki/aw-ci-chart/-/merge_requests/46

Allow running composer update as root, it tries to stop us now for security

Change #1213541 had a related patch set uploaded (by Jforrester; author: Jforrester):

[integration/config@master] Revert "Zuul: Temporarily make wikilambda-catalyst-end-to-end non-voting"

https://gerrit.wikimedia.org/r/1213541

Jdforrester-WMF renamed this task from wikilambda-catalyst-end-to-end broken to wikilambda-catalyst-end-to-end broken due to new version of composer after PHP 8.1 -> 8.3 migration.Mon, Dec 1, 6:12 PM
Jdforrester-WMF changed the task status from Open to In Progress.
Jdforrester-WMF closed this task as Resolved.
Jdforrester-WMF claimed this task.
Jdforrester-WMF triaged this task as High priority.

Change #1213541 merged by jenkins-bot:

[integration/config@master] Revert "Zuul: Temporarily make wikilambda-catalyst-end-to-end non-voting"

https://gerrit.wikimedia.org/r/1213541

Mentioned in SAL (#wikimedia-releng) [2025-12-01T18:15:43Z] <James_F> Revert "Zuul: Temporarily make wikilambda-catalyst-end-to-end non-voting", for T411372