/
Starolat
/
DeepDive
Обзор
Документация
Войти
/
Starolat
/
DeepDive
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/bump-version.js
140 строк
5 KB
Starolat Sergei
feat: добавлено версионирование, cache busting и автоматизация CHANGELOG
03 июл 2026, 13:21
03 июл 2026, 13:21
707cbcd
Код
Авторство
О чём код?
#!/usr/bin/env node /** * Утилита для обновления версии приложения. * * Использование: * node scripts/bump-version.js <major|minor|patch> [--date YYYY-MM-DD] * * Примеры: * node scripts/bump-version.js patch * node scripts/bump-version.js minor --date 2026-07-15 * node scripts/bump-version.js major * * Скрипт выполняет: * 1. Увеличивает номер версии в version.json. * 2. Обновляет buildDate. * 3. Добавляет заготовку раздела [Unreleased] → [X.Y.Z] в CHANGELOG.md. * 4. (Опционально) запускает generate-changelog.js для заполнения раздела коммитами. */ const fs = require('fs'); const path = require('path'); const { execSync } = require('child_process'); const ROOT = path.join(__dirname, '..'); const VERSION_PATH = path.join(ROOT, 'version.json'); const CHANGELOG_PATH = path.join(ROOT, 'CHANGELOG.md'); function readVersion() { const raw = fs.readFileSync(VERSION_PATH, 'utf8'); return JSON.parse(raw); } function writeVersion(version, buildDate) { const data = { version, buildDate }; fs.writeFileSync(VERSION_PATH, JSON.stringify(data, null, 2) + '\n'); } function bump(current, level) { const parts = current.split('.').map(Number); if (parts.length !== 3 || parts.some(isNaN)) { throw new Error(`Некорректный формат версии: ${current}`); } switch (level) { case 'major': parts[0] += 1; parts[1] = 0; parts[2] = 0; break; case 'minor': parts[1] += 1; parts[2] = 0; break; case 'patch': parts[2] += 1; break; default: throw new Error(`Неизвестный уровень версии: ${level}. Используйте major, minor или patch.`); } return parts.join('.'); } function parseArgs() { const args = process.argv.slice(2); if (args.length === 0) { console.error('Ошибка: укажите уровень версии: major, minor или patch'); process.exit(1); } const level = args[0]; let date = new Date().toISOString().split('T')[0]; const dateIndex = args.indexOf('--date'); if (dateIndex !== -1 && args[dateIndex + 1]) { date = args[dateIndex + 1]; } return { level, date }; } function updateChangelog(newVersion, buildDate) { let content = ''; if (fs.existsSync(CHANGELOG_PATH)) { content = fs.readFileSync(CHANGELOG_PATH, 'utf8'); } // Нормализуем переносы строк content = content.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); const header = '# Changelog DeepDive Analytics\n\nВсе значимые изменения проекта фиксируются в этом файле.\n\nФормат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/),\nа версионирование следует [Semantic Versioning](https://semver.org/lang/ru/).\n\n'; let body = content.replace(header, '').trim(); // Проверяем, нет ли уже записи для этой версии if (body.includes(`## [${newVersion}]`)) { console.warn(`[bump] Запись для версии ${newVersion} уже существует в CHANGELOG.md.`); return; } // Убираем старый [Unreleased], чтобы не дублировать body = body.replace(/^## \[Unreleased\]\n*/m, '').trim(); const newSection = `## [Unreleased]\n\n## [${newVersion}] - ${buildDate}\n### Added\n- _Добавьте описание новых возможностей._\n\n### Changed\n- _Добавьте описание изменений._\n\n### Fixed\n- _Добавьте описание исправлений._\n\n`; fs.writeFileSync(CHANGELOG_PATH, header + newSection + body + '\n'); } function main() { const { level, date } = parseArgs(); const current = readVersion(); const newVersion = bump(current.version, level); console.log(`[bump] Текущая версия: ${current.version}`); console.log(`[bump] Новая версия: ${newVersion}`); console.log(`[bump] Дата сборки: ${date}`); writeVersion(newVersion, date); console.log('[bump] version.json обновлён.'); updateChangelog(newVersion, date); console.log('[bump] CHANGELOG.md обновлён.'); // Предлагаем заполнить раздел автоматически const changelogScript = path.join(__dirname, 'generate-changelog.js'); if (fs.existsSync(changelogScript)) { console.log('[bump] Запуск генерации CHANGELOG из коммитов...'); try { execSync(`node "${changelogScript}"`, { stdio: 'inherit', cwd: ROOT }); } catch (e) { console.warn('[bump] Не удалось автоматически заполнить CHANGELOG из коммитов.'); } } console.log('[bump] Готово.'); console.log('[bump] Проверьте CHANGELOG.md и отредактируйте раздел при необходимости.'); } main();