Implement code coverage in GitHub actions (#6441)
Implement code coverage in GitHub actions
This commit is contained in:
		
						commit
						00adb4e42f
					
				| 
						 | 
					@ -1,8 +1,7 @@
 | 
				
			||||||
# evaluating GitHub actions for CI, disconsider failures when evaluating PRs
 | 
					# evaluating GitHub actions for CI, disregard failures when evaluating PRs
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# this is still missing:
 | 
					# this is still missing:
 | 
				
			||||||
# - deploy
 | 
					# - deploy
 | 
				
			||||||
# - coverage
 | 
					 | 
				
			||||||
# - upload github notes
 | 
					# - upload github notes
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
name: main
 | 
					name: main
 | 
				
			||||||
| 
						 | 
					@ -17,7 +16,6 @@ on:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  build:
 | 
					  build:
 | 
				
			||||||
 | 
					 | 
				
			||||||
    runs-on: ${{ matrix.os }}
 | 
					    runs-on: ${{ matrix.os }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
| 
						 | 
					@ -86,6 +84,8 @@ jobs:
 | 
				
			||||||
            python: "3.7"
 | 
					            python: "3.7"
 | 
				
			||||||
            os: ubuntu-latest
 | 
					            os: ubuntu-latest
 | 
				
			||||||
            tox_env: "py37-freeze"
 | 
					            tox_env: "py37-freeze"
 | 
				
			||||||
 | 
					            # coverage does not apply for freeze test, skip it
 | 
				
			||||||
 | 
					            skip_coverage: true
 | 
				
			||||||
          - name: "ubuntu-py38"
 | 
					          - name: "ubuntu-py38"
 | 
				
			||||||
            python: "3.8"
 | 
					            python: "3.8"
 | 
				
			||||||
            os: ubuntu-latest
 | 
					            os: ubuntu-latest
 | 
				
			||||||
| 
						 | 
					@ -94,6 +94,8 @@ jobs:
 | 
				
			||||||
            python: "pypy3"
 | 
					            python: "pypy3"
 | 
				
			||||||
            os: ubuntu-latest
 | 
					            os: ubuntu-latest
 | 
				
			||||||
            tox_env: "pypy3-xdist"
 | 
					            tox_env: "pypy3-xdist"
 | 
				
			||||||
 | 
					            # coverage too slow with pypy3, skip it
 | 
				
			||||||
 | 
					            skip_coverage: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          - name: "macos-py37"
 | 
					          - name: "macos-py37"
 | 
				
			||||||
            python: "3.7"
 | 
					            python: "3.7"
 | 
				
			||||||
| 
						 | 
					@ -118,6 +120,37 @@ jobs:
 | 
				
			||||||
    - name: Install dependencies
 | 
					    - name: Install dependencies
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        python -m pip install --upgrade pip
 | 
					        python -m pip install --upgrade pip
 | 
				
			||||||
        pip install tox
 | 
					        pip install tox coverage
 | 
				
			||||||
    - name: Test
 | 
					
 | 
				
			||||||
      run: tox -e ${{ matrix.tox_env }}
 | 
					    - name: Test without coverage
 | 
				
			||||||
 | 
					      if: "matrix.skip_coverage"
 | 
				
			||||||
 | 
					      run: "tox -e ${{ matrix.tox_env }}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Test with coverage
 | 
				
			||||||
 | 
					      if: "! matrix.skip_coverage"
 | 
				
			||||||
 | 
					      env:
 | 
				
			||||||
 | 
					        _PYTEST_TOX_COVERAGE_RUN: "coverage run -m"
 | 
				
			||||||
 | 
					        COVERAGE_PROCESS_START: ".coveragerc"
 | 
				
			||||||
 | 
					        _PYTEST_TOX_EXTRA_DEP: "coverage-enable-subprocess"
 | 
				
			||||||
 | 
					      run: "tox -e ${{ matrix.tox_env }}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Prepare coverage token
 | 
				
			||||||
 | 
					      if: success() && !matrix.skip_coverage && ( github.repository == 'pytest-dev/pytest' || github.event_name == 'pull_request' )
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        python scripts/append_codecov_token.py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Combine coverage
 | 
				
			||||||
 | 
					      if: success() && !matrix.skip_coverage
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        python -m coverage combine
 | 
				
			||||||
 | 
					        python -m coverage xml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Codecov upload
 | 
				
			||||||
 | 
					      if: success() && !matrix.skip_coverage
 | 
				
			||||||
 | 
					      uses: codecov/codecov-action@v1
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					        token: ${{ secrets.codecov }}
 | 
				
			||||||
 | 
					        file: ./coverage.xml
 | 
				
			||||||
 | 
					        flags: ${{ runner.os }}
 | 
				
			||||||
 | 
					        fail_ci_if_error: false
 | 
				
			||||||
 | 
					        name: ${{ matrix.name }}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,36 @@
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					Appends the codecov token to the 'codecov.yml' file at the root of the repository.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is done by CI during PRs and builds on the pytest-dev repository so we can upload coverage, at least
 | 
				
			||||||
 | 
					until codecov grows some native integration like it has with Travis and AppVeyor.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					See discussion in https://github.com/pytest-dev/pytest/pull/6441 for more information.
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					import os.path
 | 
				
			||||||
 | 
					from textwrap import dedent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def main():
 | 
				
			||||||
 | 
					    this_dir = os.path.dirname(__file__)
 | 
				
			||||||
 | 
					    cov_file = os.path.join(this_dir, "..", "codecov.yml")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert os.path.isfile(cov_file), "{cov_file} does not exist".format(
 | 
				
			||||||
 | 
					        cov_file=cov_file
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    with open(cov_file, "a") as f:
 | 
				
			||||||
 | 
					        # token from: https://codecov.io/gh/pytest-dev/pytest/settings
 | 
				
			||||||
 | 
					        # use same URL to regenerate it if needed
 | 
				
			||||||
 | 
					        text = dedent(
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					            codecov:
 | 
				
			||||||
 | 
					              token: "1eca3b1f-31a2-4fb8-a8c3-138b441b50a7"
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        f.write(text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print("Token updated:", cov_file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					    main()
 | 
				
			||||||
							
								
								
									
										2
									
								
								tox.ini
								
								
								
								
							
							
						
						
									
										2
									
								
								tox.ini
								
								
								
								
							| 
						 | 
					@ -26,7 +26,7 @@ passenv = USER USERNAME COVERAGE_* TRAVIS PYTEST_ADDOPTS TERM
 | 
				
			||||||
setenv =
 | 
					setenv =
 | 
				
			||||||
    _PYTEST_TOX_DEFAULT_POSARGS={env:_PYTEST_TOX_POSARGS_LSOF:} {env:_PYTEST_TOX_POSARGS_XDIST:}
 | 
					    _PYTEST_TOX_DEFAULT_POSARGS={env:_PYTEST_TOX_POSARGS_LSOF:} {env:_PYTEST_TOX_POSARGS_XDIST:}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Configuration to run with coverage similar to Travis/Appveyor, e.g.
 | 
					    # Configuration to run with coverage similar to CI, e.g.
 | 
				
			||||||
    # "tox -e py37-coverage".
 | 
					    # "tox -e py37-coverage".
 | 
				
			||||||
    coverage: _PYTEST_TOX_COVERAGE_RUN=coverage run -m
 | 
					    coverage: _PYTEST_TOX_COVERAGE_RUN=coverage run -m
 | 
				
			||||||
    coverage: _PYTEST_TOX_EXTRA_DEP=coverage-enable-subprocess
 | 
					    coverage: _PYTEST_TOX_EXTRA_DEP=coverage-enable-subprocess
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue