# Разработка и релиз ## Ветки | Ветка | Назначение | |---|---| | `dev` | Основная ветка разработки. Сюда идут все изменения и pull request'ы. CI собирает и пакует, но ничего не публикует. | | `production` | Релизная ветка. Мерж сюда = выпуск версии. | ## Сборка ```bash dotnet build dotnet pack src/CertifiEd.Client/CertifiEd.Client.csproj -c Release -o artifacts ``` Требуется .NET 10 SDK (см. `global.json`). Предупреждения компилятора трактуются как ошибки, публичные члены обязаны иметь XML-документацию. ## Релиз Версия берётся **из файлов** — единственный источник правды — `` в `src/CertifiEd.Client/CertifiEd.Client.csproj`. ```bash # 1. на dev: поднять версию # 1.0.1 git commit -am "chore: bump version to 1.0.1" git push origin dev # 2. влить dev в production — это и есть релиз git checkout production git merge --no-ff dev git push origin production ``` Дальше `.gitea/workflows/release.yml` сам: 1. читает версию из csproj; 2. **отказывается** публиковать, если тег `vX.Y.Z` уже существует (опубликованную версию в NuGet заменить нельзя — нужно поднять версию); 3. собирает и пакует; 4. публикует пакет на nuget.org (дубликат падает с ошибкой, а не «молча успешно»); 5. только после успешной публикации создаёт тег `vX.Y.Z` и Gitea-release. Порядок намеренный: тег появляется лишь тогда, когда пакет реально опубликован. ### Что настроено один раз - Секрет **`NUGET_API_KEY`** — ключ nuget.org с правом публикации `CertifiEd.Client`. - Actions-раннер с лейблом `ubuntu-latest`. - `GITEA_TOKEN` выдаётся Actions автоматически — используется для тега и релиза. ## Совместимость Публичный API следует semver: ломающие изменения — только в мажорной версии.