Skip to content

updated coverage not showing #93

updated coverage not showing

updated coverage not showing #93

Workflow file for this run

name: .NET
on:
push:
branches: [ "Development" ]
pull_request:
branches: [ "Development" ]
env:
IMAGE_NAME: CargoHub
OWNER: "${{ github.repository_owner }}"
DOTNET_INSTALL_DIR: "./.dotnet"
jobs:
build:
runs-on: self-hosted
outputs:
BUILD_TIME: ${{ steps.build-time.outputs.time }}
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Cache NuGet packages
uses: actions/cache@v3
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Restore dependencies
run: dotnet restore
- name: Add packages
run: |
dotnet add package Newtonsoft.Json
dotnet add package xunit
- name: Build
id: build-time
run: |
dotnet build --no-restore
echo "time=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
test:
needs: build
runs-on: self-hosted
outputs:
TEST_TIME: ${{ steps.test-time.outputs.time }}
COVERAGE: ${{ steps.coverage.outputs.percentage }}
steps:
- uses: actions/checkout@v4
- name: Setup .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Cache .NET build output
uses: actions/cache@v3
with:
path: ~/.dotnet/
key: ${{ runner.os }}-dotnet-${{ hashFiles('**/*.csproj') }}
restore-keys: |
${{ runner.os }}-dotnet-
- name: Build the application
run: dotnet build --configuration Release
- name: Run application
run: dotnet run --no-build --configuration Release --urls=${{ secrets.LOCALHOST }} & sleep 5
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Cache Python dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-python-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-python-
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install httpx pytest coverage
- name: Run integration tests
run: coverage run -m pytest
- name: Generate code coverage report
id: coverage
run: |
coverage xml -o coverage.xml
coverage report --format=markdown >> $GITHUB_STEP_SUMMARY
echo "percentage=$(coverage report | grep TOTAL | awk '{print $NF}')" >> $GITHUB_OUTPUT
coverage report --fail-under=90
- name: Parse coverage by file
id: parse-coverage-file
run: |
python -c "
import xml.etree.ElementTree as ET
root = ET.parse('coverage.xml').getroot()
ns = {'ns': 'http://cobertura.sourceforge.net/xml/schema/'}
files = root.findall('.//ns:class', ns)
summary = []
for f in files:
filename = f.attrib['filename']
lines_covered = int(f.find('./ns:lines-covered', ns).text)
lines_valid = int(f.find('./ns:lines-valid', ns).text)
coverage = (lines_covered / lines_valid) * 100 if lines_valid > 0 else 0
summary.append(f'{filename}: {coverage:.2f}%')
with open('coverage-summary.txt', 'w') as report:
report.write('\n'.join(summary))
"
env:
DOTNET_CLI_TELEMETRY_OPTOUT: 1
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
- name: Generate Coverage Report
run: |
DOTNET_TOOLS_DIR="$HOME/.dotnet/tools"
echo "DOTNET_TOOLS_DIR: $DOTNET_TOOLS_DIR"
export PATH="$PATH:$DOTNET_TOOLS_DIR"
which reportgenerator || echo "ReportGenerator not found in PATH"
$DOTNET_TOOLS_DIR/reportgenerator \
-reports:"coverage.xml" \
-targetdir:"coverage-report" \
-reporttypes:Html
env:
DOTNET_CLI_TELEMETRY_OPTOUT: 1
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
- name: Set test Completion time
id: test-time
run: echo "time=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
- name: Upload Coverage Report
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage-report
close_pr_on_failure:
needs: [build, test]
runs-on: ubuntu-latest
if: failure() && github.event_name == 'pull_request'
steps:
- name: Close Pull Request
uses: actions/github-script@v6
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
github.rest.pulls.update({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number,
state: 'closed'
})
- name: Comment on Pull Request
uses: actions/github-script@v6
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: 'This pull request has been automatically closed due to workflow failure. Please fix the issues and open a new pull request.'
})
notify:
needs: [build, test]
runs-on: ubuntu-latest
steps:
- name: Download coverage report
uses: actions/download-artifact@v4
with:
name: coverage-report
path: coverage-report
- name: Parse coverage report
id: parse-coverage
run: |
# Read the test summary from coverage-summary.txt
if [ -f coverage-summary.txt ]; then
echo "Reading coverage from coverage-summary.txt"
cat coverage-summary.txt >> $GITHUB_STEP_SUMMARY
fi
# Extract coverage percentages
COVERAGE=$(grep "TOTAL" coverage-report/index.html | grep -oP '\d+%' | head -1)
BRANCH_COVERAGE=$(grep "TOTAL" coverage-report/index.html | grep -oP '\d+%' | head -2 | tail -1)
METHOD_COVERAGE=$(grep "TOTAL" coverage-report/index.html | grep -oP '\d+%' | head -3 | tail -1)
# Set outputs
echo "coverage=${COVERAGE:-0}" >> $GITHUB_OUTPUT
echo "branch_coverage=${BRANCH_COVERAGE:-0}" >> $GITHUB_OUTPUT
echo "method_coverage=${METHOD_COVERAGE:-0}" >> $GITHUB_OUTPUT
- name: Determine coverage status
id: coverage-status
run: |
COVERAGE=$(echo ${{ steps.parse-coverage.outputs.coverage }} | sed 's/%//')
if (( $(echo "$COVERAGE >= 90" | bc -l) )); then
echo "status=good" >> $GITHUB_OUTPUT
echo "emoji=✅" >> $GITHUB_OUTPUT
echo "gif=https://media.giphy.com/media/3o6ZtlGkjeschymLNm/giphy.gif" >> $GITHUB_OUTPUT
else
echo "status=bad" >> $GITHUB_OUTPUT
echo "emoji=❌" >> $GITHUB_OUTPUT
echo "gif=https://media.giphy.com/media/l1J9EdzfOSgfyueLm/giphy.gif" >> $GITHUB_OUTPUT
fi
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
with:
args: |
:rocket: Project Update Notification :rocket:
The project **${{ github.repository }}** has been updated.
:hammer_and_wrench: **Build Job**
- Completed at: ${{ needs.build.outputs.BUILD_TIME }}
:test_tube: **Test Job**
- Completed at: ${{ needs.test.outputs.TEST_TIME }}
:bar_chart: **Coverage Report** ${{ steps.coverage-status.outputs.emoji }}
- Overall Coverage: ${{ steps.parse-coverage.outputs.coverage }}
- Branch Coverage: ${{ steps.parse-coverage.outputs.branch_coverage }}
- Method Coverage: ${{ steps.parse-coverage.outputs.method_coverage }}
:page_facing_up: **Detailed Coverage by File**
\`\`\`
$(cat coverage-summary.txt)
\`\`\`
${{ steps.coverage-status.outputs.gif }}
:link: [View Commit](https://github.com/${{ github.repository }}/commit/${{ github.sha }})
:octocat: [View Workflow Run](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})
:chart_with_upwards_trend: [View Full Coverage Report](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})
Branch: ${{ github.ref_name }}
Event: ${{ github.event_name }}
- name: Upload coverage report to Discord
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
run: |
curl -H "Content-Type: multipart/form-data" -X POST -F "file=@coverage-report/index.html" $DISCORD_WEBHOOK