/jest-coverage-report-action

Track your code coverage in every pull request.

Primary LanguageTypeScriptMIT LicenseMIT

jest coverage report ๐Ÿงช

PR Comment example

A GitHub action that reports about your code coverage in every pull request.

MIT License Issues

This action uses Jest to extract code coverage, and comments it on pull request. Inspired by Size-limit action. Features:

  • Reporting code coverage on each pull request. ๐Ÿ“ƒ
  • Rejecting pull request, if coverage is under threshold. โŒ
  • Comparing coverage with base branch. ๐Ÿ”
  • Showing spoiler in the comment for all new covered files. ๐Ÿ†•
  • Showing spoiler in the comment for all files, in which coverage was reduced. ๐Ÿ”ป
  • Failed tests & uncovered line annotations ๐Ÿ“ข

PR Comment example

Usage

  1. Install and configure Jest.
  2. Create new action inside .github/workflows:

Minimal configuration

name: 'coverage'
on:
    pull_request:
        branches:
            - master
            - main
jobs:
    coverage:
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v3
            - uses: ArtiomTr/jest-coverage-report-action@v2
  1. Pay attention to the action parameters. You can specify custom threshold or test script
  2. That's it!

Forks with no write permission

If you're seeing this error in your action's console:

HttpError: Resource not accessible by integration
    at /home/runner/work/_actions/ArtiomTr/jest-coverage-report-action/v2/dist/index.js:8:323774
    at processTicsAndRejections (node:internal/process/task_queues:96:5)
    at async /home/runner/work/_actions/ArtiomTr/jest-coverage-report-action/v2/dist/index.js:64:2535
    at async Ie (/home/runner/work/_actions/ArtiomTr/jest-coverage-report-action/v2/dist/index.js:63:156)
    at async S_ (/home/runner/work/_actions/ArtiomTr/jest-coverage-report-action/v2/dist/index.js:64:2294)

It means that action is running with low privileges. By default, pull_request event doesn't have any write permissions, when PR is coming from fork. To fix that, change trigger action to pull_request_target:

name: 'coverage'
on:
    pull_request_target:
        branches:
            - master
            - main
jobs:
    coverage:
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v3
            - uses: ArtiomTr/jest-coverage-report-action@v2

Warning

This brings worse DX - you can test action only when it is merged into your main branch. Any changes to the workflow file will be taken only after merging them to the main branch

Custom token

By default, this action takes github.token variable to publish reports on your PR. You can overwrite this property by specifying:

with:
    github-token: ${{ secrets.SECRET_TOKEN }}

Specify threshold

This action automatically suports jest's coverageThreshold property. Just add into your jest.config.js file:

module.exports = {
    coverageThreshold: {
        global: {
            lines: 80,
        },
    },
};

Custom working directory

If you want to run this action in custom directory, specify working-directory:

with:
    working-directory: <dir>

Customizing test script

This action automatically adds necessary flags to your test script. The default script is:

npx jest

So you don't need to specify additional flags - action will handle them automatically. So, after adding necessary flags, action will run this command:

npx jest --ci --json --coverage --testLocationInResults --outputFile=report.json

But you do not need to specify these flags manually. Also, you can use different package manager, yarn for example:

with:
    test-script: yarn jest

Or, if you would like to run a script from your package.json:

with:
    test-script: npm test

Usage with yarn pnpm, or bun

By default, this action will install your dependencies using npm. If you are using yarn, pnpm, or bun, you can specify it in the package-manager option:

with:
    package-manager: yarn

or

with:
    package-manager: pnpm

or

with:
    package-manager: bun

Use existing test report(s)

To bypass running unit tests, you can pass the filepath to the current report.json

with:
    coverage-file: ./coverage/report.json
    base-coverage-file: ./coverage/master/report.json
  • coverage-file is the filepath to the JSON coverage report for the current pull request.
  • base-coverage-file is the filepath to the JSON coverage report from the branch your pull request is merging into.

For example, you can save every test run to an artifact and then download and reference them here.

Opt-out coverage comparison features

You can opt-out coverage comparison features to speed-up action. To achieve this, firstly, manually collect coverage to report.json file. Then, specify these options for the action:

with:
    coverage-file: report.json
    base-coverage-file: report.json

Skipping steps

Note: this option affects only coverage for the "head" branch. For skipping steps of "base" branch, see base-coverage-file option.

By default, this action will install dependencies and run the tests for you, generating the coverage report. Alternatively, you can skip these steps using the skip-step option.

with:
    skip-step: all

Accepted values are:

  • none (default) - all steps will be run
  • install - skip installing dependencies
  • all - skip installing dependencies and running the test script

Change annotations

To change annotations, you have to set the annotations option as shown below:

with:
    annotations: none

Accepted values are:

  • all (default) - Will annotate sections of your code that failed tests or test did not cover
  • none - Turns off annotations
  • coverage - Will annotate those sections of your code that test did not cover. Limited to changed lines when used on a Pull Request
  • failed-tests - Will annotate those sections of your code that failed test

Outputs

By default, action attaches comment to a pull request or commit. However, if you want to use other action for publishing report, you can specify output: report-markdown:

- uses: ArtiomTr/jest-coverage-report-action@v2
    # give the id for the step, to access outputs in another step.
    id: coverage
    with:
        # tell to the action to not attach comment.
        output: report-markdown
- uses: marocchino/sticky-pull-request-comment@v2
    with:
        # pass output from the previous step by id.
        message: ${{ steps.coverage.outputs.report }}

Also, you can use this data on other platforms. For instance, you can send report to your Slack or Jira.

Note: Working examples of integrations with different platforms are much appreciated! Feel free to open a PR.

Available options are:

  • comment - Attach comment to PR or commit, depending on event type, which triggered an action.
  • report-markdown - Generate output "report", with report contents in markdown format.

Also, you can combine these options:

with:
    # This will attach comment to a PR and generate markdown output.
    output: comment, report-markdown

Pull Request Number

If you are using the push event to trigger this action, by default it does not know which PR to comment on or the base branch of the PR to compare code coverage with.

You can pass the prnumber to the action so that coverage change can be run and comments will be updated on each push, instead of creating a new comment with each run of the action.

You can find the PR number with a number of methods, the jwalton/gh-find-current-pr action makes it easy:

name: 'coverage'
on:
    push:
        branches:
            - master
            - main
jobs:
    coverage:
        permissions:
            checks: write
            pull-requests: write
            contents: write
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v1
            - uses: jwalton/gh-find-current-pr@v1
                id: findPr
            - uses: ArtiomTr/jest-coverage-report-action@v2
                with:
                   prnumber: ${{ steps.findPr.outputs.number }}

Customizing report title

If you're running this action multiple times (for instance, when dealing with monorepos), you'll need to distinguish reports from different runs. To do so, you can use the custom-title property:

with:
    custom-title: Coverage report for backend

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

Jest Coverage Report action is made with <3 thanks to these wonderful people (emoji key โœจ):

Artiom Tretjakovas
Artiom Tretjakovas

๐Ÿ’ป ๐Ÿ“– ๐Ÿ‘€ ๐Ÿšง ๐Ÿ–‹
Guilherme Taschetto
Guilherme Taschetto

๐Ÿ’ป ๐Ÿ“–
Adam Tuttle
Adam Tuttle

๐Ÿ’ป
dadayama
dadayama

๐Ÿ’ป
bluelovers
bluelovers

๐Ÿ“–
gdelahodde-masteos
gdelahodde-masteos

๐Ÿ’ป ๐Ÿ“–
jlim9333
jlim9333

๐Ÿ’ป
Jeremy Gillick
Jeremy Gillick

๐Ÿ’ป ๐Ÿ“–
Matej Zajo Kralik
Matej Zajo Kralik

๐Ÿ’ป
Sidharth Vinod
Sidharth Vinod

๐Ÿ’ป
Jaylen Wimbish
Jaylen Wimbish

๐Ÿ“–
princeIta
princeIta

๐Ÿ“–
Brian Whitton
Brian Whitton

๐Ÿ’ป ๐Ÿ›
Bohdan Petryshyn
Bohdan Petryshyn

๐Ÿ’ป
Herbert Treis Neto
Herbert Treis Neto

๐Ÿ’ป
Thomas Patrick Levy
Thomas Patrick Levy

๐Ÿ’ป
Lauris Mikฤls
Lauris Mikฤls

๐Ÿ’ป
Rena Hamada
Rena Hamada

๐Ÿ“–
JacobLinCool
JacobLinCool

๐Ÿ’ป ๐Ÿ“–
Tommaso Ferrari
Tommaso Ferrari

๐Ÿ’ป
Florian
Florian

๐Ÿ’ป
Hirotaka Miyagi
Hirotaka Miyagi

๐Ÿ’ป
Armando Faz
Armando Faz

๐Ÿ’ป
Maciej Tutak
Maciej Tutak

๐Ÿ’ป
Niko Oshinov
Niko Oshinov

๐Ÿ“–
Dale Fenton
Dale Fenton

๐Ÿ“– ๐Ÿ’ป
Florent Jaby
Florent Jaby

๐Ÿ’ป
vikasperi
vikasperi

๐Ÿ’ป
Chow Loong Jin
Chow Loong Jin

๐Ÿ› ๐Ÿ’ป
Anton Joy
Anton Joy

๐Ÿ’ป
Danny Lan
Danny Lan

๐Ÿ’ป
Brian Cooper
Brian Cooper

๐Ÿ’ป
syossan27
syossan27

๐Ÿ’ป

License

MIT ยฉ Artiom Tretjakovas