65 lines
3.4 KiB
YAML
65 lines
3.4 KiB
YAML
name: ci
|
||
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
pull_request:
|
||
branches: [main]
|
||
|
||
jobs:
|
||
build:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- uses: actions/setup-dotnet@v4
|
||
with:
|
||
dotnet-version: '8.0.x'
|
||
|
||
# Плагин: server.lock.json — то, что скачивает лаунчер; plugin.json — то, что видит
|
||
# Claude Code как версию установки. Обе должны совпадать между собой, иначе релизный
|
||
# workflow отдал бы плагин с пином, который сам себе противоречит.
|
||
- name: инструменты для проверки манифеста плагина
|
||
run: apt-get update -qq && apt-get install -y -qq jq
|
||
|
||
- name: согласованность plugin.json и server.lock.json
|
||
run: |
|
||
MANIFEST_VERSION=$(jq -r '.version' plugin/.claude-plugin/plugin.json)
|
||
LOCK_VERSION=$(jq -r '.version' plugin/server.lock.json)
|
||
LOCK_SHA256=$(jq -r '.sha256' plugin/server.lock.json)
|
||
|
||
if [ "$MANIFEST_VERSION" != "$LOCK_VERSION" ]; then
|
||
echo "версия plugin.json ($MANIFEST_VERSION) не совпадает с server.lock.json ($LOCK_VERSION)"
|
||
exit 1
|
||
fi
|
||
|
||
# 0.0.0 — состояние «релиз ещё не публиковался»: url/sha256 намеренно пустые
|
||
# (см. tests/Kompas.Mcp.Tests/PluginManifestTests.cs, Lock_WhenReleased_HasUrlAndSha256).
|
||
if [ "$LOCK_VERSION" != "0.0.0" ]; then
|
||
if [ -z "$LOCK_SHA256" ] || [ "$LOCK_SHA256" = "null" ]; then
|
||
echo "server.lock.json: версия $LOCK_VERSION опубликована, но sha256 пуст"
|
||
exit 1
|
||
fi
|
||
if ! echo "$LOCK_SHA256" | grep -Eq '^[0-9a-f]{64}$'; then
|
||
echo "server.lock.json: sha256 '$LOCK_SHA256' не похож на 64-символьный hex"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
echo "ok: plugin.json/server.lock.json согласованы (version=$LOCK_VERSION)"
|
||
|
||
# Проекты указаны явно, а не через решение: формат KompasMcp.slnx понимает только
|
||
# SDK 9+, а здесь стоит 8.0.x — на решении сборка падает с MSB1003.
|
||
# EnableWindowsTargeting: проект таргетит net8.0-windows, сборка идёт на Linux.
|
||
- name: build
|
||
run: dotnet build src/Kompas.Mcp.Host/Kompas.Mcp.Host.csproj -c Release -p:EnableWindowsTargeting=true
|
||
|
||
# Что здесь НЕ выполняется и почему:
|
||
# Category=Integration — нужен запущенный КОМПАС с GUI и лицензией;
|
||
# Requires=Windows — КОМПАС не нужен, но нужна Windows (STA-апартамент
|
||
# в KompasDispatcher: на Linux SetApartmentState бросает
|
||
# PlatformNotSupportedException).
|
||
# Оба класса гоняются на машине разработчика, см. CLAUDE.md.
|
||
- name: unit tests
|
||
run: dotnet test tests/Kompas.Mcp.Tests/Kompas.Mcp.Tests.csproj --filter "Category=Unit&Requires!=Windows" -c Release -p:EnableWindowsTargeting=true
|