1
0
Fork 0
mirror of https://github.com/dorny/test-reporter.git synced 2026-05-06 18:47:35 +02:00

Merge pull request #772 from dorny/codex/summary-output

This commit is contained in:
Jozef Izso 2026-04-25 14:21:30 +02:00 committed by GitHub
commit 29672c52a8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 41 additions and 6 deletions

View file

@ -2,6 +2,7 @@
## 3.1.0 ## 3.1.0
* Feature: Add `list-files` input to control test report file listing https://github.com/dorny/test-reporter/pull/773 * Feature: Add `list-files` input to control test report file listing https://github.com/dorny/test-reporter/pull/773
* Feature: Add `summary_file` output with the path to the generated summary in Markdown format https://github.com/dorny/test-reporter/pull/772
## 3.0.0 ## 3.0.0
* Feature: Use NodeJS 24 LTS as default runtime https://github.com/dorny/test-reporter/pull/738 * Feature: Use NodeJS 24 LTS as default runtime https://github.com/dorny/test-reporter/pull/738

View file

@ -225,6 +225,7 @@ jobs:
| time | Test execution time [ms] | | time | Test execution time [ms] |
| url | Check run URL | | url | Check run URL |
| url_html | Check run URL HTML | | url_html | Check run URL HTML |
| summary_file | Path to a file containing the generated test report summary in Markdown format |
| slug_prefix| Random anchor links slug prefix generated for the summary headers | | slug_prefix| Random anchor links slug prefix generated for the summary headers |
## Supported formats ## Supported formats

View file

@ -130,6 +130,8 @@ outputs:
description: Check run URL description: Check run URL
url_html: url_html:
description: Check run URL HTML description: Check run URL HTML
summary_file:
description: Path to a file containing the generated test report summary in Markdown format
slug_prefix: slug_prefix:
description: Random prefix added to generated report anchor slugs for this action run description: Random prefix added to generated report anchor slugs for this action run
runs: runs:

30
dist/index.js generated vendored
View file

@ -16015,7 +16015,7 @@ module.exports.fetch = async function fetch (init, options = undefined) {
} }
module.exports.Headers = __nccwpck_require__(660).Headers module.exports.Headers = __nccwpck_require__(660).Headers
module.exports.Response = __nccwpck_require__(9051).Response module.exports.Response = __nccwpck_require__(9051).Response
module.exports.Request = __nccwpck_require__(2348).Request module.exports.Request = __nccwpck_require__(9967).Request
module.exports.FormData = __nccwpck_require__(5910).FormData module.exports.FormData = __nccwpck_require__(5910).FormData
module.exports.File = globalThis.File ?? (__nccwpck_require__(4573).File) module.exports.File = globalThis.File ?? (__nccwpck_require__(4573).File)
module.exports.FileReader = __nccwpck_require__(8355).FileReader module.exports.FileReader = __nccwpck_require__(8355).FileReader
@ -27430,7 +27430,7 @@ const { urlEquals, getFieldValues } = __nccwpck_require__(6798)
const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(3440) const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(3440)
const { webidl } = __nccwpck_require__(5893) const { webidl } = __nccwpck_require__(5893)
const { Response, cloneResponse, fromInnerResponse } = __nccwpck_require__(9051) const { Response, cloneResponse, fromInnerResponse } = __nccwpck_require__(9051)
const { Request, fromInnerRequest } = __nccwpck_require__(2348) const { Request, fromInnerRequest } = __nccwpck_require__(9967)
const { kState } = __nccwpck_require__(3627) const { kState } = __nccwpck_require__(3627)
const { fetching } = __nccwpck_require__(4398) const { fetching } = __nccwpck_require__(4398)
const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(3168) const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(3168)
@ -29744,7 +29744,7 @@ module.exports = {
const { pipeline } = __nccwpck_require__(7075) const { pipeline } = __nccwpck_require__(7075)
const { fetching } = __nccwpck_require__(4398) const { fetching } = __nccwpck_require__(4398)
const { makeRequest } = __nccwpck_require__(2348) const { makeRequest } = __nccwpck_require__(9967)
const { webidl } = __nccwpck_require__(5893) const { webidl } = __nccwpck_require__(5893)
const { EventSourceStream } = __nccwpck_require__(4031) const { EventSourceStream } = __nccwpck_require__(4031)
const { parseMIMEType } = __nccwpck_require__(1900) const { parseMIMEType } = __nccwpck_require__(1900)
@ -33368,7 +33368,7 @@ const {
fromInnerResponse fromInnerResponse
} = __nccwpck_require__(9051) } = __nccwpck_require__(9051)
const { HeadersList } = __nccwpck_require__(660) const { HeadersList } = __nccwpck_require__(660)
const { Request, cloneRequest } = __nccwpck_require__(2348) const { Request, cloneRequest } = __nccwpck_require__(9967)
const zlib = __nccwpck_require__(8522) const zlib = __nccwpck_require__(8522)
const { const {
bytesMatch, bytesMatch,
@ -35632,7 +35632,7 @@ module.exports = {
/***/ }), /***/ }),
/***/ 2348: /***/ 9967:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
/* globals AbortController */ /* globals AbortController */
@ -40814,7 +40814,7 @@ const {
const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = __nccwpck_require__(8625) const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = __nccwpck_require__(8625)
const { channels } = __nccwpck_require__(2414) const { channels } = __nccwpck_require__(2414)
const { CloseEvent } = __nccwpck_require__(5188) const { CloseEvent } = __nccwpck_require__(5188)
const { makeRequest } = __nccwpck_require__(2348) const { makeRequest } = __nccwpck_require__(9967)
const { fetching } = __nccwpck_require__(4398) const { fetching } = __nccwpck_require__(4398)
const { Headers, getHeadersList } = __nccwpck_require__(660) const { Headers, getHeadersList } = __nccwpck_require__(660)
const { getDecodeSplit } = __nccwpck_require__(3168) const { getDecodeSplit } = __nccwpck_require__(3168)
@ -56445,6 +56445,12 @@ function getOctokit(token, options, ...additionalPlugins) {
//# sourceMappingURL=github.js.map //# sourceMappingURL=github.js.map
// EXTERNAL MODULE: external "node:crypto" // EXTERNAL MODULE: external "node:crypto"
var external_node_crypto_ = __nccwpck_require__(7598); var external_node_crypto_ = __nccwpck_require__(7598);
;// CONCATENATED MODULE: external "node:fs"
const external_node_fs_namespaceObject = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("node:fs");
;// CONCATENATED MODULE: external "node:os"
const external_node_os_namespaceObject = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("node:os");
;// CONCATENATED MODULE: external "node:path"
const external_node_path_namespaceObject = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("node:path");
// EXTERNAL MODULE: ./node_modules/adm-zip/adm-zip.js // EXTERNAL MODULE: ./node_modules/adm-zip/adm-zip.js
var adm_zip = __nccwpck_require__(1316); var adm_zip = __nccwpck_require__(1316);
// EXTERNAL MODULE: ./node_modules/picomatch/index.js // EXTERNAL MODULE: ./node_modules/picomatch/index.js
@ -58932,6 +58938,9 @@ class NetteTesterJunitParser {
@ -59089,6 +59098,7 @@ class TestReporter {
}, shortSummary); }, shortSummary);
info('Summary content:'); info('Summary content:');
info(summary); info(summary);
this.writeSummaryFile(summary);
await summary_summary.addRaw(summary).write(); await summary_summary.addRaw(summary).write();
} }
else { else {
@ -59119,6 +59129,7 @@ class TestReporter {
}); });
info('Creating annotations'); info('Creating annotations');
const annotations = getAnnotations(results, this.maxAnnotations); const annotations = getAnnotations(results, this.maxAnnotations);
this.writeSummaryFile(summary);
const isFailed = this.failOnError && results.some(tr => tr.result === 'failed'); const isFailed = this.failOnError && results.some(tr => tr.result === 'failed');
const conclusion = isFailed ? 'failure' : 'success'; const conclusion = isFailed ? 'failure' : 'success';
info(`Updating check run conclusion (${conclusion}) and output`); info(`Updating check run conclusion (${conclusion}) and output`);
@ -59141,6 +59152,13 @@ class TestReporter {
} }
return results; return results;
} }
writeSummaryFile(summary) {
const dir = process.env.RUNNER_TEMP || (0,external_node_os_namespaceObject.tmpdir)();
const file = (0,external_node_path_namespaceObject.join)(dir, `test-reporter-summary-${(0,external_node_crypto_.randomBytes)(8).toString('hex')}.md`);
(0,external_node_fs_namespaceObject.writeFileSync)(file, summary);
info(`Summary written to ${file}`);
setOutput('summary_file', file);
}
getParser(reporter, options) { getParser(reporter, options) {
switch (reporter) { switch (reporter) {
case 'dart-json': case 'dart-json':

View file

@ -2,6 +2,9 @@ import * as core from '@actions/core'
import * as github from '@actions/github' import * as github from '@actions/github'
import {GitHub} from '@actions/github/lib/utils' import {GitHub} from '@actions/github/lib/utils'
import {randomBytes} from 'node:crypto' import {randomBytes} from 'node:crypto'
import {writeFileSync} from 'node:fs'
import {tmpdir} from 'node:os'
import {join} from 'node:path'
import {ArtifactProvider} from './input-providers/artifact-provider.js' import {ArtifactProvider} from './input-providers/artifact-provider.js'
import {LocalFileProvider} from './input-providers/local-file-provider.js' import {LocalFileProvider} from './input-providers/local-file-provider.js'
@ -221,6 +224,7 @@ class TestReporter {
core.info('Summary content:') core.info('Summary content:')
core.info(summary) core.info(summary)
this.writeSummaryFile(summary)
await core.summary.addRaw(summary).write() await core.summary.addRaw(summary).write()
} else { } else {
core.info(`Creating check run ${name}`) core.info(`Creating check run ${name}`)
@ -252,6 +256,7 @@ class TestReporter {
core.info('Creating annotations') core.info('Creating annotations')
const annotations = getAnnotations(results, this.maxAnnotations) const annotations = getAnnotations(results, this.maxAnnotations)
this.writeSummaryFile(summary)
const isFailed = this.failOnError && results.some(tr => tr.result === 'failed') const isFailed = this.failOnError && results.some(tr => tr.result === 'failed')
const conclusion = isFailed ? 'failure' : 'success' const conclusion = isFailed ? 'failure' : 'success'
@ -278,6 +283,14 @@ class TestReporter {
return results return results
} }
writeSummaryFile(summary: string): void {
const dir = process.env.RUNNER_TEMP || tmpdir()
const file = join(dir, `test-reporter-summary-${randomBytes(8).toString('hex')}.md`)
writeFileSync(file, summary)
core.info(`Summary written to ${file}`)
core.setOutput('summary_file', file)
}
getParser(reporter: string, options: ParseOptions): TestParser { getParser(reporter: string, options: ParseOptions): TestParser {
switch (reporter) { switch (reporter) {
case 'dart-json': case 'dart-json':