name: ci # Прогоняем CI в двух случаях: # 1) МР: создан, переоткрыт или в ветку МР запушены новые коммиты (synchronize). # 2) Влитие в main (пуш в main — в т.ч. мерж МР). # Обычные коммиты в ветки без открытого МР CI не запускают. on: push: branches: - main pull_request: types: - opened - synchronize - reopened workflow_dispatch: # Новый прогон того же рефа (та же ветка МР / тот же main) отменяет незавершённый предыдущий: # коммит-А стартовал, через пару минут коммит-Б — прогон А отменяется, если ещё не закончил. # Завершённые (успех/фейл) прогоны не трогаются. concurrency: group: ci-${{ github.ref }} cancel-in-progress: true jobs: build-test: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: .NET 10 uses: actions/setup-dotnet@v4 with: dotnet-version: '10.0.x' - name: Node 20 uses: actions/setup-node@v4 with: node-version: '20' cache: npm cache-dependency-path: src/frontend/package-lock.json - name: Сборка 5 решений run: | dotnet build src/core/Deal.sln --nologo -v q dotnet build src/telegram-service/Deal.Telegram.sln --nologo -v q dotnet build src/ai-service/Deal.Ai.sln --nologo -v q dotnet build src/ml-service/Deal.Ml.sln --nologo -v q dotnet build src/storage-service/Deal.Storage.sln --nologo -v q - name: Тесты run: | dotnet test src/core/tests/Deal.Tests.Unit/Deal.Tests.Unit.csproj --nologo dotnet test src/telegram-service/Deal.Telegram.Tests/Deal.Telegram.Tests.csproj --nologo --no-build dotnet test src/ai-service/Deal.Ai.Tests/Deal.Ai.Tests.csproj --nologo --no-build dotnet test src/ml-service/Deal.Ml.Tests/Deal.Ml.Tests.csproj --nologo --no-build dotnet test src/storage-service/Deal.Storage.Tests/Deal.Storage.Tests.csproj --nologo --no-build - name: Скан уязвимых NuGet-зависимостей run: | fail=0 for sln in src/core/Deal.sln src/telegram-service/Deal.Telegram.sln src/ai-service/Deal.Ai.sln src/ml-service/Deal.Ml.sln src/storage-service/Deal.Storage.sln; do echo "-- $sln" OUTPUT=$(dotnet list "$sln" package --vulnerable --include-transitive 2>&1 || true) if printf '%s' "$OUTPUT" | grep -qi "has the following vulnerable"; then printf '%s\n' "$OUTPUT" echo "ОШИБКА: уязвимые зависимости в $sln" fail=1 fi done exit $fail - name: Фронтенд (сборка + линтер i18n) run: | cd src/frontend npm ci npm run build npm run lint:i18n