Skip to content

Conversation

mgascam
Copy link
Contributor

@mgascam mgascam commented Oct 8, 2025

Fixes #WOOPMNT-5365

This PR migrates the existing E2E GitHub workflows to use QIT, completing the workflow infrastructure portion of the QIT E2E migration effort. This is part of a stacked PR series where each PR builds incrementally toward full QIT adoption.

Current State & Scope

🚧 Important: This PR focuses on infrastructure migration - moving from legacy E2E workflows to QIT-based workflows. The test suite is functionally complete and running in CI, but stability work is needed as a follow-up task (see WOOPMNT-5361: [E2E][QIT] Fix timeout errors and flaky specs in CI).

The intent is to get the foundation merged and reviewed without blocking on every flaky test. This should allow parallel work on stabilization while infrastructure is in place and track infrastructure changes separately from test fixes.

⚠️ Current Limitations (to be addressed in follow-up work):

  1. Test Flakiness: Some tests have timeout issues and intermittent failures in CI
  2. Retry Logic: While automatic retries help, some specs may need additional stability work

Changes proposed in this Pull Request

This PR establishes the QIT E2E testing infrastructure with:

  1. Separated Workflows for Different Use Cases:
    • qit-e2e-pull-request.yml: Focused PR testing (10 jobs: L-1 + stable WC versions across 5 test categories)
    • qit-e2e.yml (renamed to "Scheduled & Push"): Comprehensive version matrix (25+ jobs including legacy WC 7.7.0, beta, RC, WP nightly)
  2. Dynamic Version Resolution:
    • New script: .github/scripts/generate-qit-wc-matrix.sh
    • Automatically fetches L-1 WooCommerce version from WordPress.org API
    • Checks availability of beta/RC versions dynamically
  3. Build Once, Test Many:
    • New build-plugin job: Builds woocommerce-payments.zip once and uploads as artifact
    • All matrix jobs download the pre-built artifact instead of rebuilding
    • Impact: Saves ~5 minutes × number of matrix jobs (e.g., 50 minutes saved on 10-job PR runs)
    • Ensures all tests run against the identical build artifact
  4. Test Execution Features:
    • Tag-based filtering: Single tags (e.g., merchant) auto-exclude subscriptions/blocks; multiple tags use AND logic
    • Automatic retries: Failed specs are parsed from CTRF reports and retried once
    • WordPress version support: Can test against stable, nightly, and RC WordPress builds
    • Manual dispatch: Run workflows with custom WC/PHP/WP versions and specific test tags
  5. Error Handling:
    • Validates QIT results directory exists before proceeding
    • Parses CTRF format reports to identify failed specs
    • Provides clear error messages for QIT setup failures
    • Uses --no_upload_report to keep CI results internal

Testing instructions

What Should Work:

  • Workflows trigger on appropriate events (PR, push, schedule)
  • Matrix generates correctly with dynamic versions
  • Tests execute via QIT
  • Failed specs are identified and retried
  • Results are logged (not uploaded to QIT)

What May Not Work (expected, to be fixed later):

  • Some tests may timeout or fail intermittently
  • Retry attempts may not always succeed
  • Full test suite will not be 100% green

  • Run npm run changelog to add a changelog file, choose patch to leave it empty if the change is not significant. You can add multiple changelog files in one PR by running this command a few times.
  • Covered with tests (or have a good reason not to test in description ☝️)
  • Tested on mobile (or does not apply)

Post merge

@mgascam mgascam changed the base branch from develop to dev/qit-e2e-subscriptions-specs-migration October 8, 2025 11:49
Copy link
Contributor

github-actions bot commented Oct 8, 2025

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 11082 or branch name dev/qit-e2e-enhance-workflows in your-test.site/wp-admin/admin.php?page=jetpack-beta&plugin=woocommerce-payments

Option 2. Jurassic Ninja - available for logged-in A12s

🚀 Launch a JN site with this branch 🚀

ℹ️ Install this Tampermonkey script to get more options.


Build info:

  • Latest commit: d0d55aa
  • Build time: 2025-10-10 14:43:07 UTC

Note: the build is updated when a new commit is pushed to this PR.

Copy link
Contributor

github-actions bot commented Oct 8, 2025

Size Change: 0 B

Total Size: 873 kB

ℹ️ View Unchanged
Filename Size
release/woocommerce-payments/assets/css/admin.css 1.45 kB
release/woocommerce-payments/assets/css/admin.rtl.css 1.45 kB
release/woocommerce-payments/assets/css/success.css 1.06 kB
release/woocommerce-payments/assets/css/success.rtl.css 1.06 kB
release/woocommerce-payments/dist/blocks-checkout-rtl.css 2.77 kB
release/woocommerce-payments/dist/blocks-checkout.css 2.77 kB
release/woocommerce-payments/dist/blocks-checkout.js 54.3 kB
release/woocommerce-payments/dist/cart-block-rtl.css 113 B
release/woocommerce-payments/dist/cart-block.css 112 B
release/woocommerce-payments/dist/cart-block.js 16.7 kB
release/woocommerce-payments/dist/cart.js 5.27 kB
release/woocommerce-payments/dist/checkout-rtl.css 1.08 kB
release/woocommerce-payments/dist/checkout.css 1.08 kB
release/woocommerce-payments/dist/checkout.js 34.4 kB
release/woocommerce-payments/dist/express-checkout-rtl.css 367 B
release/woocommerce-payments/dist/express-checkout.css 367 B
release/woocommerce-payments/dist/express-checkout.js 16.8 kB
release/woocommerce-payments/dist/frontend-tracks.js 833 B
release/woocommerce-payments/dist/index-rtl.css 21.2 kB
release/woocommerce-payments/dist/index.css 21.2 kB
release/woocommerce-payments/dist/index.js 153 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.08 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 3.82 kB
release/woocommerce-payments/dist/multi-currency-switcher-block.js 18.2 kB
release/woocommerce-payments/dist/multi-currency.css 3.83 kB
release/woocommerce-payments/dist/multi-currency.js 24.6 kB
release/woocommerce-payments/dist/order-rtl.css 740 B
release/woocommerce-payments/dist/order.css 740 B
release/woocommerce-payments/dist/order.js 21.2 kB
release/woocommerce-payments/dist/plugins-page-rtl.css 484 B
release/woocommerce-payments/dist/plugins-page.css 484 B
release/woocommerce-payments/dist/plugins-page.js 2.64 kB
release/woocommerce-payments/dist/product-details-rtl.css 433 B
release/woocommerce-payments/dist/product-details.css 436 B
release/woocommerce-payments/dist/product-details.js 12.3 kB
release/woocommerce-payments/dist/settings-rtl.css 11.8 kB
release/woocommerce-payments/dist/settings.css 11.7 kB
release/woocommerce-payments/dist/settings.js 140 kB
release/woocommerce-payments/dist/subscription-edit-page.js 703 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal-rtl.css 527 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.css 527 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.js 1.98 kB
release/woocommerce-payments/dist/subscription-product-onboarding-toast.js 730 B
release/woocommerce-payments/dist/subscriptions-empty-state-rtl.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.js 1.9 kB
release/woocommerce-payments/dist/success.js 6.03 kB
release/woocommerce-payments/dist/tos-rtl.css 235 B
release/woocommerce-payments/dist/tos.css 235 B
release/woocommerce-payments/dist/tos.js 3 kB
release/woocommerce-payments/dist/woopay-direct-checkout.js 5.68 kB
release/woocommerce-payments/dist/woopay-express-button.js 22.8 kB
release/woocommerce-payments/dist/woopay-rtl.css 4.29 kB
release/woocommerce-payments/dist/woopay.css 4.27 kB
release/woocommerce-payments/dist/woopay.js 70.8 kB
release/woocommerce-payments/includes/subscriptions/assets/css/plugin-page.css 625 B
release/woocommerce-payments/includes/subscriptions/assets/js/plugin-page.js 814 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/i18n-loader.js 2.46 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/jetpack-script-data.js 957 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/i18n-loader.js 1.02 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/script-data.js 69 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/babel.config.js 163 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.css 2.47 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.js 14.3 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.rtl.css 2.47 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.css 10.1 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.js 29.7 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.rtl.css 10.1 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.css 198 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.js 280 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.rtl.css 198 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.css 625 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.js 333 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.rtl.css 626 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-users.js 417 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-users-connection.js 161 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-ajax.js 521 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-callables.js 585 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.css 215 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.js 521 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.css 721 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.js 412 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-users.js 625 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/about.css 1.04 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-empty-state.css 294 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-order-statuses.css 408 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin.css 3.59 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/checkout.css 301 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/modal.css 746 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/view-subscription.css 574 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/wcs-upgrade.css 414 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin-pointers.js 543 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js 9.4 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.js 6.78 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.min.js 3.84 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-coupon.js 545 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-subscription.js 2.52 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.js 22.2 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.min.js 11.7 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/payment-method-restrictions.js 1.29 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/wcs-meta-boxes-order.js 507 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/payment-methods.js 358 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/single-product.js 428 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/view-subscription.js 1.38 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/wcs-cart.js 782 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/modal.js 1.09 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/wcs-upgrade.js 1.26 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.css 391 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.js 3.04 kB

compressed-size-action

mgascam added 26 commits October 8, 2025 13:59
… and shopper jobs, removing exclusion tags to avoid duplication. Remove retries
…led specs, allowing for better error handling and reporting.
…mline test execution paths, enhancing clarity and maintainability.
…improve test directory determination logic for better clarity and maintainability.
…ble retries, enhancing clarity and consistency in test execution.
… improving clarity and flexibility in test execution.
@mgascam mgascam force-pushed the dev/qit-e2e-enhance-workflows branch from 28066f0 to c763176 Compare October 10, 2025 13:26
@mgascam mgascam changed the title [WIP] Dev/qit e2e enhance workflows [E2E][QIT] Migrate Github Actions workflows to work with QIT Oct 10, 2025
@mgascam mgascam requested a review from a team October 10, 2025 15:42
@mgascam mgascam marked this pull request as ready for review October 10, 2025 15:45
Copy link
Member

@adimoldovan adimoldovan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice to see this moving forward @mgascam!

  1. Separated Workflows for Different Use Cases:

From what I can see there's not much difference between the 2 workflows, most is duplicated logic (and also quite verbose). I think a single workflow would be better here.

Tag-based filtering: Single tags (e.g., merchant) auto-exclude subscriptions/blocks; multiple tags use AND logic

How much flexibility do you expect you'd need to run these tests manually in GitHub? I think organizing the tests in projects would be easier than dealing with parsing tags in the CI workflow. And use project name(s) as input in the workflow.

run: |
RESULTS_JSON="${{ steps.parse_failed_specs.outputs.results_json }}"

# Extract failed spec file paths from CTRF format
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not using Playwright's last-failed builtin feature? It should greatly simplify the logic, no need to parse any reports.

required: false
default: ''
type: string
run_ui_mode:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the benefit of running in UI mode in CI?


- name: First Run QIT Tests
id: first_run_qit_tests
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be == 'pull_request'?

if [[ "$WORD_COUNT" -eq 1 ]]; then
# Single tag: exclude subscriptions and blocks tests using --grep-invert with regex alternation
# Example: --grep @shopper --grep-invert "@(subscriptions|blocks)"
OPTIONS="${OPTIONS} --pw_test_tag=\"${CLEAN_TAG}\" --pw_options=\"--retries=0 --grep-invert '@(subscriptions|blocks)'\""
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand the need of this step or how it works. What if I use the tag @subscriptions or @blocks?

# Check if QIT actually ran tests by looking for results directory
QIT_RESULTS_DIR=$(find /tmp -maxdepth 1 -name "qit-results-*" -type d 2>/dev/null | sort -r | head -1)
if [[ -z "$QIT_RESULTS_DIR" ]]; then
echo "::error::QIT did not produce test results. This indicates an environment or setup failure."
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would QIT exit with code 0 if the setup failed?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants