Уже как-то писал про утилиту
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