Skip to content

Latest commit

 

History

History
134 lines (97 loc) · 5.72 KB

File metadata and controls

134 lines (97 loc) · 5.72 KB

Conventional commits toolkit

🌐 Translations📜 Code of Conduct

Монорепозиторий с инструментами для анализа истории git и построения release core в соответствии со спецификацией Conventional Commits.

Tests Status codecov

Пакеты

  • @modulify/conventional-git — Тонкая обертка над git с парсингом conventional-коммитов и помощниками для семантических тегов.
  • @modulify/conventional-bump — Помощник для семантических релизов, который рекомендует следующую версию (major/minor/patch).
  • @modulify/conventional-changelog — Генерация чейнджлога из истории git с использованием шаблонов Nunjucks.
  • @modulify/conventional-release — Library-first release-core пакет с конфигурируемым CLI.

Высокоуровневый release flow

import { run } from '@modulify/conventional-release'

const result = await run()

if (!result.changed) {
  console.log('Нет изменений с прошлого релиза')
} else {
  for (const slice of result.slices) {
    if (!slice.changed) continue
    console.log(slice.id, slice.nextVersion, slice.tag)
  }
}

Пакет @modulify/conventional-release объединяет:

  • рекомендации по версии из @modulify/conventional-bump
  • запись changelog из @modulify/conventional-changelog
  • обновление манифестов пакетов
  • создание release-коммита и тегов

Этот пакет сознательно устроен как release core:

  • он планирует release scope
  • вычисляет версии
  • обновляет файлы
  • завершает релиз коммитом и тегами

Он не публикует пакеты в npm и не создаёт hosted releases в GitHub или GitLab. Такие delivery-шаги предполагаются уже в более верхнеуровневых инструментах поверх этого core.

Он также поставляет бинарник conventional-release, поэтому в потребляющем проекте можно использовать:

{
  "scripts": {
    "release": "conventional-release",
    "release:dry": "conventional-release --dry"
  }
}

Полное описание API и CLI находится в README пакета: @modulify/conventional-release

Границы ответственности

@modulify/conventional-release предназначен для repository-local части релиза:

  • определения affected packages
  • построения release slices
  • вычисления версий по истории коммитов
  • обновления манифестов и changelog
  • финализации релиза через commit и tags

Он не задуман как all-in-one delivery pipeline. Если нужны npm publish, GitHub Releases, GitLab Releases или CI-специфичная деплойная обвязка, ожидаемый путь — добавлять их отдельным orchestration-слоем поверх этого проекта.

Низкоуровневая композиция

Если нужен собственный release flow, низкоуровневые пакеты по-прежнему можно использовать напрямую:

import { Client } from '@modulify/conventional-git'
import { ReleaseAdvisor } from '@modulify/conventional-bump'

import { createWrite } from '@modulify/conventional-changelog'

import semver from 'semver'

const git = new Client()
const advisor = new ReleaseAdvisor({ git })

const currentVersion = await git.version() ?? '0.0.0'
const recommendation = await advisor.advise({
  preMajor: semver.lt(currentVersion, '1.0.0')
})

if (recommendation) {
  const nextVersion = semver.inc(currentVersion, recommendation.type)
  const write = createWrite({ git, file: 'CHANGELOG.md' })

  await write(nextVersion)
  console.log(`Следующий релиз: ${nextVersion}`)
}

Почему проект появился

Проект возник не как абстрактный эксперимент, а из практической потребности работать с глубоко вложенными деревьями workspaces, включая репозитории с двумя или тремя уровнями вложенности, тогда как большинство release-инструментов на рынке до сих пор предполагают плоскую или почти плоскую монорепу.

Разработка репозитория

Локальная подготовка:

make .yarnrc.yml
yarn install

Полезные команды:

make test
make test-coverage
make build
make typecheck
make eslint

Предпросмотр релиза для этого репозитория:

yarn release:dry