Skip to content

Commit

Permalink
Enforce Check Run API limits
Browse files Browse the repository at this point in the history
  • Loading branch information
Michal Dorner committed Jan 25, 2021
1 parent fdd3509 commit 7af0073
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 11 deletions.
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,9 @@ jobs:
# jest-junit
reporter: ''

# Enables code annotations with error message and stack trace captured during test execution
annotations: 'true'
# Limits number of created annotations with error message and stack trace captured during test execution.
# Must be less or equal to 50.
max-annotations: '10'

# Set action as failed if test report contain any failed test
fail-on-error: 'true'
Expand Down
12 changes: 7 additions & 5 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,24 @@ description: |
Supports .NET (xUnit, NUnit, MSTest), Dart, Flutter and JavaScript (JEST).
author: Michal Dorner <dorner.michal@gmail.com>
inputs:
annotations:
description: Enables code annotations with error message and stack trace captured during test execution
required: true
default: 'true'
fail-on-error:
description: Set this action as failed if test report contain any failed test
required: true
default: 'true'
max-annotations:
description: |
Limits number of created annotations with error message and stack trace captured during test execution.
Must be less or equal to 50.
required: true
default: '10'
name:
description: Name of the check run
required: true
path:
description: |
Coma separated list of paths to test reports
Supports wildcards via [fast-glob](https://github.com/mrmlnc/fast-glob)
All matched files must be of same format
All matched result files must be of same format
required: true
reporter:
description: |
Expand Down
16 changes: 12 additions & 4 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {parseJestJunit} from './parsers/jest-junit/jest-junit-parser'
import {FileContent, ParseOptions, ParseTestResult} from './parsers/parser-types'
import {normalizeDirPath} from './utils/file-utils'
import {listFiles} from './utils/git'
import {getCheckRunSha} from './utils/github-utils'
import {enforceCheckRunLimits, getCheckRunSha} from './utils/github-utils'

async function run(): Promise<void> {
try {
Expand All @@ -19,14 +19,19 @@ async function run(): Promise<void> {
}

async function main(): Promise<void> {
const annotations = core.getInput('annotations', {required: true}) === 'true'
const maxAnnotations = parseInt(core.getInput('max-annotations', {required: true}))
const failOnError = core.getInput('fail-on-error', {required: true}) === 'true'
const name = core.getInput('name', {required: true})
const path = core.getInput('path', {required: true})
const reporter = core.getInput('reporter', {required: true})
const token = core.getInput('token', {required: true})
const workDirInput = core.getInput('working-directory', {required: false})

if (isNaN(maxAnnotations) || maxAnnotations < 0 || maxAnnotations > 50) {
core.setFailed(`Input parameter 'max-annotations' has invalid value`)
return
}

if (workDirInput) {
core.info(`Changing directory to ${workDirInput}`)
process.chdir(workDirInput)
Expand All @@ -37,13 +42,14 @@ async function main(): Promise<void> {
const sha = getCheckRunSha()

// We won't need tracked files if we are not going to create annotations
const annotations = maxAnnotations > 0
const trackedFiles = annotations ? await listFiles() : []

const opts: ParseOptions = {
name,
annotations,
trackedFiles,
workDir
workDir,
annotations
}

const parser = getParser(reporter)
Expand All @@ -58,6 +64,8 @@ async function main(): Promise<void> {
const result = await parser(files, opts)
const conclusion = result.success ? 'success' : 'failure'

enforceCheckRunLimits(result, maxAnnotations)

core.info(`Creating check run '${name}' with conclusion '${conclusion}'`)
await octokit.checks.create({
head_sha: sha,
Expand Down
19 changes: 19 additions & 0 deletions src/utils/github-utils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import * as github from '@actions/github'
import {EventPayloads} from '@octokit/webhooks'

import {TestResult} from '../parsers/parser-types'
import {ellipsis} from './markdown-utils'

export function getCheckRunSha(): string {
if (github.context.payload.pull_request) {
const pr = github.context.payload.pull_request as EventPayloads.WebhookPayloadPullRequestPullRequest
Expand All @@ -9,3 +12,19 @@ export function getCheckRunSha(): string {

return github.context.sha
}

export function enforceCheckRunLimits(result: TestResult, maxAnnotations: number): void {
const output = result.output
if (!output) {
return
}

// Limit number of created annotations
output.annotations?.splice(maxAnnotations + 1)

// Limit number of characters in annotation fields
for (const err of output.annotations ?? []) {
err.title = ellipsis(err.title || '', 255)
err.message = ellipsis(err.message, 65535)
}
}
8 changes: 8 additions & 0 deletions src/utils/markdown-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,11 @@ export function tableEscape(content: ToString): string {
export function fixEol(text?: string): string {
return text?.replace(/\r/g, '') ?? ''
}

export function ellipsis(text: string, maxLength: number): string {
if (text.length <= maxLength) {
return text
}

return text.substr(0, maxLength - 3) + '...'
}

0 comments on commit 7af0073

Please sign in to comment.