concurrency group по ref + cancel-in-progress: свежий коммит в ветку МР (или мерж в main) отменяет ещё не закончившийся предыдущий прогон. Завершённые прогоны не затрагиваются.
80 lines
3.1 KiB
YAML
80 lines
3.1 KiB
YAML
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
|