Github Action - artemovsergey/ASP GitHub Wiki
Github Action
Unit и Integration Tests, Coverage and deploy results on Github Pages
name: unit and integration Tests
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:latest
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: testdb
ports:
- 5432:5432
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 9.0.102
- name: Restore dependencies
run: dotnet restore
- name: Install reportgenerator tool
run: dotnet tool install -g dotnet-reportgenerator-globaltool
- name: Install coverlet.msbuild
run: |
# Находим все тестовые проекты и добавляем coverlet.msbuild
for PROJECT in $(find . -name "*.Tests.csproj"); do
dotnet add $PROJECT package coverlet.msbuild --version 3.2.0
done
continue-on-error: true # На случай, если не найдены тестовые проекты
- name: Build
run: dotnet build --no-restore --configuration Release
- name: Test with coverage
env:
POSTGRES_HOST: localhost
POSTGRES_PORT: 5432
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: testdb
run: |
dotnet test --no-build --configuration Release \
--collect:"XPlat Code Coverage" \
-- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura \
--logger trx
- name: Generate report
run: |
reportgenerator -reports:"**/coverage.cobertura.xml" -targetdir:"coveragereport" -reporttypes:Html
- name: Publish test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: |
./**/*.trx
./**/coverage.cobertura.xml
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./coveragereport
Развертывание на VPS
Замечание: в настройках репозитория на github надо указать секреты. VPS_PRIVATE_KEY берет на локальном компьютере в папке .ssh
c названием id_rsa
, f id_rsa.pub
должен соответствовать открытому публичному ключу на VPS.
name: deploy
on:
push:
branches: [ master ]
env:
VPS_HOST: ${{ secrets.VPS_HOST }}
VPS_USERNAME: ${{ secrets.VPS_USERNAME }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: '9.0'
- name: Checkout code
uses: actions/checkout@v2
- name: Delete old repository from VPS
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
rm -rf /home/user1/tictactoe
- name: Сlone new repo
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
git clone https://github.com/artemovsergey/TicTacToe.git /home/user1/tictactoe/
- name: Deploy to VPS
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
chmod +x /home/user1/tictactoe/scripts/vps.sh
/home/user1/tictactoe/scripts/vps.sh
build_and_push.sh
- сборка контейнов и публикация на docker hub
#!/bin/bash
echo "Build images from compose"
docker-compose build --no-cache --pull
echo "Login to dockerhub: "
docker login -u artik3314 -p Aa003314+ docker.io
echo "Images"
docker images
echo "Push service Nginx: "
docker tag react_nginx artik3314/react_nginx:latest
docker push artik3314/react_nginx:latest
echo "Push service Angular: "
docker tag react_angular artik3314/react_angular:latest
docker push artik3314/react_angular:latest
echo "Push service API: "
docker tag react_api artik3314/react_api:latest
docker push artik3314/react_api:latest
vps.sh
- запуск контейнеров
#!/bin/bash
echo "Go to project"
cd /home/user1/tictactoe/
echo "Stop all containers"
docker-compose down
echo "Update new version images"
docker-compose pull
echo "Up"
docker-compose up -d --build
echo "Status"
docker ps
test and coverage repost
#!/bin/bash
# Configuration
TEST_RESULTS_DIR="./TestResults"
COVERAGE_REPORT_DIR="./CoverageReport"
COLLECT_REPORTS_DIR="$TEST_RESULTS_DIR/CoverageReports"
# Clean previous results
echo "Cleaning previous test results..."
rm -rf "$TEST_RESULTS_DIR" "$COVERAGE_REPORT_DIR"
mkdir -p "$TEST_RESULTS_DIR" "$COLLECT_REPORTS_DIR"
# Run tests with code coverage using modern collection
echo "Running tests with code coverage collection..."
dotnet test \
--collect:"XPlat Code Coverage" \
--settings coverlet.runsettings \
--results-directory "$TEST_RESULTS_DIR" \
-- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura
# Check if tests succeeded
if [ $? -ne 0 ]; then
echo "❌ Error: Tests failed"
exit 1
fi
# Install ReportGenerator if not exists
if ! dotnet tool list -g | grep -q "dotnet-reportgenerator-globaltool"; then
echo "Installing ReportGenerator..."
dotnet tool install -g dotnet-reportgenerator-globaltool
fi
# Find and copy all coverage files with unique names
echo "Preparing coverage reports..."
counter=1
find "$TEST_RESULTS_DIR" -name "coverage.cobertura.xml" | while read -r file; do
cp "$file" "$COLLECT_REPORTS_DIR/coverage_$counter.cobertura.xml"
((counter++))
done
# Verify we found coverage files
if [ -z "$(ls -A $COLLECT_REPORTS_DIR)" ]; then
echo "❌ Error: No coverage files found"
exit 1
fi
# Generate HTML report from all coverage files
echo "Generating HTML coverage report..."
reportgenerator \
-reports:"$COLLECT_REPORTS_DIR/*.xml" \
-targetdir:"$COVERAGE_REPORT_DIR" \
-reporttypes:Html \
-sourcedirs:"$PWD/src" \
-assemblyfilters:"-*.Tests" \
-classfilters:"-*.Tests.*" \
-verbosity:Warning
echo "✅ Done - Coverage report available at $COVERAGE_REPORT_DIR/index.html"