# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 # For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt name: "Coverage" on: # As currently structured, this adds too many jobs (checks?), so don't run it # on pull requests yet. push: branches: - master - "**/*metacov*" workflow_dispatch: defaults: run: shell: bash env: PIP_DISABLE_PIP_VERSION_CHECK: 1 permissions: contents: read concurrency: group: "${{ github.workflow }}-${{ github.ref }}" cancel-in-progress: true jobs: coverage: name: "Python ${{ matrix.python-version }} on ${{ matrix.os }}" runs-on: "${{ matrix.os }}" strategy: matrix: os: - ubuntu-latest - macos-latest - windows-latest python-version: # When changing this list, be sure to check the [gh-actions] list in # tox.ini so that tox will run properly. PYVERSIONS # Available versions: # https://github.com/actions/python-versions/blob/main/versions-manifest.json - "3.7" - "3.8" - "3.9" - "3.10" - "3.11.0-rc.2" - "pypy-3.7" exclude: # Windows PyPy doesn't seem to work? - os: windows-latest python-version: "pypy-3.7" # Mac PyPy always takes the longest, and doesn't add anything. - os: macos-latest python-version: "pypy-3.7" # If one job fails, stop the whole thing. fail-fast: true steps: - name: "Check out the repo" uses: "actions/checkout@v3" - name: "Set up Python" uses: "actions/setup-python@v4" with: python-version: "${{ matrix.python-version }}" cache: pip cache-dependency-path: 'requirements/*.pip' - name: "Install dependencies" run: | set -xe python -VV python -m site python -m pip install --require-hashes -r requirements/tox.pip - name: "Run tox coverage for ${{ matrix.python-version }}" env: COVERAGE_COVERAGE: "yes" COVERAGE_CONTEXT: "${{ matrix.python-version }}.${{ matrix.os }}" run: | set -xe python -m tox - name: "Upload coverage data" uses: actions/upload-artifact@v3 with: name: metacov path: .metacov.* combine: name: "Combine coverage data" needs: coverage runs-on: ubuntu-latest steps: - name: "Check out the repo" uses: "actions/checkout@v3" - name: "Set up Python" uses: "actions/setup-python@v4" with: python-version: "3.8" cache: pip cache-dependency-path: 'requirements/*.pip' - name: "Install dependencies" run: | set -xe python -VV python -m site python -m pip install -e . python igor.py zip_mods - name: "Download coverage data" uses: actions/download-artifact@v3 with: name: metacov - name: "Combine and report" id: combine env: COVERAGE_RCFILE: "metacov.ini" COVERAGE_METAFILE: ".metacov" COVERAGE_CONTEXT: "yes" run: | set -xe python -m igor combine_html python -m coverage json - name: "Upload HTML report" uses: actions/upload-artifact@v3 with: name: html_report path: htmlcov - name: "Upload JSON report" uses: actions/upload-artifact@v3 with: name: json_report path: coverage.json publish: name: "Publish coverage report" needs: combine runs-on: ubuntu-latest steps: - name: "Checkout reports repo" run: | set -xe git clone --depth=1 --no-checkout https://${{ secrets.COVERAGE_REPORTS_TOKEN }}@github.com/nedbat/coverage-reports reports_repo cd reports_repo git sparse-checkout init --cone git sparse-checkout set --skip-checks '/*' '!/reports' git config user.name nedbat git config user.email ned@nedbatchelder.com git checkout main - name: "Download coverage JSON report" uses: actions/download-artifact@v3 with: name: json_report - name: "Compute info for later steps" id: info run: | set -xe export TOTAL=$(python -c "import json;print(json.load(open('coverage.json'))['totals']['percent_covered_display'])") export SHA10=$(echo ${{ github.sha }} | cut -c 1-10) export SLUG=$(date +'%Y%m%d')_$SHA10 export REPORT_DIR=reports/$SLUG/htmlcov export REF="${{ github.ref }}" echo "total=$TOTAL" >> $GITHUB_ENV echo "sha10=$SHA10" >> $GITHUB_ENV echo "slug=$SLUG" >> $GITHUB_ENV echo "report_dir=$REPORT_DIR" >> $GITHUB_ENV echo "url=https://nedbat.github.io/coverage-reports/$REPORT_DIR" >> $GITHUB_ENV echo "branch=${REF#refs/heads/}" >> $GITHUB_ENV - name: "Download coverage HTML report" uses: actions/download-artifact@v3 with: name: html_report path: reports_repo/${{ env.report_dir }} - name: "Push to report repo" env: COMMIT_MESSAGE: ${{ github.event.head_commit.message }} run: | set -xe # Make the redirect to the latest report. echo "" > reports_repo/latest.html echo "" >> reports_repo/latest.html echo "Coverage report redirect..." >> reports_repo/latest.html # Make the commit message. echo "${{ env.total }}% - $COMMIT_MESSAGE" > commit.txt echo "" >> commit.txt echo "${{ env.url }}" >> commit.txt echo "${{ env.sha10 }}: ${{ env.branch }}" >> commit.txt # Commit. cd ./reports_repo git sparse-checkout set --skip-checks '/*' '${{ env.report_dir }}' rm ${{ env.report_dir }}/.gitignore git add ${{ env.report_dir }} latest.html git commit --file=../commit.txt git push - name: "Create badge" # https://gist.githubusercontent.com/nedbat/8c6980f77988a327348f9b02bbaf67f5 uses: schneegans/dynamic-badges-action@5d424ad4060f866e4d1dab8f8da0456e6b1c4f56 with: auth: ${{ secrets.METACOV_GIST_SECRET }} gistID: 8c6980f77988a327348f9b02bbaf67f5 filename: metacov.json label: Coverage message: ${{ env.total }}% minColorRange: 60 maxColorRange: 95 valColorRange: ${{ env.total }} - name: "Create summary" run: | echo '### Total coverage: ${{ env.total }}%' >> $GITHUB_STEP_SUMMARY echo '[${{ env.url }}](${{ env.url }})' >> $GITHUB_STEP_SUMMARY