diff --git a/.circleci/config.yml b/.circleci/config.yml index c0d6981dbb0..edb7bb1c496 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -105,7 +105,11 @@ jobs: node-version: <> - browser-tools/install-chrome: replace-existing: false - - run: npm run test + - run: + command: | + mkdir -p dist/reports/tests/ + TESTFILES=$(circleci tests glob "src/**/*Spec.js") + echo "$TESTFILES" | circleci tests run --command="xargs npm run test" --verbose - run: npm run cov:unit:publish - save_cache_cmd: node-version: <> @@ -123,7 +127,7 @@ jobs: suite: #stable or full type: string executor: pw-focal-development - parallelism: 6 + parallelism: 7 steps: - build_and_install: node-version: lts/hydrogen @@ -132,7 +136,11 @@ jobs: equal: ["full", <>] steps: - run: npx playwright install chrome-beta - - run: SHARD="$((${CIRCLE_NODE_INDEX}+1))"; npm run test:e2e:<> -- --shard=${SHARD}/${CIRCLE_NODE_TOTAL} + - run: + command: | + mkdir test-results + TESTFILES=$(circleci tests glob "e2e/**/*.spec.js") + echo "$TESTFILES" | circleci tests run --command="xargs npm run test:e2e:<>" --verbose --split-by=timings - when: condition: equal: [42, 42] # Always run codecov reports regardless of test failure https://discuss.circleci.com/t/make-custom-command-run-always-with-when-always/38957/2 @@ -239,6 +247,7 @@ jobs: equal: [42, 42] # Always generate version artifacts regardless of test failure https://discuss.circleci.com/t/make-custom-command-run-always-with-when-always/38957/2 steps: - generate_and_store_version_and_filesystem_artifacts + workflows: overall-circleci-commit-status: #These jobs run on every commit jobs: diff --git a/.github/workflows/e2e-flakefinder.yml b/.github/workflows/e2e-flakefinder.yml new file mode 100644 index 00000000000..4eece540c40 --- /dev/null +++ b/.github/workflows/e2e-flakefinder.yml @@ -0,0 +1,61 @@ +name: 'pr:e2e:flakefinder' + +on: + push: + branches: master + workflow_dispatch: + pull_request: + types: + - labeled + - opened + schedule: + - cron: '0 0 * * *' + +jobs: + e2e-flakefinder: + if: contains(github.event.pull_request.labels.*.name, 'pr:e2e:flakefinder') || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || github.event.action == 'opened' + runs-on: ubuntu-latest + timeout-minutes: 120 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 'lts/hydrogen' + + - name: Cache NPM dependencies + uses: actions/cache@v3 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ hashFiles('**/package.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - run: npx playwright@1.39.0 install + - run: npm install --cache ~/.npm --no-audit --progress=false + + - name: Run E2E Tests (Repeated 10 Times) + run: npm run test:e2e:stable -- --retries=0 --repeat-each=10 --max-failures=50 + + - name: Archive test results + if: success() || failure() + uses: actions/upload-artifact@v3 + with: + path: test-results + + - name: Remove pr:e2e:flakefinder label (if present) + if: always() + uses: actions/github-script@v6 + with: + script: | + const { owner, repo, number } = context.issue; + const labelToRemove = 'pr:e2e:flakefinder'; + try { + await github.rest.issues.removeLabel({ + owner, + repo, + issue_number: number, + name: labelToRemove + }); + } catch (error) { + core.warning(`Failed to remove ' + labelToRemove + ' label: ${error.message}`); + } diff --git a/e2e/tests/functional/tooltips.e2e.spec.js b/e2e/tests/functional/tooltips.e2e.spec.js index ebc902cfb93..527593f2172 100644 --- a/e2e/tests/functional/tooltips.e2e.spec.js +++ b/e2e/tests/functional/tooltips.e2e.spec.js @@ -359,7 +359,11 @@ test.describe('Verify tooltips', () => { expect(tooltipText).toBe(sineWaveObject3.path); }); - test('display tooltip path for telemetry table names', async ({ page }) => { + test.fixme('display tooltip path for telemetry table names', async ({ page }) => { + test.info().annotations.push({ + type: 'issue', + description: 'https://github.com/nasa/openmct/issues/7421' + }); // set endBound to 10 seconds after start bound const url = await page.url(); const parsedUrl = new URL(url.replace('#', '!'));