У нас репозиторий, где хранится вся CI/CD логика. Как правило так у всех. Репу можно версионировать с помощью
bump2version. Для его работы нужен файл VERSION в корне проекта с изначальной версий CI1.0.0
И конфигурационный файл
.bumpversion.cfg:[bumpversion]
current_version = 1.0.0
commit = True
tag = False
[bumpversion:file:VERSION]
В эти два файла
bump2version будет комитить сам, если pipeline запускается из default branch и увеличивать патч версию на один. Во всех остальных случаях, мы просто читаем текущий VERSION, без обновления патч версии и добавляем ему postfix CI_COMMIT_SHORT_SHA, создавая только git tag.Основной
.gitlab-ci.yml:include:
- { local: "gitlab/default.yml" }
- { local: "gitlab/utils.yml"}
stages:
- bump_and_tag
bump_version_and_tag:
stage: bump_and_tag
before_script:
- !reference [".ci_bump_version", "before_script"]
script:
- !reference [".ci_bump_version", "script"]
rules:
- if: '$CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH'
when: always
- if: '$CI_MERGE_REQUEST_IID && $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH'
when: always
- if: '$CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
when: never
- if: '$CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH'
when: always
- when: never
Подключаемый
utils.yml.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:
- |
if [[ "$CI_COMMIT_REF_NAME" == "$CI_DEFAULT_BRANCH" ]];then
bump2version patch
VERSION=$(cat VERSION)
TAG="v$VERSION"
else
VERSION=$(cat VERSION)
TAG="v$VERSION-$CI_COMMIT_SHORT_SHA"
fi;
echo "Generated tag: $TAG"
git tag -f -a "$TAG" -m "Version $TAG. Created by $GITLAB_USER_NAME"
git push origin "${TAG}" -o ci.skip
if [[ "$CI_COMMIT_REF_NAME" == "$CI_DEFAULT_BRANCH" ]];then
git push origin HEAD:$CI_COMMIT_REF_NAME -o ci.skip
fi;
Для работы нужно создать ACCESS_TOKEN с правами на api и пуш. Также добавить переменную, например в CI/CD variables с именем TAG_TOKEN.
#gitlab