Как реализовать семантическое управление версиями с помощью конвейеров и ветвей bitbucket? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть приложение на Python, и я хочу реализовать семантическое управление версиями как таковое: MAJOR.MINOR.PATCH.BUILD. Я хочу максимально автоматизировать его с помощью конвейеров bitbucket.

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

1 Ответ

0 голосов
/ 16 мая 2018

Все соответствующие файлы включены ниже, но вот суть этого. У меня есть основная ветвь, из которой я делаю различные функциональные ветви перед слиянием с основной. Я отметил каждое слияние с основной веткой как незначительное обновление. Это полностью автоматизировано с помощью кода ниже. Номер сборки также автоматизируется и обновляется с каждым новым коммитом, независимо от того, в какой ветке я нахожусь. Наконец, номера патчей и обновления основных номеров полуавтоматические с помощью триггера в конвейерах BB.

Я сохраняю номер версии в файле version.txt, и при каждой сборке я обновляю номер и запускаю коммит и push из этой сборки, но пропускаю процесс сборки для этого вторичного коммита, используя [skip CI], иначе он зациклится бесконечно. С удовольствием объясню что-нибудь еще, если это будет необходимо.

Часть сценария version.sh была получена из ответа на linux - упростить сценарий семантического контроля версий

Вот как выглядит мой bitbucket-pipelines.yml файл:

image: python:3.6

pipelines:
  default:
    - step:
        script: # Modify the commands below to build your repository.
          # Linting check
          - pip3 --version
          - pip3 install -r requirements.txt
          - pylint backend
          - bash version.sh build $BITBUCKET_BUILD_NUMBER $BB_AUTH_STRING

  branches:
    master:
      -step:
        name: Minor version update
        script:
          # Linting check
          - pip3 --version
          - pip3 install -r requirements.txt
          - pylint backend
          # Increase minor version number
          - bash version.sh minor $BITBUCKET_BUILD_NUMBER $BB_AUTH_STRING
      -step:
        trigger: manual
        name: Major version update
        script:
          - bash version.sh major $BITBUCKET_BUILD_NUMBER $BB_AUTH_STRING
      -step:
        trigger: manual
        name: Patch version update
        script:
          - bash version.sh patch $BITBUCKET_BUILD_NUMBER $BB_AUTH_STRING

и version.sh:

#!/bin/bash

#CONFIG
USER=""
REPO=""
USERNAME=""
EMAIL=""

major() {
if IFS=. read -r major rest <version.txt || [ -n "$major" ]; then
  echo "$((major + 1)).0.0.$1" >"version.txt"
else
  echo "ERROR: Unable to read version number from version.txt" >&2
  exit 1
fi
}

minor() {
if IFS=. read -r major minor patch build <version.txt || [ -n "$major" ]; then
  echo "$major.$((minor + 1)).0.$1" >"version.txt"
else
  echo "ERROR: Unable to read version number from version.txt" >&2
  exit 1
fi
}

# Need to substract one from minor because automatically runs
patch() {
if IFS=. read -r major minor patch build <version.txt || [ -n "$major" ]; then
  echo "$major.$((minor - 1)).$((patch + 1)).$1" >"version.txt"
else
  echo "ERROR: Unable to read version number from version.txt" >&2
  exit 1
fi
}

build() {
if IFS=. read -r major minor patch build <version.txt || [ -n "$major" ]; then
  echo "$major.$minor.$patch.$1" >"version.txt"
else
  echo "ERROR: Unable to read version number from version.txt" >&2
  exit 1
fi
}

update() {
echo "New version = $(<version.txt)"
git config --global push.default simple
git remote set-url origin https://${1}@bitbucket.org/${USER}/${REPO}.git
git config user.name $USERNAME
git config user.email $EMAIL
git config -l
git add version.txt
git commit -m "[skip CI]"
git push
}

case "$1" in
  major)
    major $2
    update $3
    ;;
  minor)
    minor $2 
    update $3
    ;;
  patch)
    patch $2
    update $3
    ;;
  build)
    build $2
    update $3
    ;;
  *)
    echo "Usage: bash version.sh {major|minor|patch|build} build_number bb_auth_string"
    exit 1
esac
exit 0

Наконец, version.txt - это простой текстовый файл с четырьмя числами, разделенными точкой, такой как 4.3.2.1

Рад принять любые предложения о том, как улучшить мой метод выполнения этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...