Как избежать сохранения номера версии в исходном коде? - PullRequest
13 голосов
/ 29 марта 2019

До сих пор мы сохраняем номер версии нашего исходного кода на python в setup.py.

Эта версия увеличивается после каждого успешного запуска CI.

Это означает, что версия центральных библиотек увеличивается в несколько раз в день.

Поскольку номер версии хранится в файле в репозитории git, каждое увеличение номера версии является новым коммитом.

Это означает, что примерно 50% всех коммитов сделаны не людьми, а КИ.

У меня такое ощущение, что мы на неправильном пути. Может быть, не стоит держать номер версии в ci.

Как мы можем избежать "бесполезных" коммитов CI, которые просто увеличивают номер версии?

Как избежать сохранения номера версии в исходном коде?

Обновление

Мы живем без ручного выпуска уже несколько лет. У нас нет схемы управления версиями, такой как MAJOR.MINOR. И мы не пропустили это в прошлом. Я знаю, что это не работает для всех сред. Но это работает для моей текущей среды.

У нас есть номер версии, который выглядит следующим образом: YEAR.MONTH.X

Это означает, что каждый коммит, который проходит CI, является новым выпуском.

Прочитав ответы, я понимаю: мне нужно спросить себя: у меня вообще есть номер версии ? Я думаю нет. У меня есть номер сборки . Больше не нужно в этом контексте.

(спасибо за голоса. Прежде чем задать этот вопрос, я был уверен, что этот вопрос закроется, потому что люди подумают, что он "неясен" или "слишком широк")

Ответы [ 6 ]

5 голосов
/ 29 марта 2019

Обычной практикой является сохранение номера версии в исходном коде, в этом нет ничего плохого.

Вам необходимо разделить процедуры CI для регулярных сборок, выпуска публикации и развертывания выпуска.

Обычные сборки: запускаются ежедневно или даже после каждой фиксации, могут включать статический анализ кода и автоматические тесты, проверять, может ли код быть собран вообще.Обычные сборки не должны изменять номер версии.

Публикация релиза: может быть вызвана только явным ручным действием диспетчера релизов.
Действие триггера может быть помечать коммит новым номером версии, новым слиянием светвь релиза или просто коммит, который изменяет номер версии, хранящийся в специальном файле (например, pom.xml).См., Например, git flow.
При публикации релизов назначается новый номер версии (автоматически или вручную), при необходимости фиксируется его в исходном коде, создается бинарный пакет с новой версией и загружается в репозиторий бинарных пакетов (например, Nexus, devpi, локальный репозиторий APT, реестр Docker и т. д.).

Развертывание релиза: другое инициируемое вручную действие, которое берет готовый двоичный пакет из репозитория пакетов и устанавливает его в целевую среду (dev, QA/ UAT / подготовка, часть производства для канареечного развертывания или для всей производственной среды).

4 голосов
/ 08 апреля 2019

PS: будучи новым пользователем, вы не можете добавлять комментарии.

поддержка и расширение на этот ответ @ VibrantVivek.

Для Непрерывная интеграция очень важно пометить метку репозитория и сохранить ли его в своем коде или просто любым другим способом git , после каждого успешного CI должно быть соответствующий тег / версия.

И если у вас есть теги / версии CI, которые не противоречат коммитам, то тут действительно что-то не так.

И +1 для Мартина Фаулера, вот еще одна ссылка для более подробной статьи (более или менее того же человека) https://www.thoughtworks.com/continuous-integration (рекомендуем прочитать, пожалуйста)

4 голосов
/ 08 апреля 2019

Если проект хранится в git-репо для производственного использования, просто используйте любой вариант git describe, который плавает на вашей лодке, нет необходимости хранить его в отслеживаемом файле, потому что результат идентифицирует конкретную историю, и вы получите этоистория прямо там.

Если источник поставляется отдельно, вы можете использовать git archive и атрибут export-subst , чтобы встроить практически все, что вы хотите, в экспортируемый источник.

4 голосов
/ 29 марта 2019

Я думаю, вы должны использовать git flow. И создайте основную ветвь и развивающую ветвь. Каждый раз, когда CI проверяет разработку, номер версии остается неизменным. Каждый раз, когда вы создаете релиз, например Слияние превращается в мастера, вы можете увеличить номер версии на CI.

Или я что-то упустил, но в моем мнении нет причины увеличивать номер версии при каждом запуске ci.

В общем, вам лучше подумать, когда "выпустить" изменения в новой версии !!

3 голосов
/ 07 апреля 2019

На ваш первый вопрос:

Как мы можем избежать "бесполезных" коммитов CI, которые просто увеличивают номер версии?

Пожалуйста, выберите Непрерывная интеграция (CI) - это практика разработки, которая проверяет каждый check-in с помощью автоматической сборки, позволяя командам обнаруживать проблемы на ранних этапах.

Сказав это, хотел бы сформулировать здесь:

  • Из практики: Каждый коммит должен основываться на интеграции машина

  • Как это сделать: Сервер CI контролирует хранилище и проверяет изменения, когда они происходят

Проще говоря, сервер CI должен улучшать версию только и только при наличии нового коммита и , таким образом, проверяя каждый код коммит высвобождается.

Похоже из OP, что в вашем районе больше (как вы сказали) "бесполезных" commits от CI server.

Основываясь на вашем механизме CI, я надеюсь, что вы должны / должны иметь возможность управлять им, почти есть способы справиться с каждым инструментом, который мы используем. (Например: webhooks в bitbucket, плагин версии и т. Д.).

Итак, убедившись, что только после нового коммита у нас есть новая версия.

Теперь, если вы думаете об этих обычных ночных сборках интеграции, тогда читайте ниже:

Многие организации выполняют регулярные сборки по расписанию, например, каждую ночь. Это не то же самое, что непрерывная сборка, и ее недостаточно для непрерывной интеграции . Суть непрерывной интеграции заключается в том, чтобы как можно быстрее находить проблемы. Ночные сборки означают, что ошибки лежат незамеченными целый день, прежде чем их обнаружат. Когда они находятся в системе так долго, их поиск и удаление занимает много времени.

Также вы упомянули: Каждый коммит, который проходит CI, является новой версией , таким образом, вы уже находитесь на истинном CI.

Несмотря на это, если вы все еще не можете понять, как можно избежать "useless" commits номера версии, то я бы предложил добавить еще один вопрос с подробным описанием того, как работает ваш механизм CI и почему это сложно с заданными условиями. Бьюсь об заклад, должно быть решение. Также посмотрите на GithubFlowVsGitFlow .

источник: Белая книга Мартина Фаулера о CI

Как избежать сохранения номера версии в исходном коде?

По этому поводу хотелось бы расширить @void ответ, как там сказано:

It is a common practice to keep a version number in the source code, there is nothing wrong in that.

Существуют проекты, которые должны знать точное version, развернутое (по некоторым важным причинам xy) в таких сценариях, они сохраняют версию в исходном коде и HTTP GET API для извлечения из развернутого кода (один из способов сделать это ) чтобы узнать версию, развернутую в настоящее время на X сервер .

Однако это больше по требованию, предположим, что для другого проекта такой ситуации не существует, тогда рекомендуемый способ сохранить version использует commit хэш / tagging каждый успешную сборку CI.

Вы можете получить более подробную информацию здесь :

Надеюсь, это поможет.

3 голосов
/ 04 апреля 2019

Предпосылки:

Я предполагаю, что это помещения, в которых обсуждается решение.

  1. В настоящее время номер версии хранится в исходном файле с отслеживанием git, но вы в порядкечтобы избавиться от него.
  2. Никто не управляет номером версии вручную и не запускает процедуру выпуска, которая включает в себя: (а) увеличение номера версии, (б) сборку из исходного кода и (в) сохранение результата сборки где-либо,Все это заботится CI и ДОЛЖНО оставаться таким.

Решение:

  1. Вместо записи в исходный файл и создания нового коммита, CI просто тег конкретный коммит, прошедший проверку CI, затем перенесите тег в удаленное репо.
  2. Сценарий сборки должен прочитать тег текущего коммита HEAD и использовать его в качестве номера версии для публикации выпуска.
  3. При желании вы можете использовать git filter-branch для перезаписи существующей истории репозитория git, пометить коммиты предыдущих выпусков для согласованности, удалить и прекратить отслеживание исходного файла номера версии, а затем избавиться от этих коммитов CI.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...