PSP-9503: Updates on Automated tests IS93 #13733
Workflow file for this run
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: API (.NET 8) | |
on: | |
push: | |
branches: [master, dev, test] | |
pull_request: | |
branches: [master, dev, test] | |
jobs: | |
# JOB to run change detection | |
check-changes: | |
runs-on: ubuntu-latest | |
# Set job outputs to values from filter step | |
outputs: | |
backend: ${{ steps.filter.outputs.backend }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dorny/paths-filter@v2 | |
id: filter | |
with: | |
filters: | | |
backend: | |
- 'source/backend/**' | |
build-backend: | |
needs: check-changes | |
runs-on: ubuntu-latest | |
if: ${{ needs.check-changes.outputs.backend == 'true' }} | |
strategy: | |
matrix: | |
services: [{directory: ./source/backend/api, solution: 'Pims.sln'}, {directory: ./source/backend/proxy, solution: 'Proxy.sln'}] | |
env: | |
working-directory: ${{ matrix.services.directory }} | |
solution-name: ${{ matrix.services.solution }} | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
GIT_BRANCH: "${{ github.ref }}" | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Extract Branch Name | |
shell: bash | |
run: echo "branch=$(echo ${GITHUB_REF#refs/heads/})" >> $GITHUB_OUTPUT | |
id: extract_branch | |
- name: Setup .NET 8 | |
uses: actions/setup-dotnet@v1 | |
with: | |
dotnet-version: "8.0.x" | |
- name: Install dependencies | |
run: dotnet restore ${{env.solution-name}} | |
working-directory: ${{env.working-directory}} | |
- name: Build | |
run: dotnet build ${{env.solution-name}} --configuration Release --no-restore | |
working-directory: ${{env.working-directory}} | |
- name: Install coverlet for code coverage | |
run: dotnet tool install -g coverlet.console --version 1.7.2 | |
working-directory: ${{env.working-directory}} | |
- name: Test | |
if: ${{ env.solution-name == 'Pims.sln' }} | |
run: dotnet test Pims.sln --no-restore --verbosity normal | |
working-directory: ${{env.working-directory}} | |
# For future reference, if we have N test projects the flow of events would be: | |
# | |
# **Pre-conditions:** | |
# - All projects export their individual coverage percents in JSON and OpenCover format | |
# - There's no way to merge OpenCover xmls together (that I could find) | |
# - Common folder "../TestResults" is git ignored so nothing gets in source control | |
# | |
# **Steps:** | |
# | |
# - Test-project 1 | |
# - generate coverage files (without merging) | |
# - copy results to common folder "../TestResults" | |
# - Test-project 2 | |
# - generate coverage files merging with previous `coverage.json` | |
# - the previous `coverage.opencoverage.xml` is ignored | |
# - copy results to common folder "../TestResults" | |
# ... | |
# - Test-project N | |
# - generate coverage files merging with previous `coverage.json` | |
# - the previous `coverage.opencoverage.xml` is ignored | |
# - copy results to common folder "../TestResults" | |
# | |
# The final `coverage.opencover.xml` is the one we want | |
- name: Generate code coverage | |
if: ${{ env.solution-name == 'Pims.sln' }} | |
working-directory: ${{env.working-directory}}/../tests/unit | |
run: | | |
pwd | |
mkdir -p TestResults | |
rm -rf api/TestResults | |
rm -rf dal/TestResults | |
rm -rf mockdal/TestResults | |
cd api | |
dotnet test --collect:"XPlat Code Coverage" --settings coverlet.runsettings --no-restore > out.txt | |
ls | |
cat out.txt | |
mv TestResults/*/* ../TestResults/ | |
cd .. | |
cd dal | |
dotnet test --collect:"XPlat Code Coverage" --settings coverlet.runsettings --no-restore | |
ls | |
mv TestResults/*/* ../TestResults/ | |
cd .. | |
cd mockdal | |
dotnet test --collect:"XPlat Code Coverage" --settings coverlet.runsettings --no-restore | |
ls | |
mv TestResults/*/* ../TestResults/ | |
cd .. | |
head TestResults/coverage.opencover.xml | |
- name: Save PR number and scan results | |
if: ${{ env.solution-name == 'Pims.sln' }} | |
run: | | |
mkdir -p ./pr | |
echo ${{ github.event.pull_request.number }} > ./pr/NR | |
cp ${{env.working-directory}}/../tests/unit/TestResults/coverage.opencover.xml ./pr | |
- uses: actions/upload-artifact@v4 | |
if: ${{ env.solution-name == 'Pims.sln' }} | |
with: | |
name: pr-codecov | |
path: pr/ | |
- name: SonarScanner for .NET 8 with pull request decoration support | |
id: scan | |
uses: highbyte/sonarscan-dotnet@v2.3.2 | |
if: ${{ github.event_name == 'push' && env.solution-name == 'Pims.sln' }} | |
env: | |
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} | |
with: | |
dotnetBuildArguments: ${{env.working-directory}}/${{ env.solution-name }} | |
dotnetTestArguments: ${{env.working-directory}}/${{ env.solution-name }} --logger trx --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover | |
# Optional extra command arguments the the SonarScanner 'begin' command | |
sonarBeginArguments: /d:sonar.cs.opencover.reportsPaths="**/TestResults/**/coverage.opencover.xml" -d:sonar.cs.vstest.reportsPaths="**/TestResults/*.trx" -d:sonar.qualitygate.wait=true | |
# The key of the SonarQube project | |
sonarProjectKey: ${{secrets.PROJECT_KEY_API}} | |
# The name of the SonarQube project | |
sonarProjectName: PIMS-API | |
# The SonarQube server URL. For SonarCloud, skip this setting. | |
sonarHostname: ${{secrets.SONAR_URL}} | |
post-build: | |
needs: build-backend | |
runs-on: ubuntu-latest | |
env: | |
working-directory: ./source/backend | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
GIT_BRANCH: "${{github.ref}}" | |
steps: | |
# Send notifications only if MS_TEAMS_NOTIFY_URL secret has been set | |
- name: Failure notification to Teams Channel | |
env: | |
MS_TEAMS_NOTIFY_URL: ${{ secrets.MS_TEAMS_NOTIFY_URL }} | |
if: env.MS_TEAMS_NOTIFY_URL != '' && failure() && steps.scan.outcome == 'failure' | |
uses: dragos-cojocari/ms-teams-notification@v1.0.2 | |
with: | |
github-token: ${{ github.token }} | |
ms-teams-webhook-uri: ${{ env.MS_TEAMS_NOTIFY_URL }} | |
notification-summary: PIMS API Sonar Scan FAILED in ${{env.GIT_BRANCH}} environment | |
notification-color: ff0000 | |
timezone: America/Los_Angeles | |
- name: Find Comment | |
if: failure() && steps.scan.outcome == 'failure' && github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository | |
uses: peter-evans/find-comment@v1 | |
id: fc | |
with: | |
issue-number: ${{ github.event.pull_request.number }} | |
comment-author: "github-actions[bot]" | |
body-includes: QUALITY GATE STATUS FOR .NET 5 | |
- name: Check Quality Gate and Create Comment | |
if: failure() && steps.scan.outcome == 'failure' && github.event_name == 'pull_request' && steps.fc.outputs.comment-id == '' | |
uses: peter-evans/create-or-update-comment@v1 | |
env: | |
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} | |
SONAR_HOST_URL: ${{ secrets.SONAR_URL }} | |
PROJECT_KEY: ${{secrets.PROJECT_KEY_API}} | |
with: | |
issue-number: ${{ github.event.pull_request.number }} | |
body: | | |
QUALITY GATE STATUS FOR .NET 5: FAILED. | |
[View and resolve details on][1] | |
[1]: ${{env.SONAR_HOST_URL}}/dashboard?id=${{env.PROJECT_KEY}} | |
reactions: confused | |
- name: Check Quality Gate and Update Comment | |
if: failure() && steps.scan.outcome == 'failure' && github.event_name == 'pull_request' && steps.fc.outputs.comment-id != '' && github.event.pull_request.head.repo.full_name == github.repository | |
uses: peter-evans/create-or-update-comment@v1 | |
env: | |
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} | |
SONAR_HOST_URL: ${{ secrets.SONAR_URL }} | |
PROJECT_KEY: ${{secrets.PROJECT_KEY_APP}} | |
with: | |
comment-id: ${{ steps.fc.outputs.comment-id }} | |
issue-number: ${{ github.event.pull_request.number }} | |
body: | | |
QUALITY GATE STATUS FOR .NET 5: FAILED. | |
[View and resolve details on][1] | |
[1]: ${{env.SONAR_HOST_URL}}/dashboard?id=${{env.PROJECT_KEY}} | |
edit-mode: replace | |
reactions: eyes |