release-tool

0
README.md

ONREZA Release

npm version License: MIT Test Coverage

Универсальный инструмент автоматизации релизов с поддержкой Conventional Commits, семантического версионирования и интеграцией с GitVerse, GitHub и GitLab (coming soon).

Возможности

  • Автоматическое версионирование на основе Conventional Commits
  • 📝 Генерация CHANGELOG с группировкой по типам коммитов
  • 🌐 Мультиплатформенность — поддержка GitVerse, GitHub и GitLab
  • 🔄 Автоопределение платформы по git remote или CI окружению
  • 📦 Поддержка монорепозиториев с независимым версионированием
  • 🏷️ Автоматические git теги и коммиты
  • 🔍 Режим dry-run для безопасного тестирования
  • ⚙️ Гибкая конфигурация через
    .onrezarelease.json
  • 🔧 Автогенерация commitlint конфига из release конфигурации
  • 🪝 Хуки beforeCommit для автоматической подготовки файлов перед релизом
  • 📤 Бинарная дистрибуция — публикация платформенных npm-пакетов (по паттерну esbuild/biome)

Установка

💡 Примечание о runtime: CLI работает на Node.js (>= 18), Bun не требуется для использования. Это позволяет запускать инструмент в CI/CD без дополнительной установки Bun.

Быстрый старт

⚠️ Важно: Для создания релизов необходимо настроить токен платформы:

  • GitVerse:
    GVR_TOKEN
  • GitHub:
    GITHUB_TOKEN
    или
    GH_TOKEN
  • GitLab:
    GITLAB_TOKEN
    или
    GL_TOKEN

Без токена инструмент работает в урезанном режиме (только локальные теги и CHANGELOG). См. Настройка токенов

1. Базовое использование

2. Конфигурация

Создайте

.onrezarelease.json
в корне проекта:

3. Добавьте в package.json

Использование

Conventional Commits

Инструмент автоматически определяет тип версии на основе коммитов:

Pre-Major режим (0.x.x проекты)

Для проектов в стадии разработки (версии

0.x.x
) доступен режим
preMajorMode
, который контролирует поведение BREAKING CHANGES:

Режимы работы:

  • "auto"
    (default) - версии
    < 1.0.0
    minor bump,
    >= 1.0.0
    major bump
  • "enabled"
    - BREAKING CHANGE всегда делает minor bump (для experimental проектов)
  • "disabled"
    - стандартное semver поведение (BREAKING → major bump)
  • "2.0.0"
    - порог версии (minor bump пока версия < порога)

Примеры:

Зачем это нужно? По спецификации semver версии

0.x.x
находятся в pre-release фазе, где minor bump уже означает breaking change. Режим
auto
автоматически применяет правильную семантику.

Программное использование

Примечание для CI:

  • GitVerse Actions:
    GVR_TOKEN
    должен быть настроен в Secrets
  • GitHub Actions:
    GITHUB_TOKEN
    доступен автоматически
  • GitLab CI:
    GITLAB_TOKEN
    должен быть настроен в Variables

Подробнее см. Настройка токенов

Поддержка монорепозиториев

Конфигурация

Использование

Фильтрация коммитов по scope

Генерация Commitlint конфига

Инструмент может автоматически генерировать

commitlint.config.ts
из вашей release конфигурации, обеспечивая синхронизацию между форматом коммитов и генерацией релизов.

Быстрый старт

Что генерируется?

Команда автоматически извлекает:

  • Типы коммитов из
    changelog.types
    (feat, fix, docs, etc.)
  • Scopes из названий пакетов в монорепо + дополнительные scopes
  • Правила валидации (max length, case, required fields)

Конфигурация defaults

Добавьте секцию

commitlint
в
.onrezarelease.json
:

Теперь можно просто запускать

npx onreza-release generate-commitlint
без параметров!

CLI опции

Примеры использования

Преимущества

Единый источник истины - типы и scopes определяются в одном месте ✅ Автоматическая синхронизация - изменения в release конфиге автоматически отражаются в commitlint ✅ Меньше ошибок - нет риска рассинхронизации конфигов ✅ CI-friendly - легко интегрируется в pipelines для проверки актуальности конфига

Бинарная дистрибуция

Инструмент поддерживает создание и публикацию платформенных npm-пакетов по паттерну, используемому esbuild, biome, bun и другими инструментами.

Как это работает

  1. Платформенные пакеты (
    @scope/name-linux-x64
    ,
    @scope/name-darwin-arm64
    , ...) содержат только бинарник для конкретной платформы с фильтрами
    os
    /
    cpu
    в package.json
  2. Основной пакет объявляет их в
    optionalDependencies
    и содержит JS wrapper, который находит и запускает нужный бинарник
  3. npm автоматически устанавливает только подходящий платформенный пакет

Быстрый старт

Конфигурация

Добавьте секцию

binaries
в
.onrezarelease.jsonc
:

Пакеты без scope

scope
опционален. Без него пакеты публикуются как
myapp-linux-x64
вместо
@org/myapp-linux-x64
:

Кастомный шаблон имени пакета

Используйте

packageNameTemplate
для гибкой настройки имён:

Плейсхолдеры:

{{scope}}
,
{{name}}
,
{{platform}}

Дефолтные шаблоны:

  • Без scope:
    {{name}}-{{platform}}
  • Со scope:
    @{{scope}}/{{name}}-{{platform}}

Структура бинарников

Формат "directory" (по умолчанию)

Бинарники в директориях:

dist/ yougile-linux-x64/ yougile # бинарник для linux x64 yougile-darwin-arm64/ yougile # бинарник для macOS ARM yougile-win32-x64/ yougile.exe # бинарник для Windows

Формат "tar.gz"

Бинарники в tar.gz архивах (удобно для CI артефактов):

Структура архивов:

dist/ myapp-linux-amd64.tar.gz # содержит cli (или cli внутри поддиректории) myapp-darwin-arm64.tar.gz myapp-windows-x64.tar.gz

Опции для tar.gz:

  • inputFormat: "tar.gz"
    — включает режим архивов
  • sourceBinName
    — имя бинарника внутри архива (если отличается от
    name
    )
  • platformMap
    — маппинг ключей в именах архивов на npm платформы

Генерируемая структура

npm/ @rainypixel/ yougile-linux-x64/ package.json # { "os": ["linux"], "cpu": ["x64"], "bin": {...} } bin/yougile # скопированный бинарник README.md yougile-darwin-arm64/ ...

CLI опции

Кастомная команда публикации

Команда публикации поддерживает плейсхолдеры:

Пример dry-run вывода

🔍 DRY RUN MODE 📦 Binary Distribution: Scope: @rainypixel Name: yougile Version: 1.2.3 Platforms: linux-x64, darwin-arm64 📁 Packages to generate: npm/@rainypixel/yougile-linux-x64/ npm/@rainypixel/yougile-darwin-arm64/ 📝 Main package updates: optionalDependencies: "@rainypixel/yougile-linux-x64": "1.2.3" "@rainypixel/yougile-darwin-arm64": "1.2.3" bin: "yougile": "bin/yougile.js" 🚀 Publish command: npm publish --access public

Интеграция с CI/CD

Мультиплатформенность

Инструмент поддерживает создание релизов на разных Git платформах с автоматическим определением.

Поддерживаемые платформы

ПлатформаТокенCI окружение
GitVerse
GVR_TOKEN
GitVerse Actions
GitHub
GITHUB_TOKEN
,
GH_TOKEN
GitHub Actions
GitLab
GITLAB_TOKEN
,
GL_TOKEN
GitLab CI

Автоопределение платформы

Платформа определяется автоматически в следующем порядке:

  1. CI окружение — по переменным
    GITVERSE_ACTIONS
    ,
    GITHUB_ACTIONS
    ,
    GITLAB_CI
  2. Git remote URL — по хосту в
    git remote get-url origin

Конфигурация

Примеры использования

Поддержка Rust

Инструмент поддерживает проекты на Rust с автоматическим чтением и обновлением версии из

Cargo.toml
.

Автоопределение типа проекта

По умолчанию инструмент автоматически определяет тип проекта:

  • Если есть
    package.json
    Node.js проект
  • Если есть
    Cargo.toml
    Rust проект

Быстрый старт (Rust)

Конфигурация для Rust

Бинарная дистрибуция для Rust

Для Rust проектов особенно полезна публикация скомпилированных бинарников:

Сборка бинарников для разных платформ:

Структура для бинарной дистрибуции

После сборки бинарники должны быть расположены:

target/release/ myapp-linux-x64/myapp myapp-darwin-arm64/myapp myapp-win32-x64/myapp.exe

Или используйте

inputFormat: "tar.gz"
для архивов.

Монорепозиторий с Rust и Node.js

Конфигурация

Полный пример

beforeCommit хук

Хук

beforeCommit
запускается перед проверкой чистоты working tree и позволяет автоматически подготовить файлы перед созданием релиза:

Как это работает:

  1. Запускается команда
    beforeCommit
    (например, линтер)
  2. Если команда выполнилась успешно (exit code 0):
    • Все измененные файлы добавляются в staging area (
      git add -A
      )
    • Эти изменения войдут в коммит релиза вместе с version/changelog
  3. Проверяется чистота working tree (только unstaged изменения)

Примеры использования:

Важно: Если хук завершается с ошибкой (exit code ≠ 0), изменения НЕ добавляются в staging area и релиз продолжается как обычно.

Переменные окружения

⚠️ Настройка токенов

КРИТИЧЕСКИ ВАЖНО: Без настройки токена платформы инструмент работает в урезанном режиме:

С токеном (полный режим):

  • Автоматическое создание релизов на платформе
  • Публикация changelog в релиз
  • Загрузка ассетов релиза
  • Push тегов и коммитов в удаленный репозиторий

⚠️ Без токена (урезанный режим):

  • ❌ НЕТ создания релизов на платформе
  • ✅ Генерация CHANGELOG локально
  • ✅ Создание git тегов локально
  • ✅ Коммиты изменений локально

Токены по платформам

ПлатформаПеременные окруженияГде создать
GitVerse
GVR_TOKEN
Settings → Applications → Generate New Token
GitHub
GITHUB_TOKEN
,
GH_TOKEN
Settings → Developer settings → Personal access tokens
GitLab
GITLAB_TOKEN
,
GL_TOKEN
Preferences → Access Tokens

Настройка для GitVerse Actions

Важно:

GVR_TOKEN
НЕ предоставляется автоматически в GitVerse Actions!

  1. Создайте Personal Access Token в GitVerse (Settings → Applications)
  2. Добавьте токен в Secrets: SettingsSecrets and VariablesActionsNew repository secret
  3. Используйте в workflow:

Настройка для GitHub Actions

В GitHub Actions

GITHUB_TOKEN
доступен автоматически, но для создания релизов может потребоваться Personal Access Token с расширенными правами:

Настройка для GitLab CI

Проверка токена (рекомендуется)

CLI опции

Основные команды

Опции для релиза

Аргументы: package Имя пакета для релиза (для монорепозиториев) Опции: --dry-run Запуск без внесения изменений --config <path> Путь к конфиг файлу (default: .onrezarelease.json) --package <name> Имя пакета для релиза (для монорепо) --version <version> Указать конкретную версию --prerelease [tag] Создать prerelease версию (beta, alpha, rc) --no-commit Не создавать git коммит --no-tag Не создавать git тег --no-push Не пушить в remote --no-release Не создавать GitVerse Release --verbose Подробный вывод --help Показать справку

Опции для generate-commitlint

Опции: --output <path> Путь для вывода (default: commitlint.config.ts) --format <ts|js|json> Формат файла (default: ts) --scopes <scopes> Дополнительные scopes (comma-separated) --scope-required Требовать обязательный scope --header-max-length <n> Максимальная длина header (default: 100) --no-comments Отключить комментарии в файле --dry-run Preview без записи --verbose Подробный вывод

Опции для publish-binaries / generate-binary-packages

Опции: --dry-run Preview без изменений --version <ver> Override версии (default: из package.json) --platforms <list> Конкретные платформы (comma-separated) --generate-only Только генерация, без публикации --skip-main-package Не обновлять основной package.json --verbose Подробный вывод

CI/CD интеграция

GitVerse Actions

⚠️ Перед использованием: Убедитесь, что

GVR_TOKEN
добавлен в Secrets репозитория (см. Настройка токенов)

Что происходит в этом workflow:

  1. ✅ Проверяет наличие
    GVR_TOKEN
    (workflow упадет с ошибкой, если токен не настроен)
  2. ✅ Устанавливает зависимости через npm
  3. ✅ Настраивает git для создания коммитов
  4. ✅ Создает релиз с полным функционалом (CHANGELOG, теги, GitVerse release)
  5. ✅ Автоматически публикует в GitVerse
  6. ✅ Записывает outputs для использования в последующих шагах

GitHub Actions

GitLab CI

GitHub Actions Outputs

onreza-release
автоматически записывает outputs в
$GITHUB_OUTPUT
при запуске в GitHub Actions (и GitVerse Actions). Это позволяет использовать результаты релиза в последующих шагах workflow без парсинга stdout.

Доступные outputs:

OutputОписаниеПример
released
Был ли релиз создан успешно
true
version
Версия релиза
1.2.3
tag
Тег релиза
v1.2.3
releaseUrl
URL релиза на платформе
https://github.com/owner/repo/releases/tag/v1.2.3

Пример использования:

Работа с publish-binaries:

Примечание: Outputs записываются только при успешном выполнении. Если релиз не удался, outputs не будут доступны.

Разработка

Лицензия

MIT © ONREZA

Полезные ссылки

Сообщить об ошибке

Создайте issue на GitVerse


Сделано с ❤️ для GitVerse