Увеличьте номер версии, если Travis в github был успешным

Я написал простой простой script в Python.

Теперь мне бы хотелось, чтобы travis проверил мой код. После того, как travis был успешным, номер версии должен быть увеличен.

До сих пор у моего script пока нет номера версии. Я могу хранить его везде, где это имеет смысл для рабочего процесса с автоматическим приращением.

Как это сделать для кода Python?

Update

Теперь он работает:

  • запустить тесты
  • bumpversion
  • push-тег для мастеринга

К сожалению, travis не поддерживает "after-all". Это означает, что если я хочу запустить тесты для нескольких версий Python, у меня нет возможности для bumpversion после успешной проверки всех версий python.

В моем случае я проверю Python2.7 только до тех пор, пока travis не разрешит эту проблему: https://github.com/travis-ci/travis-ci/issues/929

Вот мой простой script: https://github.com/guettli/compare-with-remote

Решено: -)

Теперь он работает:

  • Разработчик нажимает на github
  • Travis-CI запускает
  • Если все тесты успешны, bumpversion увеличивает версию
  • Новая версия в setup.py переместится в репозиторий github
  • Новая версия пакета python загружается на pypi с помощью инструмента twine.

Я объясняю, как я делаю CI с github, travis и pypi здесь: https://github.com/guettli/github-travis-bumpversion-pypi

Ответы

Ответ 1

Если вы принимаете дополнительную фиксацию для вашего управления версиями, вы можете добавить этот script в continuous_integration/increment_version.py

import os
import pkg_resources


if __name__ == "__main__":
    version = pkg_resources.get_distribution("compare_with_remote").version
    split_version = version.split('.')
    try:
        split_version[-1] = str(int(split_version[-1]) + 1)
    except ValueError:
        # do something about the letters in the last field of version
        pass
    new_version = '.'.join(split_version)
    os.system("sed -i \"s/version='[0-9.]\+'/version='{}'/\" setup.py"
              .format(new_version))
    os.system("git add -u")
    os.system("git commit -m '[ci skip] Increase version to {}'"
              .format(new_version))
    os.system("git push")

И измените ваш .travis.yml на

after_success:
  - python continuous_integration/increment_version.py

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

Также обратите внимание, что я использовал python для выполнения операций git, но их можно добавить как дополнительную строку в поле after_success:

after_success:
  - python continuous_integration/increment_version.py
  - git add -u
  - git commit -m "[ci skip] version changed"
  - git push

Я просто считаю удобным разместить номер версии в сообщении об ошибке.

Кроме того, очень важно добавить [ci skip] в сообщение фиксации, чтобы избежать бесконечного приращения. Возможно, было бы безопаснее инициировать изменение версии определенного тега msg. Commit.

Ответ 2

Не зависит от Python, но этот учебник объясняет автоматически увеличивающиеся номера версий, добавляя .travis.yaml записи, которые обновляют теги git с каждым успешная сборка. Это похоже на хороший баланс между ручным и автоматическим версированием.

В то время как в руководстве используется npm package.json для начальной проверки версии, вы можете реализовать простой эквивалент (в Python или иначе).

Ответ 3

Предполагая, что

  • только фиксирует успешные сборки Travis CI, которые объединяются в главную ветвь (например, используя запросы Pull)
  • пакет всегда устанавливается с помощью pip из репо git, используя, например,

    pip install git+https://github.com/user/package.git
    

Для автоинкрементного номера версии можно просто определить версию как количество коммитов в основной ветке. Это можно сделать со следующими строками в setup.py,

minor_version = check_output(['git', 'rev-list',
                              '--count', 'master']).decode('latin-1').strip()

setup(version='0.{}'.format(minor_version), ...)