From 82f0e2cd54f8fd84c75beebe2853fbf63ff1dab9 Mon Sep 17 00:00:00 2001 From: Tre Date: Mon, 16 Dec 2024 17:05:20 +0000 Subject: [PATCH] [Ownership] Add code owner to ftr failure report (#203076) ## Summary Resolves: https://github.com/elastic/kibana/issues/202687 ### For Reviewers #### To test locally, make a test fail, something like ``` diff --git a/test/functional/apps/console/_autocomplete.ts b/test/functional/apps/console/_autocomplete.ts index 0e29b29e96e..78976e6d54b 100644 --- a/test/functional/apps/console/_autocomplete.ts +++ b/test/functional/apps/console/_autocomplete.ts @@ -50,14 +50,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.console.setAutocompleteTrace(false); }); - it('should provide basic auto-complete functionality', async () => { + it.only('should provide basic auto-complete functionality', async () => { await PageObjects.console.enterText(`GET _search\n`); await PageObjects.console.pressEnter(); await PageObjects.console.enterText(`{\n\t"query": {`); await PageObjects.console.pressEnter(); await PageObjects.console.sleepForDebouncePeriod(); await PageObjects.console.promptAutocomplete(); - expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(true); + expect(false).to.be.eql(true); }); it('should not show duplicate suggestions', async () => { ``` #### Then run the tests: `TEST_BROWSER_HEADLESS=1 CI=1 node scripts/functional_tests --config=test/functional/apps/console/config.ts --bail` #### Then run the reporter to see the html file `JOB_NAME=elastic+kibana+7.x node scripts/report_failed_tests --build-url="${BUILDKITE_BUILD_URL}#${BUILDKITE_JOB_ID}" 'target/junit/**/*.xml' --no-github-update --no-index-errors` #### Lastly, inspect the HTML File `grep elastic target/test_failures/*.html -B 2` ```
Owners:
elastic/kibana-management
--
https://github.com/elastic/kibana/issues/156926 --
Stdout
Failed Tests Reporter:
  - Test has failed 1 times on tracked branches: https://github.com/elastic/kibana/issues/156926

Failed Tests Reporter:
  - Test has failed 1 times on tracked branches: https://github.com/elastic/kibana/issues/156926

Failed Tests Reporter:
  - Test has failed 1 times on tracked branches: https://github.com/elastic/kibana/issues/156926
```

Notice the `
elastic/kibana-management
` in the output of grep Also, you can continue verification of the ownership value, via: `node scripts/get_owners_for_file.js --file test/functional/apps/console/_autocomplete.ts` ``` succ Found matching entry in .github/CODEOWNERS: test/functional/apps/console/*.ts elastic/kibana-management ``` --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine --- .../failed_tests_reporter/__fixtures__/ftr_report.xml | 8 ++++---- .../failed_tests_reporter/add_messages_to_report.test.ts | 8 ++++---- .../failed_tests_reporter/get_failures.test.ts | 6 ++++++ .../failed_tests_reporter/get_failures.ts | 3 +++ .../failed_tests_reporter/report_failures_to_file.ts | 6 ++++++ .../failed_tests_reporter/test_report.ts | 5 ++++- 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/__fixtures__/ftr_report.xml b/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/__fixtures__/ftr_report.xml index 07f1e79b0f5df..77c0d7691d22d 100644 --- a/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/__fixtures__/ftr_report.xml +++ b/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/__fixtures__/ftr_report.xml @@ -1,7 +1,7 @@ - + - + - + - + { ‹?xml version="1.0" encoding="utf-8"?› ‹testsuites name="ftr" timestamp="2019-06-05T23:37:10" time="903.670" tests="129" failures="5" skipped="71" command-line="node scripts/functional_tests --config=x-pack/test/api_integration/apis/status/config.ts"› ‹testsuite timestamp="2019-06-05T23:37:10" time="903.670" tests="129" failures="5" skipped="71" command-line="node scripts/functional_tests --config=x-pack/test/api_integration/apis/status/config.ts"› - ‹testcase name="maps app maps loaded from sample data ecommerce "before all" hook" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/maps/sample_data·js" time="154.378"› + ‹testcase name="maps app maps loaded from sample data ecommerce "before all" hook" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/maps/sample_data·js" time="154.378" owners="elastic/kibana-presentation"› - ‹system-out› - ‹![CDATA[[00:00:00] │ + ‹system-out›Failed Tests Reporter: @@ -88,7 +88,7 @@ it('rewrites ftr reports with minimal changes', async () => { + at onFailure (/var/lib/jenkins/workspace/elastic+kibana+master/JOB/x-pack-ciGroup7/node/immutable/kibana/test/common/services/retry/retry_for_success.ts:68:13) ‹/failure› ‹/testcase› - ‹testcase name="maps app "after all" hook" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/maps" time="0.179" metadata-json="{"messages":["foo"],"screenshots":[{"name":"failure[dashboard app using current data dashboard snapshots compare TSVB snapshot]","url":"https://storage.googleapis.com/kibana-ci-artifacts/jobs/elastic+kibana+7.x/1632/kibana-oss-tests/test/functional/screenshots/failure/dashboard%20app%20using%20current%20data%20dashboard%20snapshots%20compare%20TSVB%20snapshot.png"}]}"› + ‹testcase name="maps app "after all" hook" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/maps" time="0.179" metadata-json="{"messages":["foo"],"screenshots":[{"name":"failure[dashboard app using current data dashboard snapshots compare TSVB snapshot]","url":"https://storage.googleapis.com/kibana-ci-artifacts/jobs/elastic+kibana+7.x/1632/kibana-oss-tests/test/functional/screenshots/failure/dashboard%20app%20using%20current%20data%20dashboard%20snapshots%20compare%20TSVB%20snapshot.png"}]}" owners="elastic/kibana-presentation"› ‹system-out› - ‹![CDATA[[00:00:00] │ + [00:00:00] │ @@ -106,7 +106,7 @@ it('rewrites ftr reports with minimal changes', async () => { + at process._tickCallback (internal/process/next_tick.js:68:7) name: 'NoSuchSessionError', remoteStacktrace: '' } ‹/failure› ‹/testcase› - ‹testcase name="InfraOps app feature controls infrastructure security global infrastructure all privileges shows infrastructure navlink" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/infra/feature_controls/infrastructure_security·ts"› + ‹testcase name="InfraOps app feature controls infrastructure security global infrastructure all privileges shows infrastructure navlink" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/infra/feature_controls/infrastructure_security·ts" owners="elastic/kibana-presentation"› ‹system-out› - ‹![CDATA[[00:00:00] │ + [00:00:00] │ @@ -117,7 +117,7 @@ it('rewrites ftr reports with minimal changes', async () => { ‹/system-out› ‹skipped/› ‹/testcase› - ‹testcase name="machine learning anomaly detection saved search with lucene query job creation opens the advanced section" classname="Firefox XPack UI Functional Tests.x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job·ts" time="6.040"› + ‹testcase name="machine learning anomaly detection saved search with lucene query job creation opens the advanced section" classname="Firefox XPack UI Functional Tests.x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job·ts" time="6.040" owners="elastic/ml-ui"› - ‹system-out›‹![CDATA[[00:21:57] └-: machine learning...]]›‹/system-out› - ‹failure›‹![CDATA[{ NoSuchSessionError: Tried to run command without establishing a connection + ‹system-out›[00:21:57] └-: machine learning...‹/system-out› diff --git a/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/get_failures.test.ts b/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/get_failures.test.ts index b00ef8cb6bc49..52d2858232d52 100644 --- a/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/get_failures.test.ts +++ b/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/get_failures.test.ts @@ -28,6 +28,7 @@ it('discovers failures in ftr report', async () => { ", "likelyIrrelevant": false, "name": "maps app maps loaded from sample data ecommerce \\"before all\\" hook", + "owners": "elastic/kibana-presentation", "system-out": " [00:00:00] │ [00:07:04] └-: maps app @@ -49,6 +50,7 @@ it('discovers failures in ftr report', async () => { "likelyIrrelevant": true, "metadata-json": "{\\"messages\\":[\\"foo\\"],\\"screenshots\\":[{\\"name\\":\\"failure[dashboard app using current data dashboard snapshots compare TSVB snapshot]\\",\\"url\\":\\"https://storage.googleapis.com/kibana-ci-artifacts/jobs/elastic+kibana+7.x/1632/kibana-oss-tests/test/functional/screenshots/failure/dashboard%20app%20using%20current%20data%20dashboard%20snapshots%20compare%20TSVB%20snapshot.png\\"}]}", "name": "maps app \\"after all\\" hook", + "owners": "elastic/kibana-presentation", "system-out": " [00:00:00] │ [00:07:04] └-: maps app @@ -67,6 +69,7 @@ it('discovers failures in ftr report', async () => { at process._tickCallback (internal/process/next_tick.js:68:7) name: 'NoSuchSessionError', remoteStacktrace: '' }", "likelyIrrelevant": true, "name": "machine learning anomaly detection saved search with lucene query job creation opens the advanced section", + "owners": "elastic/ml-ui", "system-out": "[00:21:57] └-: machine learning...", "time": "6.040", }, @@ -87,6 +90,7 @@ it('discovers failures in jest report', async () => { ", "likelyIrrelevant": false, "name": "launcher can reconnect if process died", + "owners": undefined, "system-out": "", "time": "7.060", }, @@ -116,6 +120,7 @@ it('discovers failures in mocha report', async () => { ", "likelyIrrelevant": true, "name": "code in multiple nodes \\"before all\\" hook", + "owners": undefined, "system-out": " ", @@ -131,6 +136,7 @@ it('discovers failures in mocha report', async () => { ", "likelyIrrelevant": true, "name": "code in multiple nodes \\"after all\\" hook", + "owners": undefined, "system-out": " ", diff --git a/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/get_failures.ts b/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/get_failures.ts index dd5e846dfc01e..d65773810ddf4 100644 --- a/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/get_failures.ts +++ b/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/get_failures.ts @@ -18,6 +18,7 @@ export type TestFailure = FailedTestCase['$'] & { githubIssue?: string; failureCount?: number; commandLine?: string; + owners?: any; }; const getText = (node?: Array) => { @@ -78,6 +79,7 @@ export function getFailures(report: TestReport) { for (const testCase of makeFailedTestCaseIter(report)) { const failure = getText(testCase.failure); const likelyIrrelevant = isLikelyIrrelevant(testCase.$.name, failure); + const owners = testCase.$.owners; const failureObj = { // unwrap xml weirdness @@ -87,6 +89,7 @@ export function getFailures(report: TestReport) { likelyIrrelevant, 'system-out': getText(testCase['system-out']), commandLine, + owners, }; // cleaning up duplicates diff --git a/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/report_failures_to_file.ts b/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/report_failures_to_file.ts index b1e3997ebf030..049aff3dcdef1 100644 --- a/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/report_failures_to_file.ts +++ b/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/report_failures_to_file.ts @@ -179,6 +179,12 @@ export async function reportFailuresToFile(
` : '' } +
+ Owners: +
${escape(
+                  failure?.owners ? (failure?.owners as string) : 'Unable to determine code owners'
+                )}
+
Failures in tracked branches: ${failure.failureCount || 0} diff --git a/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/test_report.ts b/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/test_report.ts index e56e4a6810efd..6467cfaab14be 100644 --- a/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/test_report.ts +++ b/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/test_report.ts @@ -11,7 +11,6 @@ import Fs from 'fs'; import { promisify } from 'util'; import xml2js from 'xml2js'; - const readAsync = promisify(Fs.readFile); export type TestReport = @@ -40,6 +39,8 @@ export interface TestSuite { 'metadata-json'?: string; /* the command that ran this suite */ 'command-line'?: string; + /* the codeowners of the file */ + owners?: string; }; testcase?: TestCase[]; } @@ -56,6 +57,8 @@ export interface TestCase { 'metadata-json'?: string; /* the command that ran this suite */ 'command-line'?: string; + /* the codeowners of the file */ + owners?: string; }; /* contents of system-out elements */ 'system-out'?: Array;