updated coverage not showing #93
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |