
Historically, every PR, push, etc. to Spack generates a bunch of jobs, each of which uploads its coverage report to codecov independently. This means that we get annoying partial coverage numbers when only a few of the jobs have finished, and frequently codecov is bad at understanding when to merge reports for a given PR. The numbers of the site can be weird as a result. This restructures our coverage handling so that we do all the merging ourselves and upload exactly one report per GitHub actions workflow. In practice, that means that every push to every PR will get exactly one coverage report and exactly one coverage number reported. I think this will at least partially restore peoples' faith in what codecov is telling them, and it might even make codecov handle Spack a bit better, since this reduces the report burden by ~7x. - [x] test and audit jobs now upload artifacts for coverage - [x] add a new job that downloads artifacts and merges coverage reports together - [x] set `paths` section of `pyproject.toml` so that cross-platform clone locations are merged - [x] upload to codecov once, at the end of the workflow Signed-off-by: Todd Gamblin <tgamblin@llnl.gov>
115 lines
4.0 KiB
YAML
115 lines
4.0 KiB
YAML
name: ci
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- develop
|
|
- releases/**
|
|
pull_request:
|
|
branches:
|
|
- develop
|
|
- releases/**
|
|
|
|
concurrency:
|
|
group: ci-${{github.ref}}-${{github.event.pull_request.number || github.run_number}}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
prechecks:
|
|
needs: [ changes ]
|
|
uses: ./.github/workflows/valid-style.yml
|
|
secrets: inherit
|
|
with:
|
|
with_coverage: ${{ needs.changes.outputs.core }}
|
|
all-prechecks:
|
|
needs: [ prechecks ]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Success
|
|
run: "true"
|
|
# Check which files have been updated by the PR
|
|
changes:
|
|
runs-on: ubuntu-latest
|
|
# Set job outputs to values from filter step
|
|
outputs:
|
|
bootstrap: ${{ steps.filter.outputs.bootstrap }}
|
|
core: ${{ steps.filter.outputs.core }}
|
|
packages: ${{ steps.filter.outputs.packages }}
|
|
steps:
|
|
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
|
if: ${{ github.event_name == 'push' }}
|
|
with:
|
|
fetch-depth: 0
|
|
# For pull requests it's not necessary to checkout the code
|
|
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36
|
|
id: filter
|
|
with:
|
|
# See https://github.com/dorny/paths-filter/issues/56 for the syntax used below
|
|
# Don't run if we only modified packages in the
|
|
# built-in repository or documentation
|
|
filters: |
|
|
bootstrap:
|
|
- 'var/spack/repos/builtin/packages/clingo-bootstrap/**'
|
|
- 'var/spack/repos/builtin/packages/clingo/**'
|
|
- 'var/spack/repos/builtin/packages/python/**'
|
|
- 'var/spack/repos/builtin/packages/re2c/**'
|
|
- 'var/spack/repos/builtin/packages/gnupg/**'
|
|
- 'var/spack/repos/builtin/packages/libassuan/**'
|
|
- 'var/spack/repos/builtin/packages/libgcrypt/**'
|
|
- 'var/spack/repos/builtin/packages/libgpg-error/**'
|
|
- 'var/spack/repos/builtin/packages/libksba/**'
|
|
- 'var/spack/repos/builtin/packages/npth/**'
|
|
- 'var/spack/repos/builtin/packages/pinentry/**'
|
|
- 'lib/spack/**'
|
|
- 'share/spack/**'
|
|
- '.github/workflows/bootstrap.yml'
|
|
- '.github/workflows/ci.yaml'
|
|
core:
|
|
- './!(var/**)/**'
|
|
packages:
|
|
- 'var/**'
|
|
# Some links for easier reference:
|
|
#
|
|
# "github" context: https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context
|
|
# job outputs: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs
|
|
# setting environment variables from earlier steps: https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable
|
|
#
|
|
bootstrap:
|
|
if: ${{ github.repository == 'spack/spack' && needs.changes.outputs.bootstrap == 'true' }}
|
|
needs: [ prechecks, changes ]
|
|
uses: ./.github/workflows/bootstrap.yml
|
|
secrets: inherit
|
|
unit-tests:
|
|
if: ${{ github.repository == 'spack/spack' && needs.changes.outputs.core == 'true' }}
|
|
needs: [ prechecks, changes ]
|
|
uses: ./.github/workflows/unit_tests.yaml
|
|
secrets: inherit
|
|
upload-coverage:
|
|
needs: [ unit-tests, prechecks ]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
|
with:
|
|
fetch-depth: 0
|
|
- name: Download coverage files
|
|
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
|
|
with:
|
|
pattern: coverage-*
|
|
path: coverage
|
|
merge-multiple: true
|
|
- run: pip install --upgrade coverage
|
|
- run: ls -la coverage
|
|
- run: coverage combine -a coverage/.coverage*
|
|
- run: coverage xml
|
|
- name: "Upload coverage"
|
|
uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673
|
|
with:
|
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
verbose: true
|
|
all:
|
|
needs: [ upload-coverage, bootstrap ]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Success
|
|
run: "true"
|