onreza-release 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +881 -0
- package/dist/binaries.d.ts +74 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +9073 -0
- package/dist/cli.js.map +73 -0
- package/dist/config.d.ts +58 -0
- package/dist/gitverse.d.ts +91 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +8545 -0
- package/dist/index.js.map +71 -0
- package/dist/types.d.ts +862 -0
- package/dist/utils/binary-archive-extractor.d.ts +19 -0
- package/dist/utils/binary-package-generator.d.ts +24 -0
- package/dist/utils/binary-platforms.d.ts +113 -0
- package/dist/utils/binary-publisher.d.ts +53 -0
- package/dist/utils/binary-wrapper-generator.d.ts +34 -0
- package/dist/utils/changelog.d.ts +14 -0
- package/dist/utils/commitlint-generator.d.ts +5 -0
- package/dist/utils/git.d.ts +101 -0
- package/dist/utils/parser.d.ts +36 -0
- package/dist/utils/retry.d.ts +39 -0
- package/dist/utils/version.d.ts +18 -0
- package/package.json +66 -0
- package/schema.json +461 -0
package/README.md
ADDED
|
@@ -0,0 +1,881 @@
|
|
|
1
|
+
# ONREZA Release
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/onreza-release)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://gitverse.ru/onreza/release-tool)
|
|
6
|
+
|
|
7
|
+
Инструмент автоматизации релизов с поддержкой Conventional Commits, семантического версионирования и интеграцией с GitVerse.
|
|
8
|
+
|
|
9
|
+
## Возможности
|
|
10
|
+
|
|
11
|
+
- ✅ **Автоматическое версионирование** на основе Conventional Commits
|
|
12
|
+
- 📝 **Генерация CHANGELOG** с группировкой по типам коммитов
|
|
13
|
+
- 🌐 **Интеграция с GitVerse API** для создания релизов
|
|
14
|
+
- 📦 **Поддержка монорепозиториев** с независимым версионированием
|
|
15
|
+
- 🏷️ **Автоматические git теги и коммиты**
|
|
16
|
+
- 🔍 **Режим dry-run** для безопасного тестирования
|
|
17
|
+
- ⚙️ **Гибкая конфигурация** через `.gitversereleaserc.json`
|
|
18
|
+
- 🔧 **Автогенерация commitlint конфига** из release конфигурации
|
|
19
|
+
- 🪝 **Хуки beforeCommit** для автоматической подготовки файлов перед релизом
|
|
20
|
+
- 📤 **Бинарная дистрибуция** — публикация платформенных npm-пакетов (по паттерну esbuild/biome)
|
|
21
|
+
|
|
22
|
+
## Установка
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# npm
|
|
26
|
+
npm install -D onreza-release
|
|
27
|
+
|
|
28
|
+
# bun
|
|
29
|
+
bun add -d onreza-release
|
|
30
|
+
|
|
31
|
+
# yarn
|
|
32
|
+
yarn add -D onreza-release
|
|
33
|
+
|
|
34
|
+
# pnpm
|
|
35
|
+
pnpm add -D onreza-release
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Быстрый старт
|
|
39
|
+
|
|
40
|
+
> ⚠️ **Важно:** Для создания релизов в GitVerse необходимо настроить `GVR_TOKEN`. Без токена инструмент работает в урезанном режиме (только локальные теги и CHANGELOG). См. [Настройка GVR_TOKEN](#️-настройка-gitverse_token)
|
|
41
|
+
|
|
42
|
+
### 1. Базовое использование
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Создать релиз (dry-run для тестирования)
|
|
46
|
+
npx onreza-release --dry-run
|
|
47
|
+
|
|
48
|
+
# Создать и опубликовать релиз
|
|
49
|
+
npx onreza-release
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 2. Конфигурация
|
|
53
|
+
|
|
54
|
+
Создайте `.gitversereleaserc.json` в корне проекта:
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"git": {
|
|
59
|
+
"commitMessage": "chore(release): v{version} [skip ci]",
|
|
60
|
+
"tagMessage": "Release {version}",
|
|
61
|
+
"push": true,
|
|
62
|
+
"commitChanges": true
|
|
63
|
+
},
|
|
64
|
+
"changelog": {
|
|
65
|
+
"types": {
|
|
66
|
+
"feat": "✨ Новые возможности",
|
|
67
|
+
"fix": "🐛 Исправления",
|
|
68
|
+
"perf": "⚡ Производительность",
|
|
69
|
+
"docs": "📝 Документация"
|
|
70
|
+
},
|
|
71
|
+
"showHash": true,
|
|
72
|
+
"showAuthor": true
|
|
73
|
+
},
|
|
74
|
+
"gitverse": {
|
|
75
|
+
"createRelease": true
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 3. Добавьте в package.json
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"scripts": {
|
|
85
|
+
"release": "onreza-release",
|
|
86
|
+
"release:dry": "onreza-release --dry-run"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Использование
|
|
92
|
+
|
|
93
|
+
### Conventional Commits
|
|
94
|
+
|
|
95
|
+
Инструмент автоматически определяет тип версии на основе коммитов:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# Patch (1.0.0 → 1.0.1)
|
|
99
|
+
git commit -m "fix: исправлена ошибка валидации"
|
|
100
|
+
|
|
101
|
+
# Minor (1.0.0 → 1.1.0)
|
|
102
|
+
git commit -m "feat: добавлен новый API эндпоинт"
|
|
103
|
+
|
|
104
|
+
# Major (1.0.0 → 2.0.0)
|
|
105
|
+
git commit -m "feat!: изменен формат ответа API"
|
|
106
|
+
# или
|
|
107
|
+
git commit -m "feat: новая функция
|
|
108
|
+
|
|
109
|
+
BREAKING CHANGE: изменен формат конфигурации"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Pre-Major режим (0.x.x проекты)
|
|
113
|
+
|
|
114
|
+
Для проектов в стадии разработки (версии `0.x.x`) доступен режим `preMajorMode`, который контролирует поведение BREAKING CHANGES:
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"versioning": {
|
|
119
|
+
"preMajorMode": "auto" // Режим по умолчанию
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Режимы работы:**
|
|
125
|
+
|
|
126
|
+
- `"auto"` (default) - версии `< 1.0.0` → **minor bump**, `>= 1.0.0` → **major bump**
|
|
127
|
+
- `"enabled"` - BREAKING CHANGE всегда делает **minor bump** (для experimental проектов)
|
|
128
|
+
- `"disabled"` - стандартное semver поведение (BREAKING → major bump)
|
|
129
|
+
- `"2.0.0"` - порог версии (minor bump пока версия < порога)
|
|
130
|
+
|
|
131
|
+
**Примеры:**
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# Режим "auto" (рекомендуется)
|
|
135
|
+
# 0.5.0 + "feat!: breaking change" → 0.6.0
|
|
136
|
+
# 1.5.0 + "feat!: breaking change" → 2.0.0
|
|
137
|
+
|
|
138
|
+
# Режим "enabled" (experimental проект)
|
|
139
|
+
# 1.5.0 + "feat!: breaking change" → 1.6.0
|
|
140
|
+
|
|
141
|
+
# Режим с порогом "2.0.0"
|
|
142
|
+
# 1.5.0 + "feat!: breaking change" → 1.6.0
|
|
143
|
+
# 2.0.0 + "feat!: breaking change" → 3.0.0
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
> **Зачем это нужно?** По спецификации semver версии `0.x.x` находятся в pre-release фазе, где minor bump уже означает breaking change. Режим `auto` автоматически применяет правильную семантику.
|
|
147
|
+
|
|
148
|
+
### Программное использование
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
import { release } from "onreza-release";
|
|
152
|
+
|
|
153
|
+
// Простой релиз
|
|
154
|
+
const result = await release();
|
|
155
|
+
|
|
156
|
+
console.log(result.success); // true
|
|
157
|
+
console.log(result.newVersion); // "1.1.0"
|
|
158
|
+
console.log(result.tag); // "v1.1.0"
|
|
159
|
+
|
|
160
|
+
// С опциями
|
|
161
|
+
const result = await release(undefined, {
|
|
162
|
+
dryRun: true,
|
|
163
|
+
version: "2.0.0",
|
|
164
|
+
skipGitStatusCheck: false,
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Для монорепозитория
|
|
168
|
+
const result = await release("my-package", {
|
|
169
|
+
dryRun: false,
|
|
170
|
+
});
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
> **Примечание для GitVerse Actions:**
|
|
174
|
+
> В GitVerse Actions автоматически доступны переменные окружения:
|
|
175
|
+
> - `GVR_TOKEN` - должен быть настроен в Secrets (см. [Настройка](#️-настройка-gitverse_token))
|
|
176
|
+
> - `GITVERSE_PUBLIC_API_URL` - автоматически доступен (`https://api.gitverse.ru/`)
|
|
177
|
+
> - `GITHUB_REPOSITORY` - имя репозитория в формате `owner/repo`
|
|
178
|
+
|
|
179
|
+
## Поддержка монорепозиториев
|
|
180
|
+
|
|
181
|
+
### Конфигурация
|
|
182
|
+
|
|
183
|
+
```json
|
|
184
|
+
{
|
|
185
|
+
"monorepo": {
|
|
186
|
+
"enabled": true,
|
|
187
|
+
"packages": [
|
|
188
|
+
{
|
|
189
|
+
"name": "core",
|
|
190
|
+
"packageName": "@myorg/core",
|
|
191
|
+
"path": "./packages/core",
|
|
192
|
+
"tagPrefix": "core@",
|
|
193
|
+
"changelog": "CHANGELOG.md"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"name": "ui",
|
|
197
|
+
"packageName": "@myorg/ui",
|
|
198
|
+
"path": "./packages/ui",
|
|
199
|
+
"tagPrefix": "ui@",
|
|
200
|
+
"changelog": "CHANGELOG.md"
|
|
201
|
+
}
|
|
202
|
+
]
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Использование
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# Релиз конкретного пакета
|
|
211
|
+
npx onreza-release core
|
|
212
|
+
|
|
213
|
+
# Dry-run для пакета
|
|
214
|
+
npx onreza-release ui --dry-run
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Фильтрация коммитов по scope
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
# Коммиты для пакета "core"
|
|
221
|
+
git commit -m "feat(core): добавлена новая функция"
|
|
222
|
+
|
|
223
|
+
# Коммиты для пакета "ui"
|
|
224
|
+
git commit -m "fix(ui): исправлена ошибка компонента"
|
|
225
|
+
|
|
226
|
+
# Общие коммиты (влияют на все пакеты)
|
|
227
|
+
git commit -m "chore: обновлены зависимости"
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Генерация Commitlint конфига
|
|
231
|
+
|
|
232
|
+
Инструмент может автоматически генерировать `commitlint.config.ts` из вашей release конфигурации, обеспечивая синхронизацию между форматом коммитов и генерацией релизов.
|
|
233
|
+
|
|
234
|
+
### Быстрый старт
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
# Генерировать commitlint конфиг
|
|
238
|
+
npx onreza-release generate-commitlint
|
|
239
|
+
|
|
240
|
+
# Preview без записи файла
|
|
241
|
+
npx onreza-release generate-commitlint --dry-run
|
|
242
|
+
|
|
243
|
+
# С кастомными параметрами
|
|
244
|
+
npx onreza-release generate-commitlint --format js --output .commitlintrc.js
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Что генерируется?
|
|
248
|
+
|
|
249
|
+
Команда автоматически извлекает:
|
|
250
|
+
- **Типы коммитов** из `changelog.types` (feat, fix, docs, etc.)
|
|
251
|
+
- **Scopes** из названий пакетов в монорепо + дополнительные scopes
|
|
252
|
+
- **Правила валидации** (max length, case, required fields)
|
|
253
|
+
|
|
254
|
+
### Конфигурация defaults
|
|
255
|
+
|
|
256
|
+
Добавьте секцию `commitlint` в `.gitversereleaserc.json`:
|
|
257
|
+
|
|
258
|
+
```json
|
|
259
|
+
{
|
|
260
|
+
"commitlint": {
|
|
261
|
+
"output": "commitlint.config.ts",
|
|
262
|
+
"format": "ts",
|
|
263
|
+
"scopes": ["deps", "ci", "docs"],
|
|
264
|
+
"scopeRequired": false,
|
|
265
|
+
"headerMaxLength": 100,
|
|
266
|
+
"comments": true
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Теперь можно просто запускать `npx onreza-release generate-commitlint` без параметров!
|
|
272
|
+
|
|
273
|
+
### CLI опции
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
--output <path> Путь для вывода (default: из конфига)
|
|
277
|
+
--format <ts|js|json> Формат файла (default: из конфига)
|
|
278
|
+
--scopes <list> Дополнительные scopes через запятую
|
|
279
|
+
--scope-required Требовать обязательный scope
|
|
280
|
+
--header-max-length <n> Максимальная длина header
|
|
281
|
+
--no-comments Отключить комментарии в файле
|
|
282
|
+
--dry-run Preview без записи
|
|
283
|
+
--verbose Подробный вывод
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Примеры использования
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
# Использовать настройки из конфига
|
|
290
|
+
npx onreza-release generate-commitlint
|
|
291
|
+
|
|
292
|
+
# Preview сгенерированного файла
|
|
293
|
+
npx onreza-release generate-commitlint --dry-run --verbose
|
|
294
|
+
|
|
295
|
+
# Генерировать JS вместо TS
|
|
296
|
+
npx onreza-release generate-commitlint --format js --output .commitlintrc.js
|
|
297
|
+
|
|
298
|
+
# Добавить дополнительные scopes
|
|
299
|
+
npx onreza-release generate-commitlint --scopes api,cli,tests
|
|
300
|
+
|
|
301
|
+
# Требовать обязательный scope
|
|
302
|
+
npx onreza-release generate-commitlint --scope-required
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### Преимущества
|
|
306
|
+
|
|
307
|
+
✅ **Единый источник истины** - типы и scopes определяются в одном месте
|
|
308
|
+
✅ **Автоматическая синхронизация** - изменения в release конфиге автоматически отражаются в commitlint
|
|
309
|
+
✅ **Меньше ошибок** - нет риска рассинхронизации конфигов
|
|
310
|
+
✅ **CI-friendly** - легко интегрируется в pipelines для проверки актуальности конфига
|
|
311
|
+
|
|
312
|
+
## Бинарная дистрибуция
|
|
313
|
+
|
|
314
|
+
Инструмент поддерживает создание и публикацию платформенных npm-пакетов по паттерну, используемому esbuild, biome, bun и другими инструментами.
|
|
315
|
+
|
|
316
|
+
### Как это работает
|
|
317
|
+
|
|
318
|
+
1. **Платформенные пакеты** (`@scope/name-linux-x64`, `@scope/name-darwin-arm64`, ...) содержат только бинарник для конкретной платформы с фильтрами `os`/`cpu` в package.json
|
|
319
|
+
2. **Основной пакет** объявляет их в `optionalDependencies` и содержит JS wrapper, который находит и запускает нужный бинарник
|
|
320
|
+
3. npm автоматически устанавливает только подходящий платформенный пакет
|
|
321
|
+
|
|
322
|
+
### Быстрый старт
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
# Preview без публикации
|
|
326
|
+
npx onreza-release publish-binaries --dry-run
|
|
327
|
+
|
|
328
|
+
# Только генерация пакетов (без публикации)
|
|
329
|
+
npx onreza-release generate-binary-packages
|
|
330
|
+
|
|
331
|
+
# Генерация и публикация
|
|
332
|
+
npx onreza-release publish-binaries
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Конфигурация
|
|
336
|
+
|
|
337
|
+
Добавьте секцию `binaries` в `.gitversereleaserc.jsonc`:
|
|
338
|
+
|
|
339
|
+
```jsonc
|
|
340
|
+
{
|
|
341
|
+
"binaries": {
|
|
342
|
+
"enabled": true,
|
|
343
|
+
"scope": "@rainypixel", // npm scope (опционально)
|
|
344
|
+
"name": "yougile", // базовое имя пакетов
|
|
345
|
+
"binName": "yougile", // имя бинарника в $PATH (опционально)
|
|
346
|
+
"distDir": "./dist", // директория с бинарниками
|
|
347
|
+
"outDir": "./npm", // куда генерировать пакеты
|
|
348
|
+
"platforms": [
|
|
349
|
+
"linux-x64",
|
|
350
|
+
"linux-arm64",
|
|
351
|
+
"darwin-x64",
|
|
352
|
+
"darwin-arm64",
|
|
353
|
+
"win32-x64"
|
|
354
|
+
],
|
|
355
|
+
"publishCommand": "npm publish --access public",
|
|
356
|
+
"mainPackage": "./package.json", // основной package.json
|
|
357
|
+
"continueOnError": false, // продолжать при ошибке
|
|
358
|
+
"retryAttempts": 3 // retry для публикации
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### Пакеты без scope
|
|
364
|
+
|
|
365
|
+
`scope` опционален. Без него пакеты публикуются как `myapp-linux-x64` вместо `@org/myapp-linux-x64`:
|
|
366
|
+
|
|
367
|
+
```jsonc
|
|
368
|
+
{
|
|
369
|
+
"binaries": {
|
|
370
|
+
"enabled": true,
|
|
371
|
+
"name": "myapp", // без scope!
|
|
372
|
+
"distDir": "./dist",
|
|
373
|
+
"platforms": ["linux-x64", "darwin-arm64"]
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// Результат: myapp-linux-x64, myapp-darwin-arm64
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
### Кастомный шаблон имени пакета
|
|
380
|
+
|
|
381
|
+
Используйте `packageNameTemplate` для гибкой настройки имён:
|
|
382
|
+
|
|
383
|
+
```jsonc
|
|
384
|
+
{
|
|
385
|
+
"binaries": {
|
|
386
|
+
"name": "myapp",
|
|
387
|
+
"packageNameTemplate": "{{name}}-bin-{{platform}}"
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// Результат: myapp-bin-linux-x64
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
```jsonc
|
|
394
|
+
{
|
|
395
|
+
"binaries": {
|
|
396
|
+
"name": "myapp",
|
|
397
|
+
"scope": "@org",
|
|
398
|
+
"packageNameTemplate": "@{{scope}}/{{name}}-cli-{{platform}}"
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// Результат: @org/myapp-cli-linux-x64
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
**Плейсхолдеры:** `{{scope}}`, `{{name}}`, `{{platform}}`
|
|
405
|
+
|
|
406
|
+
**Дефолтные шаблоны:**
|
|
407
|
+
- Без scope: `{{name}}-{{platform}}`
|
|
408
|
+
- Со scope: `@{{scope}}/{{name}}-{{platform}}`
|
|
409
|
+
|
|
410
|
+
### Структура бинарников
|
|
411
|
+
|
|
412
|
+
#### Формат "directory" (по умолчанию)
|
|
413
|
+
|
|
414
|
+
Бинарники в директориях:
|
|
415
|
+
|
|
416
|
+
```
|
|
417
|
+
dist/
|
|
418
|
+
yougile-linux-x64/
|
|
419
|
+
yougile # бинарник для linux x64
|
|
420
|
+
yougile-darwin-arm64/
|
|
421
|
+
yougile # бинарник для macOS ARM
|
|
422
|
+
yougile-win32-x64/
|
|
423
|
+
yougile.exe # бинарник для Windows
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
#### Формат "tar.gz"
|
|
427
|
+
|
|
428
|
+
Бинарники в tar.gz архивах (удобно для CI артефактов):
|
|
429
|
+
|
|
430
|
+
```jsonc
|
|
431
|
+
{
|
|
432
|
+
"binaries": {
|
|
433
|
+
"inputFormat": "tar.gz",
|
|
434
|
+
"sourceBinName": "cli", // имя бинарника внутри архива
|
|
435
|
+
"platformMap": { // маппинг имён архивов на платформы
|
|
436
|
+
"linux-amd64": "linux-x64",
|
|
437
|
+
"darwin-arm64": "darwin-arm64",
|
|
438
|
+
"windows-x64": "win32-x64"
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
Структура архивов:
|
|
445
|
+
```
|
|
446
|
+
dist/
|
|
447
|
+
myapp-linux-amd64.tar.gz # содержит cli (или cli внутри поддиректории)
|
|
448
|
+
myapp-darwin-arm64.tar.gz
|
|
449
|
+
myapp-windows-x64.tar.gz
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
**Опции для tar.gz:**
|
|
453
|
+
- `inputFormat: "tar.gz"` — включает режим архивов
|
|
454
|
+
- `sourceBinName` — имя бинарника внутри архива (если отличается от `name`)
|
|
455
|
+
- `platformMap` — маппинг ключей в именах архивов на npm платформы
|
|
456
|
+
|
|
457
|
+
### Генерируемая структура
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
npm/
|
|
461
|
+
@rainypixel/
|
|
462
|
+
yougile-linux-x64/
|
|
463
|
+
package.json # { "os": ["linux"], "cpu": ["x64"], "bin": {...} }
|
|
464
|
+
bin/yougile # скопированный бинарник
|
|
465
|
+
README.md
|
|
466
|
+
yougile-darwin-arm64/
|
|
467
|
+
...
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### CLI опции
|
|
471
|
+
|
|
472
|
+
```bash
|
|
473
|
+
# Publish binaries
|
|
474
|
+
npx onreza-release publish-binaries [options]
|
|
475
|
+
|
|
476
|
+
# Generate only (без публикации)
|
|
477
|
+
npx onreza-release generate-binary-packages [options]
|
|
478
|
+
|
|
479
|
+
Опции:
|
|
480
|
+
--dry-run Preview без изменений
|
|
481
|
+
--version <ver> Override версии
|
|
482
|
+
--platforms <list> Конкретные платформы (comma-separated)
|
|
483
|
+
--generate-only Только генерация (для publish-binaries)
|
|
484
|
+
--skip-main-package Не обновлять основной package.json
|
|
485
|
+
--verbose Подробный вывод
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
### Кастомная команда публикации
|
|
489
|
+
|
|
490
|
+
Команда публикации поддерживает плейсхолдеры:
|
|
491
|
+
|
|
492
|
+
```jsonc
|
|
493
|
+
{
|
|
494
|
+
"binaries": {
|
|
495
|
+
"publishCommand": "npm publish --access public --registry https://registry.npmjs.org"
|
|
496
|
+
// Доступные плейсхолдеры:
|
|
497
|
+
// {{packageDir}} - путь к пакету
|
|
498
|
+
// {{version}} - версия
|
|
499
|
+
// {{platform}} - платформа (linux-x64, etc.)
|
|
500
|
+
// {{scope}} - npm scope
|
|
501
|
+
// {{name}} - имя пакета
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
### Пример dry-run вывода
|
|
507
|
+
|
|
508
|
+
```
|
|
509
|
+
🔍 DRY RUN MODE
|
|
510
|
+
|
|
511
|
+
📦 Binary Distribution:
|
|
512
|
+
Scope: @rainypixel
|
|
513
|
+
Name: yougile
|
|
514
|
+
Version: 1.2.3
|
|
515
|
+
Platforms: linux-x64, darwin-arm64
|
|
516
|
+
|
|
517
|
+
📁 Packages to generate:
|
|
518
|
+
npm/@rainypixel/yougile-linux-x64/
|
|
519
|
+
npm/@rainypixel/yougile-darwin-arm64/
|
|
520
|
+
|
|
521
|
+
📝 Main package updates:
|
|
522
|
+
optionalDependencies:
|
|
523
|
+
"@rainypixel/yougile-linux-x64": "1.2.3"
|
|
524
|
+
"@rainypixel/yougile-darwin-arm64": "1.2.3"
|
|
525
|
+
bin:
|
|
526
|
+
"yougile": "bin/yougile.js"
|
|
527
|
+
|
|
528
|
+
🚀 Publish command: npm publish --access public
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
### Интеграция с CI/CD
|
|
532
|
+
|
|
533
|
+
```yaml
|
|
534
|
+
jobs:
|
|
535
|
+
publish-binaries:
|
|
536
|
+
runs-on: ubuntu-latest
|
|
537
|
+
steps:
|
|
538
|
+
- uses: actions/checkout@v4
|
|
539
|
+
|
|
540
|
+
# Скачать бинарники из других jobs или артефактов
|
|
541
|
+
- name: Download binaries
|
|
542
|
+
uses: actions/download-artifact@v4
|
|
543
|
+
with:
|
|
544
|
+
name: binaries
|
|
545
|
+
path: dist/
|
|
546
|
+
|
|
547
|
+
- uses: oven-sh/setup-bun@v2
|
|
548
|
+
- run: bun install
|
|
549
|
+
|
|
550
|
+
- name: Publish platform packages
|
|
551
|
+
run: npx onreza-release publish-binaries
|
|
552
|
+
env:
|
|
553
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
## Конфигурация
|
|
557
|
+
|
|
558
|
+
### Полный пример
|
|
559
|
+
|
|
560
|
+
```json
|
|
561
|
+
{
|
|
562
|
+
"git": {
|
|
563
|
+
"beforeCommit": "bun run lint:fix",
|
|
564
|
+
"commitMessage": "chore(release): v{version} [skip ci]",
|
|
565
|
+
"tagMessage": "Release {version}",
|
|
566
|
+
"push": true,
|
|
567
|
+
"commitChanges": true
|
|
568
|
+
},
|
|
569
|
+
"changelog": {
|
|
570
|
+
"types": {
|
|
571
|
+
"feat": "✨ Новые возможности",
|
|
572
|
+
"fix": "🐛 Исправления",
|
|
573
|
+
"perf": "⚡ Улучшения производительности",
|
|
574
|
+
"refactor": "♻️ Рефакторинг",
|
|
575
|
+
"docs": "📝 Документация",
|
|
576
|
+
"style": "💄 Стили",
|
|
577
|
+
"test": "✅ Тесты",
|
|
578
|
+
"build": "🔧 Сборка",
|
|
579
|
+
"ci": "👷 CI/CD",
|
|
580
|
+
"chore": "🧹 Прочее"
|
|
581
|
+
},
|
|
582
|
+
"showHash": true,
|
|
583
|
+
"showAuthor": true
|
|
584
|
+
},
|
|
585
|
+
"versioning": {
|
|
586
|
+
"tagPrefix": "v",
|
|
587
|
+
"prereleasePrefix": "beta",
|
|
588
|
+
"allowPrerelease": false,
|
|
589
|
+
"preMajorMode": "auto"
|
|
590
|
+
},
|
|
591
|
+
"gitverse": {
|
|
592
|
+
"createRelease": true,
|
|
593
|
+
"token": "${GVR_TOKEN}"
|
|
594
|
+
},
|
|
595
|
+
"monorepo": {
|
|
596
|
+
"enabled": false,
|
|
597
|
+
"packages": []
|
|
598
|
+
},
|
|
599
|
+
"commitlint": {
|
|
600
|
+
"output": "commitlint.config.ts",
|
|
601
|
+
"format": "ts",
|
|
602
|
+
"scopes": ["deps", "ci", "docs"],
|
|
603
|
+
"scopeRequired": false,
|
|
604
|
+
"headerMaxLength": 100,
|
|
605
|
+
"comments": true
|
|
606
|
+
},
|
|
607
|
+
"binaries": {
|
|
608
|
+
"enabled": false,
|
|
609
|
+
"scope": "@myorg",
|
|
610
|
+
"name": "myapp",
|
|
611
|
+
"distDir": "./dist",
|
|
612
|
+
"outDir": "./npm",
|
|
613
|
+
"platforms": ["linux-x64", "linux-arm64", "darwin-x64", "darwin-arm64", "win32-x64"],
|
|
614
|
+
"publishCommand": "npm publish --access public",
|
|
615
|
+
"continueOnError": false,
|
|
616
|
+
"retryAttempts": 3
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
### beforeCommit хук
|
|
622
|
+
|
|
623
|
+
Хук `beforeCommit` запускается **перед проверкой чистоты working tree** и позволяет автоматически подготовить файлы перед созданием релиза:
|
|
624
|
+
|
|
625
|
+
```json
|
|
626
|
+
{
|
|
627
|
+
"git": {
|
|
628
|
+
"beforeCommit": "bun run lint:fix"
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
**Как это работает:**
|
|
634
|
+
1. Запускается команда `beforeCommit` (например, линтер)
|
|
635
|
+
2. Если команда выполнилась успешно (exit code 0):
|
|
636
|
+
- Все измененные файлы добавляются в staging area (`git add -A`)
|
|
637
|
+
- Эти изменения войдут в коммит релиза вместе с version/changelog
|
|
638
|
+
3. Проверяется чистота working tree (только unstaged изменения)
|
|
639
|
+
|
|
640
|
+
**Примеры использования:**
|
|
641
|
+
```json
|
|
642
|
+
// Форматирование кода
|
|
643
|
+
"beforeCommit": "bun run format"
|
|
644
|
+
|
|
645
|
+
// Линтинг и автофикс
|
|
646
|
+
"beforeCommit": "bun run lint:fix"
|
|
647
|
+
|
|
648
|
+
// Обновление lock файлов
|
|
649
|
+
"beforeCommit": "bun install --frozen-lockfile=false"
|
|
650
|
+
|
|
651
|
+
// Несколько команд
|
|
652
|
+
"beforeCommit": "bun run lint:fix && bun run format"
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
**Важно:** Если хук завершается с ошибкой (exit code ≠ 0), изменения НЕ добавляются в staging area и релиз продолжается как обычно.
|
|
656
|
+
|
|
657
|
+
### Переменные окружения
|
|
658
|
+
|
|
659
|
+
```bash
|
|
660
|
+
# Токен GitVerse для создания релизов
|
|
661
|
+
export GVR_TOKEN="your-token-here"
|
|
662
|
+
|
|
663
|
+
# Или через .env файл
|
|
664
|
+
echo "GVR_TOKEN=your-token" >> .env
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
### ⚠️ Настройка GVR_TOKEN
|
|
668
|
+
|
|
669
|
+
**КРИТИЧЕСКИ ВАЖНО:** Без настройки `GVR_TOKEN` инструмент работает в **урезанном режиме**:
|
|
670
|
+
|
|
671
|
+
✅ **С токеном (полный режим):**
|
|
672
|
+
- Автоматическое создание релизов в GitVerse
|
|
673
|
+
- Публикация changelog в релиз
|
|
674
|
+
- Загрузка ассетов релиза
|
|
675
|
+
- Push тегов и коммитов в удаленный репозиторий
|
|
676
|
+
|
|
677
|
+
⚠️ **Без токена (урезанный режим):**
|
|
678
|
+
- ❌ НЕТ создания релизов в GitVerse
|
|
679
|
+
- ✅ Генерация CHANGELOG локально
|
|
680
|
+
- ✅ Создание git тегов локально
|
|
681
|
+
- ✅ Коммиты изменений локально
|
|
682
|
+
|
|
683
|
+
#### Настройка токена для GitVerse Actions
|
|
684
|
+
|
|
685
|
+
**Важно:** `GVR_TOKEN` **НЕ предоставляется автоматически** в GitVerse Actions!
|
|
686
|
+
|
|
687
|
+
**Шаг 1: Создайте Personal Access Token**
|
|
688
|
+
1. Перейдите в GitVerse: **Settings** → **Applications** → **Generate New Token**
|
|
689
|
+
2. Выберите необходимые права:
|
|
690
|
+
- `repo` - полный доступ к репозиториям (обязательно для релизов)
|
|
691
|
+
3. Скопируйте токен (показывается только один раз!)
|
|
692
|
+
|
|
693
|
+
**Шаг 2: Добавьте токен в Secrets репозитория**
|
|
694
|
+
1. В репозитории: **Settings** → **Secrets and Variables** → **Actions**
|
|
695
|
+
2. Нажмите **New repository secret**
|
|
696
|
+
3. **Name:** `GVR_TOKEN`
|
|
697
|
+
4. **Value:** ваш Personal Access Token
|
|
698
|
+
5. Сохраните
|
|
699
|
+
|
|
700
|
+
**Шаг 3: Используйте в workflow**
|
|
701
|
+
```yaml
|
|
702
|
+
env:
|
|
703
|
+
GVR_TOKEN: ${{ secrets.GVR_TOKEN }}
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
**Шаг 4: Проверка (рекомендуется)**
|
|
707
|
+
```yaml
|
|
708
|
+
- name: Validate GVR_TOKEN
|
|
709
|
+
run: |
|
|
710
|
+
if [ -z "$GVR_TOKEN" ]; then
|
|
711
|
+
echo "❌ ERROR: GVR_TOKEN is not set!"
|
|
712
|
+
echo "Please add GVR_TOKEN to repository secrets."
|
|
713
|
+
exit 1
|
|
714
|
+
fi
|
|
715
|
+
echo "✅ GVR_TOKEN is configured"
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
## CLI опции
|
|
719
|
+
|
|
720
|
+
### Основные команды
|
|
721
|
+
|
|
722
|
+
```bash
|
|
723
|
+
# Создать релиз
|
|
724
|
+
npx onreza-release [package] [options]
|
|
725
|
+
|
|
726
|
+
# Инициализировать конфигурацию
|
|
727
|
+
npx onreza-release init [options]
|
|
728
|
+
|
|
729
|
+
# Генерировать commitlint конфиг
|
|
730
|
+
npx onreza-release generate-commitlint [options]
|
|
731
|
+
|
|
732
|
+
# Создать только GitVerse Release для существующего тега (recovery mode)
|
|
733
|
+
npx onreza-release create-only --tag <tag> [--package <name>]
|
|
734
|
+
|
|
735
|
+
# Публикация бинарных пакетов
|
|
736
|
+
npx onreza-release publish-binaries [options]
|
|
737
|
+
|
|
738
|
+
# Генерация бинарных пакетов (без публикации)
|
|
739
|
+
npx onreza-release generate-binary-packages [options]
|
|
740
|
+
```
|
|
741
|
+
|
|
742
|
+
### Опции для релиза
|
|
743
|
+
|
|
744
|
+
```
|
|
745
|
+
Аргументы:
|
|
746
|
+
package Имя пакета для релиза (для монорепозиториев)
|
|
747
|
+
|
|
748
|
+
Опции:
|
|
749
|
+
--dry-run Запуск без внесения изменений
|
|
750
|
+
--config <path> Путь к конфиг файлу (default: .gitversereleaserc.json)
|
|
751
|
+
--package <name> Имя пакета для релиза (для монорепо)
|
|
752
|
+
--version <version> Указать конкретную версию
|
|
753
|
+
--prerelease [tag] Создать prerelease версию (beta, alpha, rc)
|
|
754
|
+
--no-commit Не создавать git коммит
|
|
755
|
+
--no-tag Не создавать git тег
|
|
756
|
+
--no-push Не пушить в remote
|
|
757
|
+
--no-release Не создавать GitVerse Release
|
|
758
|
+
--verbose Подробный вывод
|
|
759
|
+
--help Показать справку
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
### Опции для generate-commitlint
|
|
763
|
+
|
|
764
|
+
```
|
|
765
|
+
Опции:
|
|
766
|
+
--output <path> Путь для вывода (default: commitlint.config.ts)
|
|
767
|
+
--format <ts|js|json> Формат файла (default: ts)
|
|
768
|
+
--scopes <scopes> Дополнительные scopes (comma-separated)
|
|
769
|
+
--scope-required Требовать обязательный scope
|
|
770
|
+
--header-max-length <n> Максимальная длина header (default: 100)
|
|
771
|
+
--no-comments Отключить комментарии в файле
|
|
772
|
+
--dry-run Preview без записи
|
|
773
|
+
--verbose Подробный вывод
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
### Опции для publish-binaries / generate-binary-packages
|
|
777
|
+
|
|
778
|
+
```
|
|
779
|
+
Опции:
|
|
780
|
+
--dry-run Preview без изменений
|
|
781
|
+
--version <ver> Override версии (default: из package.json)
|
|
782
|
+
--platforms <list> Конкретные платформы (comma-separated)
|
|
783
|
+
--generate-only Только генерация, без публикации
|
|
784
|
+
--skip-main-package Не обновлять основной package.json
|
|
785
|
+
--verbose Подробный вывод
|
|
786
|
+
```
|
|
787
|
+
|
|
788
|
+
## CI/CD интеграция
|
|
789
|
+
|
|
790
|
+
### GitVerse Actions
|
|
791
|
+
|
|
792
|
+
⚠️ **Перед использованием:** Убедитесь, что `GVR_TOKEN` добавлен в Secrets репозитория (см. [Настройка GVR_TOKEN](#️-настройка-gitverse_token))
|
|
793
|
+
|
|
794
|
+
```yaml
|
|
795
|
+
name: Release
|
|
796
|
+
|
|
797
|
+
on:
|
|
798
|
+
workflow_dispatch:
|
|
799
|
+
|
|
800
|
+
env:
|
|
801
|
+
# ОБЯЗАТЕЛЬНО: Добавьте GVR_TOKEN в Secrets репозитория!
|
|
802
|
+
GVR_TOKEN: ${{ secrets.GVR_TOKEN }}
|
|
803
|
+
|
|
804
|
+
jobs:
|
|
805
|
+
release:
|
|
806
|
+
runs-on: ubuntu-latest
|
|
807
|
+
steps:
|
|
808
|
+
- uses: actions/checkout@v4
|
|
809
|
+
with:
|
|
810
|
+
fetch-depth: 0
|
|
811
|
+
|
|
812
|
+
- uses: oven-sh/setup-bun@v2
|
|
813
|
+
|
|
814
|
+
- run: bun install
|
|
815
|
+
|
|
816
|
+
# ВАЖНО: Проверка наличия токена перед релизом
|
|
817
|
+
- name: Validate GVR_TOKEN
|
|
818
|
+
run: |
|
|
819
|
+
if [ -z "$GVR_TOKEN" ]; then
|
|
820
|
+
echo "❌ ERROR: GVR_TOKEN is not set!"
|
|
821
|
+
echo "Please add GVR_TOKEN to repository secrets."
|
|
822
|
+
echo "See: Settings → Secrets and Variables → Actions"
|
|
823
|
+
exit 1
|
|
824
|
+
fi
|
|
825
|
+
echo "✅ GVR_TOKEN is configured"
|
|
826
|
+
|
|
827
|
+
- name: Configure Git
|
|
828
|
+
run: |
|
|
829
|
+
git config user.name "GitVerse CI"
|
|
830
|
+
git config user.email "ci@gitverse.ru"
|
|
831
|
+
|
|
832
|
+
- name: Create Release
|
|
833
|
+
run: bun run release
|
|
834
|
+
```
|
|
835
|
+
|
|
836
|
+
**Что происходит в этом workflow:**
|
|
837
|
+
1. ✅ Проверяет наличие `GVR_TOKEN` (workflow упадет с ошибкой, если токен не настроен)
|
|
838
|
+
2. ✅ Устанавливает зависимости
|
|
839
|
+
3. ✅ Настраивает git для создания коммитов
|
|
840
|
+
4. ✅ Создает релиз с полным функционалом (CHANGELOG, теги, GitVerse release)
|
|
841
|
+
5. ✅ Автоматически публикует в GitVerse
|
|
842
|
+
|
|
843
|
+
## Разработка
|
|
844
|
+
|
|
845
|
+
```bash
|
|
846
|
+
# Установка зависимостей
|
|
847
|
+
bun install
|
|
848
|
+
|
|
849
|
+
# Запуск тестов
|
|
850
|
+
bun test
|
|
851
|
+
|
|
852
|
+
# Проверка покрытия
|
|
853
|
+
bun test:coverage
|
|
854
|
+
|
|
855
|
+
# Сборка проекта
|
|
856
|
+
bun run build
|
|
857
|
+
|
|
858
|
+
# Линтинг
|
|
859
|
+
bun run lint
|
|
860
|
+
bun run lint:fix
|
|
861
|
+
```
|
|
862
|
+
|
|
863
|
+
## Лицензия
|
|
864
|
+
|
|
865
|
+
MIT © [ONREZA](https://onreza.ru)
|
|
866
|
+
|
|
867
|
+
## Полезные ссылки
|
|
868
|
+
|
|
869
|
+
- [GitVerse SDK](https://gitverse.ru/onreza/release-tool) - Основной репозиторий
|
|
870
|
+
- [Conventional Commits](https://www.conventionalcommits.org/ru/) - Спецификация
|
|
871
|
+
- [Keep a Changelog](https://keepachangelog.com/ru/) - Руководство по CHANGELOG
|
|
872
|
+
- [Semantic Versioning](https://semver.org/lang/ru/) - Семантическое версионирование
|
|
873
|
+
- [npm пакет](https://www.npmjs.com/package/onreza-release)
|
|
874
|
+
|
|
875
|
+
## Сообщить об ошибке
|
|
876
|
+
|
|
877
|
+
Создайте issue на [GitVerse](https://gitverse.ru/onreza/release-tool/tasktracker)
|
|
878
|
+
|
|
879
|
+
---
|
|
880
|
+
|
|
881
|
+
Сделано с ❤️ для GitVerse
|