Как вы поддерживаете код разработки и производственный код? - PullRequest
131 голосов
/ 19 октября 2008

Каковы наилучшие практики и практические правила, которым необходимо следовать при поддержке кода? Рекомендуется ли иметь только готовый к работе код в ветке разработки, или в ветке разработки должен быть доступен непроверенный последний код?

Как вы поддерживаете свой код разработки и рабочий код?

Редактировать - Дополнительный вопрос. Использует ли ваша команда разработчиков протокол "как можно скорее, и часто даже если код содержит незначительные ошибки или неполон" или протокол "commit-ONLY-perfect-code" при фиксации кода в ветке DEVELOPMENT?

Ответы [ 12 ]

105 голосов
/ 19 октября 2008

Обновление 2019:

В наши дни вопрос будет рассматриваться в контексте использования Git и 10 лет использования этой распределенной разработки рабочего процесса (в основном через GitHub ) показывает общие лучшие практики:

  • master - это ветка, готовая к развертыванию в рабочей среде в любое время: следующий выпуск с выбранным набором ветвей функций, объединенных в master.
  • dev (или ветвь интеграции, или 'next') - это та, в которой ветвь функций, выбранная для следующего выпуска, тестируется вместе
  • maintenance (или hot-fix) - это ветвь для текущего выпуска / исправлений ошибок, с возможным слиянием до dev и или master

Этот тип рабочего процесса (где вы не объединяете dev до master, но где вы объединяете только ветвь объекта до dev, затем, если выбрано, до master, чтобы иметь возможность отбрасывать легкие ветки, не готовые к следующему выпуску) реализованы в самом репозитории Git с gitworkflow (одно слово, , показанное здесь ).
Подробнее на rocketraman/gitworkflow.

https://github.com/rocketraman/gitworkflow/raw/master/docs/images/topicgraduation.png

(источник: Рабочий процесс: учебник для начинающих, ориентированный на задачи )

Примечание: в этом распределенном рабочем процессе вы можете фиксировать в любое время и передавать в личную ветку некоторые WIP (Work In Progress) без проблем: вы сможете реорганизовать (git rebase) свои коммиты, прежде чем сделать их частью ветвь функций.


Оригинальный ответ (октябрь 2008 г., 10+ лет назад)

Все зависит от последовательного характера управления релизами

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

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

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

Когда дело доходит до производственного кода, вам также необходимо управлять ветвями патча , помня, что:

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

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

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

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


Чтобы ответить на комментарий Вилле М.:

  • Имейте в виду, что ветка dev не означает «одна ветка на разработчика» (что может вызвать «сумасшествие слияния», поскольку каждый разработчик должен будет объединить работу других, чтобы увидеть / получить свою работу), но один разработчик ветвь за усилия по разработке.
  • Когда эти усилия необходимо объединить обратно в транк (или любую другую «основную» или ветвь релиза, которую вы определяете), это работа разработчика, не - повторяю, НЕ - SC Менеджер (который не знает, как решить любое конфликтующее слияние). Руководитель проекта может контролировать слияние, то есть убедиться, что оно начинается / заканчивается вовремя.
  • кого бы вы ни выбрали, чтобы сделать слияние, самое важное:
    • чтобы иметь модульные тесты и / или среду сборки, в которой вы можете развернуть / протестировать результат слияния.
    • для определения тега до начала слияния, чтобы иметь возможность вернуться в предыдущее состояние, если указанное слияние оказывается слишком сложным или достаточно длинным для разрешения.
43 голосов
/ 19 октября 2008

Мы используем:

  • ветка разработки исключительно

до тех пор, пока проект не будет близок к завершению или пока мы не создадим версию-веху (например, демонстрацию продукта, презентационную версию), затем мы (регулярно) разветвляемся из нашей текущей ветви разработки в:

  • ветка релиза

Никаких новых функций в ветке релиза нет. В ветви релиза исправляются только важные ошибки, а код для исправления этих ошибок реинтегрируется в ветку разработки.

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

Иногда у нас также есть филиалы для одного разработчика, работающего над новой и непроверенной технологией или создающего подтверждение концепции. Но обычно это делается только в том случае, если изменения затрагивают многие части кодовой базы. Это происходит в среднем каждые 3-4 месяца, и такая ветвь обычно реинтегрируется (или списывается) в течение месяца или двух.

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

На ранний заезд вопрос:

Если вам требуется только ИДЕАЛЬНЫЙ КОД для регистрации, то на самом деле ничего не должно быть проверено. Ни один код не идеален, и для проверки и тестирования его QA должен быть в разработке ветвь, чтобы можно было создать новый исполняемый файл.

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

Время от времени неизбежная комбинированная проверка кода и данных делает программу непригодной для использования до тех пор, пока не будет создан новый код. Самое меньшее, что мы делаем, - это добавляем «WAIT FOR BUILD» в комментарии к регистрации и / или отправляем электронное письмо.

15 голосов
/ 19 октября 2008

Для чего это стоит, вот как мы это делаем.

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

Это означает, что важно держать ствол в неопределенно рабочем состоянии, поскольку вполне возможно полностью сломать его. На практике это случается не часто и редко является серьезной проблемой.

В производственном выпуске мы разветвляем ствол, прекращаем добавлять новые функции, работаем над исправлением ошибок и тестированием ветки (регулярно объединяясь обратно в ствол), пока она не будет готова к выпуску. В этот момент мы выполняем окончательное слияние с транком, чтобы убедиться, что там все есть, а затем отпускаем.

Затем можно выполнить обслуживание ветки выпуска по мере необходимости, и эти исправления можно легко объединить обратно в транк.

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

11 голосов
/ 16 июля 2013

Почему никто до сих пор не упомянул об этом? Успешная модель ветвления Git .

Это для меня идеальная модель ветвления!

Если ваш проект небольшой, не используйте все время разные ветви (возможно, вы могли бы пропустить ветви функций для небольших функций). Но в остальном это способ сделать это!

branching model

6 голосов
/ 19 октября 2008

Код разработки на ветках, Живой код, помеченный на магистрали.

Не должно быть правила «совершать только совершенный код» - все, что пропускает разработчик, должно быть обнаружено в четырех местах: проверка кода, тестирование ветвления, регрессионное тестирование, финальное тестирование качества.

Вот более подробное пошаговое объяснение:

  1. Выполняйте все разработки на ветке, регулярно совершая их по ходу работы.
  2. Независимый код Проверка изменений после завершения всей разработки.
  3. Затем передайте ветку Тестированию.
  4. Как только тестирование ветки завершено, объедините код с веткой Release Candidate.
  5. Релиз-кандидатская ветвь подвергается регрессионному тестированию после каждого отдельного слияния.
  6. Окончательное тестирование QA и UA выполняется на RC после объединения всех ветвей разработки.
  7. Как только QA и UAT пройдены, объедините ветку релиза с веткой MAIN / TRUNK.
  8. Наконец, пометьте Trunk в этой точке и разверните этот тег в Live.
4 голосов
/ 19 октября 2008

dev идет в транке (стиль svn), а релизы (рабочий код) получают свои собственные ветви

Это «модель ветвления по назначению» (рисунок 3 в Важность моделей ветвления /! \ Pdf)

3 голосов
/ 19 октября 2008

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

Никакой код не допускается в производственный код до его полной проверки (QA и рецензентами).

Таким образом, нет никакой путаницы в том, какой код работает, это всегда основная ветвь.

2 голосов
/ 19 октября 2008

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

Для транка единственным правилом является то, что коммит ничего не должен нарушать. Чтобы управлять wip-кодом и непроверенным кодом, мы просто добавляем соответствующие операторы if для упрощения включения и выключения.

По сути, можно в любое время разветвить ствол и запустить его в производство.

2 голосов
/ 19 октября 2008

О да - еще одна вещь - мы храним непроизводственный код (то есть тот, который НИКОГДА не будет выпущен - например, скрипты инструментов, утилиты тестирования) в cvs HEAD. Обычно он должен быть четко обозначен, чтобы никто не «случайно» его выпустил.

0 голосов
/ 20 октября 2008

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

...