diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b107e0..7835fed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 3.1.0 * 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 * Feature: Use NodeJS 24 LTS as default runtime https://github.com/dorny/test-reporter/pull/738 diff --git a/README.md b/README.md index 81d04a5..f6624d8 100644 --- a/README.md +++ b/README.md @@ -225,6 +225,7 @@ jobs: | time | Test execution time [ms] | | url | Check run URL | | 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 | ## Supported formats diff --git a/action.yml b/action.yml index 577b0c3..fb11227 100644 --- a/action.yml +++ b/action.yml @@ -130,6 +130,8 @@ outputs: description: Check run URL 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: description: Random prefix added to generated report anchor slugs for this action run runs: diff --git a/dist/index.js b/dist/index.js index 2847890..8f0b42f 100644 --- a/dist/index.js +++ b/dist/index.js @@ -16015,7 +16015,7 @@ module.exports.fetch = async function fetch (init, options = undefined) { } module.exports.Headers = __nccwpck_require__(660).Headers 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.File = globalThis.File ?? (__nccwpck_require__(4573).File) module.exports.FileReader = __nccwpck_require__(8355).FileReader @@ -27430,7 +27430,7 @@ const { urlEquals, getFieldValues } = __nccwpck_require__(6798) const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(3440) const { webidl } = __nccwpck_require__(5893) 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 { fetching } = __nccwpck_require__(4398) const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(3168) @@ -29744,7 +29744,7 @@ module.exports = { const { pipeline } = __nccwpck_require__(7075) const { fetching } = __nccwpck_require__(4398) -const { makeRequest } = __nccwpck_require__(2348) +const { makeRequest } = __nccwpck_require__(9967) const { webidl } = __nccwpck_require__(5893) const { EventSourceStream } = __nccwpck_require__(4031) const { parseMIMEType } = __nccwpck_require__(1900) @@ -33368,7 +33368,7 @@ const { fromInnerResponse } = __nccwpck_require__(9051) const { HeadersList } = __nccwpck_require__(660) -const { Request, cloneRequest } = __nccwpck_require__(2348) +const { Request, cloneRequest } = __nccwpck_require__(9967) const zlib = __nccwpck_require__(8522) const { bytesMatch, @@ -35632,7 +35632,7 @@ module.exports = { /***/ }), -/***/ 2348: +/***/ 9967: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { /* globals AbortController */ @@ -40814,7 +40814,7 @@ const { const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = __nccwpck_require__(8625) const { channels } = __nccwpck_require__(2414) const { CloseEvent } = __nccwpck_require__(5188) -const { makeRequest } = __nccwpck_require__(2348) +const { makeRequest } = __nccwpck_require__(9967) const { fetching } = __nccwpck_require__(4398) const { Headers, getHeadersList } = __nccwpck_require__(660) const { getDecodeSplit } = __nccwpck_require__(3168) @@ -56445,6 +56445,12 @@ function getOctokit(token, options, ...additionalPlugins) { //# sourceMappingURL=github.js.map // EXTERNAL MODULE: external "node:crypto" 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 var adm_zip = __nccwpck_require__(1316); // EXTERNAL MODULE: ./node_modules/picomatch/index.js @@ -58932,6 +58938,9 @@ class NetteTesterJunitParser { + + + @@ -59089,6 +59098,7 @@ class TestReporter { }, shortSummary); info('Summary content:'); info(summary); + this.writeSummaryFile(summary); await summary_summary.addRaw(summary).write(); } else { @@ -59119,6 +59129,7 @@ class TestReporter { }); info('Creating annotations'); const annotations = getAnnotations(results, this.maxAnnotations); + this.writeSummaryFile(summary); const isFailed = this.failOnError && results.some(tr => tr.result === 'failed'); const conclusion = isFailed ? 'failure' : 'success'; info(`Updating check run conclusion (${conclusion}) and output`); @@ -59141,6 +59152,13 @@ class TestReporter { } 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) { switch (reporter) { case 'dart-json': diff --git a/src/main.ts b/src/main.ts index eb1b3a5..62da4bc 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,6 +2,9 @@ import * as core from '@actions/core' import * as github from '@actions/github' import {GitHub} from '@actions/github/lib/utils' 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 {LocalFileProvider} from './input-providers/local-file-provider.js' @@ -221,6 +224,7 @@ class TestReporter { core.info('Summary content:') core.info(summary) + this.writeSummaryFile(summary) await core.summary.addRaw(summary).write() } else { core.info(`Creating check run ${name}`) @@ -252,6 +256,7 @@ class TestReporter { core.info('Creating annotations') const annotations = getAnnotations(results, this.maxAnnotations) + this.writeSummaryFile(summary) const isFailed = this.failOnError && results.some(tr => tr.result === 'failed') const conclusion = isFailed ? 'failure' : 'success' @@ -278,6 +283,14 @@ class TestReporter { 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 { switch (reporter) { case 'dart-json':