TGViewer
Сочный DevOps Сочный DevOps @andtree_sec · 420 subscribers
Post #198 175
Bump версии в python проектах с pyproject.toml

Уже как-то писал про утилиту bumpversion, которая позволяет автоматизировать bump, например патч версии. Обычно создается файл, в котором указывается текущая версия, которая при выполнении нехитрых команд будет увеличиваться, затем утилита автоматически делает комит в git.

В python проектах, где используется pyproject.toml уже есть поле version. Выглядит примерно так:
[project]
name = "<app_name>"
version = "1.0.0"


Следовательно отдельный файл нам не нужен, мы просто будет "бампать" этот.

Создаем в корне bumpversion.cfg:
[bumpversion]
current_version = 1.0.0
commit = True
tag = False

[bumpversion:file:pyproject.toml]
search = version = "{current_version}"
replace = version = "{new_version}"


{current_version} и {new_version} это переменные доступные в контексте выполнения самой утилиты, задавать их где-то отдельно не нужно.

Логика в ci:
.bump_version:
before_script:
- pip install bump2version
- git config --global --add safe.directory '*'
- git config --global user.email "${GITLAB_USER_EMAIL}"
- git config --global user.name "${GITLAB_USER_NAME}"
- git remote set-url origin https://tag_token:${TAG_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git
- git fetch
- git checkout $CI_COMMIT_REF_NAME
- git reset --hard "origin/$CI_COMMIT_REF_NAME"
script:
- |
function get_version() {
VERSION=$(cat $VERSION_PATH)
if [[ "$BUMP2VERSION_VERSION_FROM" == "pyproject" ]];then
VERSION=$(cat $VERSION_PATH | grep -E "^version = "|awk '{print $3}'|tr -d '"')
fi;
}

if [[ "$CI_COMMIT_REF_NAME" == "$CI_DEFAULT_BRANCH" ]];then
cmd_args=()
if [[ -n "$BUMP2VERSION_CONFIG_FILE" ]];then
cmd_args+=(--config-file "$BUMP2VERSION_CONFIG_FILE")
fi;
cmd_args+=("$BUMP2VERSION_TYPE")
bump2version "${cmd_args[@]}"
get_version
TAG="v$VERSION"
else
get_version
TAG="v$VERSION-$CI_COMMIT_SHORT_SHA"
fi;
echo "Generated tag: $TAG"
echo "TAG=$TAG" > dotenv.var
if [[ "$GENERATE_GIT_TAG" == "true" ]];then
git tag -f -a "$TAG" -m "Version $TAG. Created by $GITLAB_USER_NAME"
git push origin "${TAG}" -o ci.skip
fi;
if [[ "$CI_COMMIT_REF_NAME" == "$CI_DEFAULT_BRANCH" ]];then
git push origin HEAD:$CI_COMMIT_REF_NAME -o ci.skip
fi;


Здесь у нас вводится дополнительная переменная BUMP2VERSION_VERSION_FROM, чтобы обозначить проекты pyproject. Для всего остального просто читаем VERSION файл. Это нужно чтобы корректно распарсить версию из pyproject.toml, в VERSION она и так указывается как есть.

Пример ci в конечном проекте:
prepare_version:
stage: prepare
image: python:3.11.12-bookworm
extends: [".bump_version"]
variables:
GENERATE_GIT_TAG: "false"
BUMP2VERSION_TYPE: patch
GENERATE_DOTENV_FILE: "true"
VERSION_PATH: "pyproject.toml"
BUMP2VERSION_CONFIG_FILE: "bumpversion.cfg"
BUMP2VERSION_VERSION_FROM: "pyproject"
artifacts:
reports:
dotenv: dotenv.var
expire_in: 3 hours


#gitlab
  • 👍 1
More from @andtree_sec
  1. Sep 7, 2026Давненько не было сообщений. Скорее всего в будущем они уйдут в telegraf, который я еще не…
  2. Jul 6, 2026Последнее время на работе часто приходится работать с apache flink и даже что-то писать на…
  3. Jun 4, 2026Немножко про молекула тесты... У нас принято использовать в переменных lookup плагин для д…
  4. May 20, 2026Очередной небольшой проект. Веб-приложение, которое агрегирует через стандартный механиз g…
  5. May 15, 2026Включаем профилирование в ansible Профилирование, это вывод даты, времени запуска и итогов…
  6. Apr 17, 2026Так выглядит общий dashbord работы с инцидентами.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →