Files
CertifiEd.Client/CONTRIBUTING.md
Faris Laptop 7e80226bf2
CI / build (push) Successful in 39s
Release / release (push) Failing after 36s
ci: release from the production branch, version from the project file
Two branches: dev for everyday work, production for releases.

- ci.yml builds and packs on dev and on pull requests; it never publishes.
- release.yml runs on a push (usually a merge) into production: reads
  <Version> from the csproj, refuses to proceed if that tag already
  exists, publishes to nuget.org, and only then creates the tag and the
  Gitea release — so a tag always means a published package.
- Drop --skip-duplicate: a duplicate push must fail loudly instead of
  reporting success while shipping nothing.
2026-07-20 16:12:21 +05:00

55 lines
2.5 KiB
Markdown

# Разработка и релиз
## Ветки
| Ветка | Назначение |
|---|---|
| `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-документацию.
## Релиз
Версия берётся **из файлов** — единственный источник правды — `<Version>` в
`src/CertifiEd.Client/CertifiEd.Client.csproj`.
```bash
# 1. на dev: поднять версию
# <Version>1.0.1</Version>
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: ломающие изменения — только в мажорной версии.