Skip to content

VLMHyperBenchTeam/release_tool

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

37 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² release_tool

πŸš€ ОписаниС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

release_tool β€” это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² для UV workspace ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² с мноТСствСнными ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ. Он ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄ΠΎΠ»Π³ΠΈΠΉ Ρ€ΡƒΡ‡Π½ΠΎΠΉ процСсс Ρ€Π΅Π»ΠΈΠ·Π° Π² πŸ”„ 7-этапный процСсс Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ с ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠ΅ΠΉ LLM для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ качСствСнных commit- ΠΈ tag-сообщСний.

✨ ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ прСимущСства

  • 🎯 Автоматизация: АвтоматизируСт вСсь Ρ†ΠΈΠΊΠ» Ρ€Π΅Π»ΠΈΠ·Π° ΠΎΡ‚ поиска ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π΄ΠΎ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚Π΅Π³ΠΎΠ²
  • 🧠 LLM-интСграция: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ИИ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ осмыслСнных commit ΠΈ tag сообщСний
  • πŸ“¦ UV Workspace ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°: Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с UV workspace структурой
  • πŸ”„ 7-этапный процСсс: Π§Ρ‘Ρ‚ΠΊΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° логичСскиС шаги β€” ΠΎΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π΄ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ dev-Ρ†ΠΈΠΊΠ»Π°
  • ⚑ Экономия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ: Π‘ΠΎΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ врСмя Ρ€Π΅Π»ΠΈΠ·Π° Π΄ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄
  • πŸ›‘οΈ Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ: Dry-run Ρ€Π΅ΠΆΠΈΠΌ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ + Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
  • πŸ”§ Гибкая конфигурация: Π•Π΄ΠΈΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с ΡƒΠΌΠ½Ρ‹ΠΌ поиском настроСк
  • πŸ“Š CСмантичСскоС вСрсионированиС: АвтоматичСскоС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ вСрсиями (patch/minor/major/dev)
  • πŸ”— Git Submodule: ЛСгкая интСграция Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· submodule
  • πŸ“ ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π°Ρ докумСнтация: Π˜ΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π»ΠΎΠ³ΠΈ ΠΈ понятныС сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…

🎯 Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

  1. ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ измСнСния Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ… workspace
  2. Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ ΠΎ Π½Π΅Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… измСнСниях ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°Ρ…
  3. Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ с LLM для создания качСствСнных сообщСний
  4. АвтоматизируСт git-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (commit, tag, push)
  5. УправляСт вСрсиями с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ сСмантичСского вСрсионирования
  6. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Ρ‡Π΅Ρ€Π΅Π· dry-run Ρ€Π΅ΠΆΠΈΠΌ ΠΈ поэтапноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Python-скриптов, ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰ΠΈΡ… Ρ€Π΅Π»ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π²Π½ΡƒΡ‚Ρ€ΠΈ UV workspace-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² сСмь этапов (Stage 0 β†’ … β†’ Stage 6) ΠΈ описываСтся СдинствСнным ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ release_tool.toml.


1. Быстрый старт

# 0️⃣ ΠŸΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ dev-Π²Π΅Ρ‚ΠΊΠΈ ΠΎΡ‚ main
uv run release-tool-stage0 --branch dev_branch --base-branch main --push

# 1️⃣ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Π½Π΅Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹
uv run release-tool-stage1            # создаёт *changes_uncommitted.txt*

# 2️⃣ ΠžΡ‚Π΄Π°Ρ‘ΠΌ Ρ„Π°ΠΉΠ»Ρ‹ LLM β†’ заполняСм *commit_message.txt*
uv run release-tool-stage2 --commit --push   # ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΠΌ (ΠΈ ΠΏΡƒΡˆΠΈΠΌ) всС измСнСния

# 3️⃣ Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ diff послС послСднСго Ρ‚Π΅Π³Π°
uv run release-tool-stage3            # создаёт *changes_since_tag.txt*

# 4️⃣ ΠžΡ‚Π΄Π°Ρ‘ΠΌ Π² LLM β†’ заполняСм *tag_message.txt*, Π·Π°Ρ‚Π΅ΠΌ *prepare*-ΠΊΠΎΠΌΠΌΠΈΡ‚
uv run release-tool-stage4 --bump patch --push   # bump + commit Π² dev_branch

# 5️⃣ ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Pull-Request dev_branch β†’ main, Ρ€Π΅Π²ΡŒΡŽ ΠΈ merge (Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ скриптов)

# 6️⃣ ПослС merge выполняСм Ρ€Π΅Π»ΠΈΠ·-шаги:
uv run release-tool-stage5 --push       # Ρ‚Π΅Π³
uv run release-tool-stage6 --push       # Π½ΠΎΠ²Ρ‹ΠΉ dev-Ρ†ΠΈΠΊΠ»

ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:

uv run release-tool-clear            # ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ release_tool/changes

--dry-run ΠΈΠ»ΠΈ dry_run=true Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ шаги Π±Π΅Π· измСнСния рСпозитория β€” ΡƒΠ΄ΠΎΠ±Π½ΠΎ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.


2. Установка Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹

Для Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²

# ДобавляСм release_tool ΠΊΠ°ΠΊ git submodule
git submodule add https://github.com/VLMHyperBenchTeam/release_tool.git release_tool

# ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ release_tool Π² workspace (ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ pyproject.toml)
# [tool.uv.workspace]
# members = ["packages/*", "release_tool"]

# ДобавляСм Π² зависимости ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (ΠΏΡ€ΠΈ нСобходимости)
# [project]
# dependencies = [
#     "release_tool",
#     ...
# ]

# ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² с submodules
git clone --recursive https://github.com/your-username/your-project.git

# Или инициализация submodules Π² ΡƒΠΆΠ΅ склонированном ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅
git submodule update --init --recursive

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° послС установки

your-project/
β”œβ”€β”€ release_tool/           # ← Git submodule
β”‚   β”œβ”€β”€ stage1.py
β”‚   β”œβ”€β”€ stage2.py  
β”‚   β”œβ”€β”€ stage3.py
β”‚   β”œβ”€β”€ stage4.py
β”‚   β”œβ”€β”€ config.py
β”‚   β”œβ”€β”€ git_utils.py
β”‚   β”œβ”€β”€ release_tool.toml   # ← ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ
β”‚   └── README.md
β”œβ”€β”€ packages/               # ← Π’Π°ΡˆΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹
β”‚   β”œβ”€β”€ package1/
β”‚   └── package2/
└── .gitmodules            # ← ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ submodules

ОбновлСниС release_tool

# ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² ΠΏΠ°ΠΏΠΊΡƒ submodule ΠΈ обновляСм
cd release_tool
git pull origin main

# ВозвращаСмся Π² основной ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ фиксируСм ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅
cd ..
git add release_tool
git commit -m "update: ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ release_tool Π΄ΠΎ послСднСй вСрсии"
git push

ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ: ΠŸΡ€ΠΈ запускС любой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ указываСтся, какая конфигурация ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ:

[stage1] Поиск Π½Π΅Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ…...
[stage1] ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ: release_tool.toml          # ← корнСвая (ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚)
[stage1] ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ: release_tool/release_tool.toml  # ← ΠΈΠ· submodule

3. Установка зависимостСй

pip install tomlkit packaging  # Ссли Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ workspace-Ρ€Π΅ΠΆΠΈΠΌ

(ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ tomlkit ΠΈ packaging; ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ входят Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Python)


4. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ release_tool.toml

Π£ΠΌΠ½Ρ‹ΠΉ поиск ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

release_tool автоматичСски ΠΈΡ‰Π΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ порядкС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°:

  1. release_tool.toml Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° β€” для кастомизации ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚
  2. release_tool/release_tool.toml Π² submodule β€” дСфолтная конфигурация
  3. ВстроСнныС настройки β€” Ссли Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°:

  • βœ… Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ: ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΡΡ‚ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ настройки для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°
  • βœ… ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π°: Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ "ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ" Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ настройки
  • βœ… Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ: старыС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ
  • βœ… ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ: submodule содСрТит Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

[tool.release_tool]
# ΠšΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π»Π΅ΠΆΠ°Ρ‚ ΠΏΠΎΠ΄ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ (Git-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ)
packages_dir = "packages"

# Π€Π°ΠΉΠ»Ρ‹ с измСнСниями
changes_uncommitted_filename = "changes_uncommitted.txt"
changes_since_tag_filename   = "changes_since_tag.txt"

# ΠšΠ°Ρ‚Π°Π»ΠΎΠ³, ΠΊΡƒΠ΄Π° ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
changes_output_dir = "release_tool/changes"

# ΠŸΡƒΡ‚ΡŒ ΠΊ prod/pyproject.toml для обновлСния Ρ‚Π΅Π³ΠΎΠ² Ρ€Π΅Π»ΠΈΠ·ΠΎΠ²
prod_pyproject_path = "prod/pyproject.toml"

# Π€Π°ΠΉΠ»Ρ‹ с сообщСниями LLM
commit_message_filename = "commit_message.txt"
tag_message_filename    = "tag_message.txt"

# ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ Ρ‚Π΅Π³Π° (ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Ρ‚Π΅Π³ = "<tag_prefix><version>")
tag_prefix = "v"

# Имя ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ рСпозитория (git push <remote>)
git_remote = "origin"

# "Π‘ΡƒΡ…ΠΎΠΉ" Ρ€Π΅ΠΆΠΈΠΌ: Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π²ΠΎΠ΄ шагов, Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
# (ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ· CLI ΠΊΠ»ΡŽΡ‡ΠΎΠΌ --dry-run)
dry_run = false

ΠšΠ°ΡΡ‚ΠΎΠΌΠΈΠ·Π°Ρ†ΠΈΡ для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ настройки для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, создайтС release_tool.toml Π² ΠΊΠΎΡ€Π½Π΅:

# ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ
cp release_tool/release_tool.toml .

# Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄ свои Π½ΡƒΠΆΠ΄Ρ‹
# НапримСр, мСняСм packages_dir = "my_packages"
# Или пСрСопрСдСляСм имя ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ рСпозитория,
# Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡƒΡˆΠΈΡ‚ΡŒ Π½Π΅ Π² origin, Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² github (ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ remote):
#   git_remote = "github"
# Π­Ρ‚ΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ ΠΎΡ‚ ошибки Π²ΠΈΠ΄Π° Β«fatal: 'origin' does not appear to be a git repositoryΒ»
# ΠΏΡ€ΠΈ запускС скриптов Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ Ρ€Π΅ΠΏΠΎ Π±Π΅Π· remote с ΠΈΠΌΠ΅Π½Π΅ΠΌ origin.

5. Π­Ρ‚Π°ΠΏΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹

ℹ️ release_tool устанавливаСтся ΠΊΠ°ΠΊ ΠΏΠ°ΠΊΠ΅Ρ‚ с CLI-entrypoints.
Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ этапа доступны Π΄Π²Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π°:
β€’ ΠšΠΎΡ€ΠΎΡ‚ΠΊΠ°Ρ: uv run release-tool-stageN
β€’ Полная: uv run python -m release_tool.stageN
Π’ΠΎ всСх ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π½ΠΈΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΠΈΠ· Π½ΠΈΡ…; Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ.

5.0 Stage 0 β€” Β«Dev Branch PrepareΒ» (ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΎ)

uv run release-tool-stage0 \
  [--branch dev_branch]   # имя dev-Π²Π΅Ρ‚ΠΊΠΈ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ dev_branch) \
  [--base-branch main]    # базовая Π²Π΅Ρ‚ΠΊΠ°, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ создаётся dev-Π²Π΅Ρ‚ΠΊΠ° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ main)
  [--push]                # послС ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΏΡƒΡˆΠΈΡ‚ Π²Π΅Ρ‚ΠΊΡƒ (Ссли Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹)
  [--dry-run]             # ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π½ΠΎ Π½Π΅ выполняСт ΠΈΡ…

# Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅, см. Π½ΠΈΠΆΠ΅

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚:

  1. git fetch <remote> β€” синхронизируСт refs.
  2. Если <remote>/dev_branch сущСствуСт: β€’ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ dev_branch (создаёт, Ссли Π½Π΅Ρ‚); β€’ Π΄Π΅Π»Π°Π΅Ρ‚ fast-forward Π΄ΠΎ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ.
  3. Если ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ Π½Π΅Ρ‚ β€” создаёт dev_branch ΠΎΡ‚ <base_branch> (ΠΈΠ»ΠΈ fallback-Π²Π΅Ρ‚ΠΊΠΈ, см. ΠΎΠΏΡ†ΠΈΠΈ).
  4. ΠŸΡ€ΠΈ нСобходимости Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡƒΠ±ΠΈΡ€Π°Π΅Ρ‚ Π½Π΅Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ измСнСния Π² stash (контСкст-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ temporary_stash).
  5. НастраиваСт upstream dev_branch β†’ <remote>/dev_branch.
  6. (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ --push) отправляСт ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹.
  7. ΠŸΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ ΠΎΡ‚Ρ‡Ρ‘Ρ‚ (ahead/behind, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ stash, uncommitted ΠΈ Ρ‚.Π΄.).

НовыС ΠΎΠΏΡ†ΠΈΠΈ

Π€Π»Π°Π³ Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚
--no-stash Если Π΅ΡΡ‚ΡŒ Π½Π΅Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ измСнСния β€” Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ошибкой вмСсто auto-stash.
--stash-name NAME Имя для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ stash (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ stage0-auto-<branch>).
--keep-stash НС ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ stash послС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ stash pop Π±Π΅Π· ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ².
--fallback-head / --no-fallback-head ΠŸΡ€ΠΈ отсутствии <remote>/<base_branch> ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ <remote>/HEAD ΠΊΠ°ΠΊ ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ.
--fallback-local / --no-fallback-local Если remote-Π²Π΅Ρ‚ΠΊΠ° <base_branch> отсутствуСт, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ <base_branch>.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°

[stage0] ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚: hello_world
[stage0]   βœ… hello_world: ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π° Π²Π΅Ρ‚ΠΊΠ° dev_branch (ΠΎΡ‚ main)
[stage0] βœ… Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²: 5
[stage0] Π˜Ρ‚ΠΎΠ³:
  β€’ hello_world     β€” локально; ok
  β€’ bench_utils     β€” локально; ok
  …

ПослС Stage 0 ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Stage 1.

5.1 Stage 1

uv run python -m release_tool.stage1 [--dry-run]

  1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ git status --porcelain.
  2. Если Π΅ΡΡ‚ΡŒ измСнСния β†’ Ρ„Π°ΠΉΠ» <changes_output_dir>/<package>/<changes_uncommitted_filename> с:
    • список Ρ„Π°ΠΉΠ»ΠΎΠ² (git status --porcelain)
    • краткая сводка (git diff --stat)
    • ΠΏΠΎΠ»Π½Ρ‹ΠΉ diff (git diff) β€” всС измСнСния построчно.

Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹:

  • <changes_output_dir>/<package_name>/<changes_uncommitted_filename> β€” измСнСния
  • <changes_output_dir>/<package_name>/<commit_message_filename> β€” пустой Ρ„Π°ΠΉΠ» для LLM

(ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: release_tool/changes/<package_name>/changes_uncommitted.txt ΠΈ release_tool/changes/<package_name>/commit_message.txt)

Когда Π΅ΡΡ‚ΡŒ измСнСния:

[stage1] Поиск Π½Π΅Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ…...
[stage1] ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³: packages
[stage1] ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚: hello_world
[stage1]   βœ… hello_world: измСнСния сохранСны Π² release_tool/changes/hello_world/changes_uncommitted.txt
[stage1]   πŸ“ hello_world: создан пустой Ρ„Π°ΠΉΠ» release_tool/changes/hello_world/commit_message.txt
[stage1] βœ… Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² с измСнСниями: 1

Когда ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π΅Ρ‚:

[stage1] Поиск Π½Π΅Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ…...
[stage1] ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³: packages
[stage1] ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚: hello_world
[stage1]   hello_world: Π½Π΅Ρ‚ Π½Π΅Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
[stage1] βœ… ИзмСнСний Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ β€” Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π΅ созданы

5.2 Stage 2 β€” Β«CommitΒ»

uv run python -m release_tool.stage2 [--dry-run] [--commit] [--push]

ВыполняСт ΠΊΠΎΠΌΠΌΠΈΡ‚ ΠΈ/ΠΈΠ»ΠΈ push ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ --commit ΠΈ --push нСзависимы.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • --commit β€” ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚ ΠΏΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌ сообщСниям
  • --push β€” Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ git push для ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²
  • Π‘Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ --commit

Π§ΠΈΡ‚Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹: <changes_output_dir>/<package_name>/<commit_message_filename>
(ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: release_tool/changes/<package_name>/commit_message.txt)

Когда Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ сообщСния:

[stage2] ВыполняСм ΠΊΠΎΠΌΠΌΠΈΡ‚ ΠΈ push для ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² с ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ сообщСниями...
[stage2] ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚: hello_world
[stage2]   βœ… hello_world: commit создан ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½
[stage2] βœ… Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²: 1

ΠŸΡ€ΠΈ push ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ статус ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°:

[stage2] ВыполняСм push для ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²...
[stage2] ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚: hello_world
[stage2]   βœ… hello_world: измСнСния ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹
[stage2] ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚: bench_utils
[stage2]   πŸ“­ bench_utils: ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π΅Ρ‚

5.3 Stage 3 β€” Β«Since TagΒ»

uv run python -m release_tool.stage3 [--dry-run] [--tag TAG_NAME]

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ diff ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅Π³ΠΎΠΌ ΠΈ HEAD β†’ <changes_output_dir>/<package>/<changes_since_tag_filename>.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • --tag TAG_NAME β€” ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ измСнСния с ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚Π΅Π³Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ β€” послСдний Ρ‚Π΅Π³)
  • --dry-run β€” ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ сохранСно, Π±Π΅Π· создания Ρ„Π°ΠΉΠ»ΠΎΠ²

Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹:

  • <changes_output_dir>/<package_name>/<changes_since_tag_filename> β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ diff
  • <changes_output_dir>/<package_name>/<tag_message_filename> β€” пустой Ρ„Π°ΠΉΠ» для LLM

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования:

# ΠžΡ‚ послСднСго Ρ‚Π΅Π³Π°
uv run python -m release_tool.stage3

# ΠžΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚Π΅Π³Π°
uv run python -m release_tool.stage3 --tag v1.0.0

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π±Π΅Π· создания Ρ„Π°ΠΉΠ»ΠΎΠ²
uv run python -m release_tool.stage3 --tag v0.5.0 --dry-run

5.4 Stage 4 β€” Β«PrepareΒ» (release-commit Π±Π΅Π· Ρ‚Π΅Π³Π°)

uv run python -m release_tool.stage4 --bump patch|minor|major|dev [--push] [--dry-run]

  1. Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ (--bump …) ΠΈ обновляСт pyproject.toml Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅.
  2. Π§ΠΈΡ‚Π°Π΅Ρ‚ <tag_message_filename> ΠΈ создаёт ΠΊΠΎΠΌΠΌΠΈΡ‚ с этим сообщСниСм.
  3. ΠžΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ‚ ссылку Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ Π² staging/pyproject.toml, фиксируя dev-Π²Π΅Ρ€ΡΠΈΡŽ (см. Ρ€Π°Π·Π΄Π΅Π» Β«Π’Ρ€ΠΈ workspaceΒ» Π½ΠΈΠΆΠ΅).
  4. НС ставит Ρ‚Π΅Π³, Π½Π΅ запускаСт dev-Ρ†ΠΈΠΊΠ».
  5. Optionally --push β€” отправляСт ΠΊΠΎΠΌΠΌΠΈΡ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² dev_branch).

Π”Π°Π»Π΅Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Pull Request ΠΈΠ· dev_branch β†’ main ΠΈ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ review.

5.5 Stage 5 β€” Β«TagΒ»

uv run python -m release_tool.stage5 [--push] [--dry-run]

Π˜ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ‚ΡΡ послС merge PR Π² main: β€’ Находит Π²Π΅Ρ€ΡΠΈΡŽ Π² pyproject.toml. β€’ Π‘Ρ‚Π°Π²ΠΈΡ‚ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‚Π΅Π³ v<version> Π½Π° этом ΠΆΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Π΅. β€’ ΠžΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ‚ ссылку Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ Π² prod/pyproject.toml, указывая Π½Π° Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚Π΅Π³ (ΠΊΠ»ΡŽΡ‡ prod_pyproject_path Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅). β€’ ΠŸΡƒΡˆΠΈΡ‚ Ρ‚Π΅Π³ (Ссли --push ΠΈΠ»ΠΈ cfg.dry_run = false).

5.6 Stage 6 β€” Β«Next DevΒ»

uv run python -m release_tool.stage6 [--branch dev_branch] [--push] [--dry-run]

  1. Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ (ΠΈΠ»ΠΈ обновляСт) Π²Π΅Ρ‚ΠΊΡƒ dev_branch ΠΎΡ‚ main.
  2. ΠœΠ΅Π½ΡΠ΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ β†’ patch+1.dev0 ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΡ‚ chore: start …dev0 development.
  3. ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΏΡƒΡˆΠΈΡ‚ Π²Π΅Ρ‚ΠΊΡƒ.

ΠŸΠΎΠ»Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» (Π½ΠΎΠ²Ρ‹ΠΉ)

# 0. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° dev-Π²Π΅Ρ‚ΠΎΠΊ (ΠΏΡ€ΠΈ нСобходимости создаём ΠΎΡ‚ main)
uv run python -m release_tool.stage0 --branch dev_branch --base-branch main --push

# 1. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
uv run python -m release_tool.stage1
uv run python -m release_tool.stage2 --commit --push

# 2. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Ρ€Π΅Π»ΠΈΠ·Π°
uv run python -m release_tool.stage3
uv run python -m release_tool.stage4 --bump patch --push  # ΠΊΠΎΠΌΠΌΠΈΡ‚ Π² dev_branch
# β†’ PR dev_branch β†’ main, review, merge

# 3. Π’Π΅Π³ + Π½ΠΎΠ²Ρ‹ΠΉ dev-Ρ†ΠΈΠΊΠ» (Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ)
uv run python -m release_tool.stage5 --sync --base-branch main --delete-branch dev_branch --push  # Ρ‚Π΅Π³ + prod
uv run python -m release_tool.stage6 --push      # Π½ΠΎΠ²Ρ‹ΠΉ dev-Ρ†ΠΈΠΊΠ»

Для dry-run ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ этапа Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ --dry-run.

Волько ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ (Π±Π΅Π· Ρ€Π΅Π»ΠΈΠ·Π°)

uv run python -m release_tool.stage1
# ЗаполняСм commit_message.txt
uv run python -m release_tool.stage2 --commit  # Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚

Волько push (ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ)

uv run python -m release_tool.stage2 --push  # Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ°

ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ²

# УдаляСт всС Ρ„Π°ΠΉΠ»Ρ‹ Π² release_tool/changes
uv run python -m release_tool.clear

# ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ
uv run python -m release_tool.clear --dry-run

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия Stage 4

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Stage 4 автоматичСски:

β€’ удаляСт строки workspace = true ΠΈΠ· сСкции [tool.uv.sources] Π² pyproject.toml, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π»ΠΈΠ·-ΠΊΠΎΠΌΠΌΠΈΡ‚ ссылался Π½Π° Β«Ρ‡ΠΈΡΡ‚ΡƒΡŽΒ» Π²Π΅Ρ€ΡΠΈΡŽ Π±Π΅Π· workspace-зависимостСй;

β€’ обновляСт Ρ‚Π΅Π³ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² Ρ„Π°ΠΉΠ»Π΅ staging/pyproject.toml (ΠΏΡƒΡ‚ΡŒ задаётся ΠΊΠ»ΡŽΡ‡ΠΎΠΌ staging_pyproject_path Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅).

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия Stage 5

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Stage 5 автоматичСски:

β€’ обновляСт Ρ‚Π΅Π³ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² Ρ„Π°ΠΉΠ»Π΅ prod/pyproject.toml (ΠΏΡƒΡ‚ΡŒ задаётся ΠΊΠ»ΡŽΡ‡ΠΎΠΌ prod_pyproject_path Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅).


6. МодСль Ρ‚Ρ€Ρ‘Ρ… workspace

main
 β”œβ”€ prod/pyproject.toml     # Ρ€Π΅Π»ΠΈΠ·Π½Ρ‹Π΅ (ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Π΅) вСрсии, Ρ‚Π΅Π³ΠΈ
 └─ staging/pyproject.toml  # dev-Ρ‚Π΅Π³ΠΈ, Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΊ Ρ€ΡƒΡ‡Π½ΠΎΠΌΡƒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ

dev_branch
 └─ исходный ΠΊΠΎΠ΄ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² (workspace=true)
  1. dev β€” тСкущая Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°; зависимости ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΈΠ· исходных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· workspace = true.
  2. staging β€” фиксация dev-Ρ‚Π΅Π³ΠΎΠ², ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π½Π° Stage 4. МоТно Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ UV-workspace ΠΈΠ· GitHub-Ρ‚Π΅Π³ΠΎΠ² Π΄ΠΎ merge.
  3. prod β€” ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Π»ΠΈΠ·Π½Ρ‹Π΅ Ρ‚Π΅Π³ΠΈ, Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° Stage 5.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: β€’ Stage 4 Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π΅Π»ΠΈΠ·-ΠΊΠΎΠΌΠΌΠΈΡ‚ с dev-вСрсиСй ΠΈ обновляСт staging-список. β€’ ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ PR Stage 5 Π½Π°Π²Π΅ΡˆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π΅Π³ ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ Π² prod-спискС.


7. Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ автоматичСского CI

Π€Π°ΠΉΠ» ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° workflow Π»Π΅ΠΆΠΈΡ‚ Π² release_tool/ci/release_flow.yml.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ автоматичСскоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Stage 5/6 Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ merge Π² main:

# ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ (ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ) Ρ„Π°ΠΉΠ» Π² ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚
mkdir -p .github/workflows
cp release_tool/ci/release_flow.yml .github/workflows/

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ имя Π²Π΅Ρ‚ΠΊΠΈ ΠΈ вСрсия Python Π²Π½ΡƒΡ‚Ρ€ΠΈ workflow.
# ПослС ΠΊΠΎΠΌΠΌΠΈΡ‚Π° GitHub запустит workflow ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ push Π² main.

⚠️ Если ΠΏΠΎΠ·ΠΆΠ΅ понадобится Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ CI β€” Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π±Π»ΠΎΠΊ push: Π² .github/workflows/release_flow.yml ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ».


8. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

8.1 ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ

uv run python -m release_tool.clear [--dry-run]

ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ changes_output_dir (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ release_tool/changes).

Когда Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

  • ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π΅Π»ΠΈΠ·Π° для очистки Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²
  • ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ/ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ
  • Для "чистого старта" процСсса Ρ€Π΅Π»ΠΈΠ·Π°

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°:

[clear] βœ… ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ release_tool/changes ΠΎΡ‡ΠΈΡ‰Π΅Π½

Π‘ --dry-run:

[clear] --dry-run: Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Ρ‘Π½ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ release_tool/changes
  release_tool/changes/hello_world/changes_uncommitted.txt
  release_tool/changes/hello_world/commit_message.txt

9. Алгоритмы ΠΈ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

β€’ Git-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· subprocess (см. release_tool/git_utils.py).
β€’ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Β«Π΅ΡΡ‚ΡŒ Π»ΠΈ измСнСния» β€” git rev-list <last_tag>..HEAD --count (>0 β†’ Π΅ΡΡ‚ΡŒ).
β€’ Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ вСрсий β€” packaging.version.Version + RegExp; ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΡƒΡ€ΠΎΠ²Π½ΠΈ patch/minor/major ΠΈ dev.


10. Π’ΠΈΠΏΠΎΠ²Ρ‹Π΅ сцСнарии

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (dry-run)

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ всС этапы Π±Π΅Π· Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… дСйствий
uv run python -m release_tool.stage1 --dry-run
uv run python -m release_tool.stage2 --dry-run
uv run python -m release_tool.stage3 --dry-run
uv run python -m release_tool.stage4 --dry-run --bump patch

ΠŸΠΎΠ»Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» commit β†’ release

# 1. ЀиксируСм Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ измСнСния
uv run python -m release_tool.stage1
# ЗаполняСм commit_message.txt Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅
uv run python -m release_tool.stage2 --commit --push

# 2. Π“ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Ρ€Π΅Π»ΠΈΠ·
uv run python -m release_tool.stage3
# ЗаполняСм tag_message.txt Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅
uv run python -m release_tool.stage4 --bump patch --push

Волько ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ (Π±Π΅Π· Ρ€Π΅Π»ΠΈΠ·Π°)

uv run python -m release_tool.stage1
# ЗаполняСм commit_message.txt
uv run python -m release_tool.stage2 --commit  # Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚

Волько Ρ€Π΅Π»ΠΈΠ· (послС ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²)

uv run python -m release_tool.stage3
# ЗаполняСм tag_message.txt
uv run python -m release_tool.stage4 --bump minor --push  # bump + push

Волько bump (бСз push)

# Π’Π΅Ρ€ΡΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ, Π½Π°Ρ…ΠΎΠ΄ΡΡΡŒ ΠΎΡ„Π»Π°ΠΉΠ½; push сдСлаСм ΠΏΠΎΠ·ΠΆΠ΅
uv run python -m release_tool.stage4 --bump patch

Π Π°Π·Π½Ρ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ bump

# ΠŸΠ°Ρ‚Ρ‡-Ρ€Π΅Π»ΠΈΠ· (исправлСния)
uv run python -m release_tool.stage4 --bump patch --push

# ΠœΠΈΠ½ΠΎΡ€Π½Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· (Π½ΠΎΠ²Ρ‹Π΅ возмоТности)
uv run python -m release_tool.stage4 --bump minor --push

# ΠœΠ°ΠΆΠΎΡ€Π½Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· (breaking changes)
uv run python -m release_tool.stage4 --bump major --push

# Dev-Ρ€Π΅Π»ΠΈΠ· (Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°)
uv run python -m release_tool.stage4 --bump dev --push

11. ЧастыС вопросы

Вопрос ΠžΡ‚Π²Π΅Ρ‚
НуТСн Π»ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ env? НСт. Если ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ собираСтся Ρ‡Π΅Ρ€Π΅Π· UV-workspace β€” зависимости release_tool Π±ΡƒΠ΄ΡƒΡ‚ установлСны автоматичСски. Π’ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ достаточно pip install tomlkit packaging.
МоТно Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· LLM? Π”Π° β€” Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ release_commit_message.txt.
Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ bump для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… вСрсий? ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ уровня: patch, minor, major.
Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ bump для dev-вСрсий? Если вСрсия содСрТит .devN β€” увСличиваСтся N; Ссли .dev Π½Π΅Ρ‚ β€” добавляСтся .dev1.

12. ЛицСнзия

MIT Β© 2025

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages