ci: release from the production branch, version from the project file
CI / build (push) Successful in 39s
Release / release (push) Failing after 36s

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.
This commit is contained in:
Faris Laptop
2026-07-20 16:12:21 +05:00
parent 2cd024f782
commit 7e80226bf2
3 changed files with 133 additions and 50 deletions
+32 -10
View File
@@ -1,5 +1,12 @@
# Разработка и релиз
## Ветки
| Ветка | Назначение |
|---|---|
| `dev` | Основная ветка разработки. Сюда идут все изменения и pull request'ы. CI собирает и пакует, но ничего не публикует. |
| `production` | Релизная ветка. Мерж сюда = выпуск версии. |
## Сборка
```bash
@@ -11,22 +18,37 @@ dotnet pack src/CertifiEd.Client/CertifiEd.Client.csproj -c Release -o artifacts
## Релиз
Версия пакета берётся из тега:
Версия берётся **из файлов** — единственный источник правды — `<Version>` в
`src/CertifiEd.Client/CertifiEd.Client.csproj`.
```bash
# 1. Обновить <Version> в src/CertifiEd.Client/CertifiEd.Client.csproj
# 2. Закоммитить и поставить тег
git tag v1.0.1
git push origin main --tags
# 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
```
CI (`.gitea/workflows/ci.yml`) на теге `v*` собирает пакет с версией из тега и публикует его на nuget.org.
Дальше `.gitea/workflows/release.yml` сам:
### Что нужно один раз настроить
1. читает версию из csproj;
2. **отказывается** публиковать, если тег `vX.Y.Z` уже существует (опубликованную версию в NuGet заменить нельзя — нужно поднять версию);
3. собирает и пакует;
4. публикует пакет на nuget.org (дубликат падает с ошибкой, а не «молча успешно»);
5. только после успешной публикации создаёт тег `vX.Y.Z` и Gitea-release.
- В настройках репозитория → Actions → Secrets добавить **`NUGET_API_KEY`** — ключ nuget.org с правом публикации пакета `CertifiEd.Client`.
- Убедиться, что к репозиторию подключён Actions-раннер (Settings → Actions → Runners). Без раннера workflow не запустится.
Порядок намеренный: тег появляется лишь тогда, когда пакет реально опубликован.
### Что настроено один раз
- Секрет **`NUGET_API_KEY`** — ключ nuget.org с правом публикации `CertifiEd.Client`.
- Actions-раннер с лейблом `ubuntu-latest`.
- `GITEA_TOKEN` выдаётся Actions автоматически — используется для тега и релиза.
## Совместимость
Публичный API следует semver: ломающие изменения — только в мажорной версии. Формат токена лицензии и протокол активации описаны в документации платформы CertifiEd.
Публичный API следует semver: ломающие изменения — только в мажорной версии.