Управление параллельной разработкой при помощи IBM Rational Team Concert. Стратегия интеграции и выпуска программного обеспеченияИсточник: IBM
Ориентация на понятия и концепции При разработке ПО в групповой среде часто бывает нужно разделить разного рода работы на отдельные потоки. Также разделение может быть основано на функциональности (например, набор усовершенствований системы безопасности отделяется от изменений в графическом интерфейсе пользователя) либо представлять собой отделение набора дефектов от новой разработки, чтобы быстрее доставить заказчикам версию с исправлениями. Для такого разделения работ существует множество причин, и во многих системах управления версиями оно реализуется с помощью набора параллельных ветвей. В IBM Rational Team Concert параллельная разработка реализуется путем использования нескольких потоков. Готовая часть работы попадает в определенный поток и интегрируется с работой других разработчиков, работающих с тем же потоком. При использовании нескольких потоков деятельность различных групп разработчиков разделена до тех пор, пока не будет выполнена конкретная задача, после чего наработки из разных потоков интегрируются. Проще говоря, потоки позволяют группе разработчиков автоматически интегрировать работу своих участников в нужные моменты времени. Цель данной статьи - представить процесс параллельной разработки с использованием возможностей продукта Rational Team Concert путем описания сценария и шагов по созданию этого сценария. Приведенная схема учитывает многие аспекты разработки, с которыми обычно имеют дело группы разработчиков, но процесс можно модифицировать с учетом специфических требований любой организации и любого процесса разработки. Является ли такая разработка гибкой? Одним из ключевых принципов гибкой разработки является частая интеграция изменений, вносимых каждым разработчиком, и непрерывная сборка вновь интегрированного кода приложения. Поэтому некоторые борцы за чистоту концепции гибкости могут посчитать, что формально разделенный процесс находится вне области гибкой разработки. Однако в силу самого масштаба многих проектов по разработке программных продуктов ресурсов одной объединенной команды разработчиков может быть недостаточно. Кроме того, масштабы и сложность изменений могут быть настолько велики, что неизбежно приходится прибегать к разделению. Принципы IBM agilityscale поощряют разделение группы и, соответственно, назначение различных работ разным группам. Вследствие физического рассредоточения групп или очевидной сложности проекта может оказаться целесообразным введение в группу гибкой разработки определенной степени разделения и регулируемой интеграции. Эта степень сама может проявляться в потоке для конкретного местоположения или для конкретной версии. Rational Team Concert помогает группам гибкой разработки выполнять разделение работы, например, на серию функциональных потоков, которые объединяются в одно целое посредством совместно используемого интеграционного потока. Надо признать, что многие группы гибкой разработки используют бесплатные программные средства или недорогие инструменты разработки, предоставляющие ограниченную поддержку раздельной разработки. Такие инструменты часто не допускают применения раздельного подхода вследствие функциональных ограничений и высоких издержек реализации интеграции. Rational Team Concert предоставляет командам гибкой разработки механизм, который способствует совершенствованию способов разработки и поднятию их на новый уровень эффективности, гибкости и креативности и при этом легко встраивается в процессы разработки. Методику Rational Team Concert могут использовать как небольшие единые группы гибкой разработки, так и крупные территориально распределенные группы, состоящие из множества более мелких групп гибкой разработки. Некоторые ключевые характеристики групп гибкой разработки и принципы своевременной поставки при гибкой разработке (Disciplined Agile Delivery) описаны Скотом Эмблером (Scott Ambler) в его блоге (см. раздел Ресурсы).
Введение в Rational Team Concert Предполагается, что читатель имеет базовые знания по продукту Rational Team Concert и принципам управления конфигурацией ПО. Дополнительную информацию по Rational Team Concert и другим тесно связанным с ним продуктам можно найти на Web-сайте Jazz.net. В помощь читателю мы приводим в данном разделе описание ряда ключевых для этого продукта концепций и терминов, используемых в области параллельной разработки.
Потоки параллельной разработки Даже когда пользователи работают в одном потоке (например, функциональный поток 1 на рисунке 1), существует некоторое разделение между пользователями и управляемой интеграцией изменений в процессе поставки и принятия (см. рисунок 3).
Отправной точкой этого сценария является команда разработчиков, которая хочет разделить выполняемую работу на два дополнительных потока с целью изоляции своей деятельности (см. рисунок 2).
На рисунке 2 показан основной поток разработки, в который разработчики передали несколько наборов изменений. На схеме видно, что, например, один набор изменений был передан в поток до поставки #1, а другой - между поставками #1 и #2. Если в рамках проекта никакие другие потоки больше не создаются, то все наборы изменений, поставленные группой, интегрируются в единый совместно используемый поток. Однако работающая над этим проектом группа решила, что несколько разработчиков должны выполнить некие изменения отдельно от остальной группы. Через некоторое время после начала работы над проектом был создан функциональный поток 1. Затем спустя некоторое был создан функциональный поток 2. Часть работы при этом выполняется в основном потоке разработки, а другая часть - в функциональных потоках. Для простоты на схемах показана только небольшая часть наборов изменений, но в реальности в каждый из потоков по мере выполнения множеством разработчиков их работы поставляется, вероятно, множество наборов изменений. После завершения работы с функциональным потоком 1 группа решает, что этот поток следует интегрировать с основным потоком разработки в точке #2. Специфический процесс интеграции работы из одного потока в другой описан ниже. В точке поставки создается функциональный поток 2, и работа продолжается в трех отдельных параллельных потоках. По достижении точек #3 и #4 работа, выполненная в двух функциональных потоках, вливается в основной поток разработки, и в точке #5 создается базовая линия для выпуска. После окончания поставок из функциональных потоков эти потоки удаляются. Добавление совместно используемого потока интеграции и выпуска Создав в предыдущем разделе сценарий, показанный на рисунке 2, добавим в него дополнительный поток интеграции и выпуска. На рисунке 3 показан новый сценарий, который описывается ниже.
Сценарий создания набора изменений, базовой линии и интеграции работы из одного потока в другой соответствует схеме, описанной в разделе Функциональные потоки, но с небольшими изменениями. Поток интеграции и выпуска будет использоваться для формальной интеграции и системного тестирования приложения до его выпуска.
Разделение потока интеграции и выпуска Со временем группы разработчиков нередко приходят к заключению о целесообразности разделения потока интеграции и выпуска на отдельные элементы. Это может происходить по следующим причинам:
На рисунке 4 показано введение потока выпуска и отдельного потока неотложных исправлений для захвата оперативных изменений в системе. Процесс фиксации таких неотложных изменений и передачи их обратно в разработку описывается в следующем разделе.
Код прикладной программы на момент, определенный базовой линией #5, выбран для выпуска, поэтому создается новая иерархия потока выпуска для управления выпуском и возможной работой по неотложным исправлениям, как описано ниже.
На рисунке 5 показаны дальнейший цикл создания потока выпуска, потока неотложных исправлений, а также работа по неотложным исправлениям, включающая несколько изменений. Завершающим действием на схеме является передача неотложных исправлений обратно в основной поток разработки. Для каждого большого выпуска создается новый поток выпуска и неотложных исправлений, поскольку может потребоваться продолжение выполнения процесса исправлений и выпуска в первом потоке выпуска для создания второй базовой линии исправления и выпуска после базовой линии, обозначенной как #7. По окончании поддержки конкретного выпуска соответствующие потоки выпуска и исправлений можно удалить. Последняя в разделе схема взаимодействия потоков показывает, как потоки сменяют друг друга в ходе разработки. На рисунке 6 показано, что процесс разработки продолжается, функциональные потоки 1 и 2 завершены, вся выполненная работа доставлена, а потоки удалены. Для продолжения разработки создан функциональный поток 3. Выпуск, связанный с базовой линией #8, также завершен, и, несмотря на то, что поток выпуска сохраняется, поток исправлений можно безопасно удалить.
Конечно, существует множество способов разделения и подразделения работы в группе разработчиков. Процессы интеграции и выпуска в каждой организации существенно разнятся, но рассматриваемый в этой статье пример показывает принципы, которые может перенять или приспособить под себя любая организация. Группы могут реализовать идеи, изложенные в этой статье, наиболее приемлемым для них способом. Мы предполагаем, что реализация изложенных здесь идей будет разной в разных организациях.
Порядок создания и удаления потоков отражает стиль разработки группы. Как показано на рисунке 7, проект начинается с одного потока разработки и постепенно усложняется с каждой итерацией. Путем удаления ненужных потоков поддерживается максимально простая структура потоков. Приведенные в следующих разделах снимки экрана иллюстрируют создание системой Rational Team Concert наглядного представления потоков, рабочего пространства репозитория и их взаимосвязей.
Когда в Rational Team Concert создается новый проект, он имеет один поток, содержащий компонент по умолчанию. Дополнительные компоненты могут создаваться по мере необходимости, но в контексте данного документа будет использоваться один компонент. На рисунке 8 показаны поток и структура репозитория для нового проекта, в котором предусмотрено рабочее пространство репозитория только для одного разработчика.
Поток и любые подключенные к нему рабочие пространства можно визуализировать с помощью блок-схемы, показанной в правой части рисунка 8. Пользователи могут видеть иерархическую структуру потоков и рабочих пространств репозитория, а также потоки, соединенные с другими потоками. Следует помнить, что Rational Team Concert по сути имеет плоскую структуру, и информация может поставляться из любого рабочего пространства в любой поток при наличии соответствующих разрешений. (Разрешения описываются в последнем разделе статьи.) Для передачи требуемого потока изменений группы разработчиков должны использовать документацию, например, схемы, изображенные на рисунках 2-6. Это поможет отдельным разработчикам определить, в каком месте потока нужно вносить изменения и кто отвечает за поставку работы в конкретные потоки. Такая документация должна обновляться достаточно часто, чтобы каждый член группы хорошо понимал свои обязанности по мере развития структуры потоков. Подключение к проекту новых разработчиков Вновь подключенные к проекту пользователи могут получить доступ к файлам для внесения изменений путем создания нового рабочего пространства репозитория. Эта операция выполняется в несколько шагов: вначале выберите пункт My Repository Workspaces (см рисунок 8), затем New, а затем Repository Workspace. При этом отобразится диалоговое окно, показанное на рисунке 9, где можно выбрать поток, в который будут поставляться изменения ("втекать"). Общее количество потоков проекта обычно невелико, поэтому нужный поток выбрать просто, если потокам присвоены подходящие описательные имена.
Блок-схема после создания второго потока показана на рисунке 10. Обратите внимание, что блок-схемы можно создавать при помощи меню, которое появляется при нажатии правой кнопки мыши либо на потоке, либо на рабочем пространстве репозитория в правой части экрана, изображенного на рисунке 8.
Пояснение по передаче информации из потока в поток Схема связей между потоками не указывает на прямую передачу содержимого файлов из одного потока в другой. В Rational Team Concert не реализована такая возможность. Механизм передачи изменений из одного потока в другой состоит в том, что все изменения проходят через рабочее пространство репозитория. Этот процесс подробно описан ниже.
Однако создание индикативных связей между потоками дает наглядную картину того, что изменения, накопленные в одном потоке, в конечном счете будут переданы в другой поток в рамках процесса разработки. Для создания индикативных связей между потоками необходимо открыть окно параметров исходного потока, как показано на рисунке 11. Существует несколько способов создания новых потоков. Одним из простейших является использование блок-схемы, предоставляющей наглядное изображение взаимосвязей между потоками и рабочими пространствами репозитория. При щелчке правой кнопкой мыши на потоке отображается меню с различными функциями и опциями.
При выборе опции создания нового потока пользователю предлагается ввести имя потока и область группы в рамках проекта, которая имеет доступ к потоку. Если в проекте нет никаких областей групп, то отображается имя проекта. В сценарии на рисунке 2 первый создаваемый поток называется Feature Stream 1. Сразу после создания поток имеет то же содержимое, что и поток, из которого он был создан. Кроме того, новый поток не имеет никаких взаимосвязей с другими потоками и связанных с ним рабочих пространств.
Увеличенная версия рисунка 11. В диалоговом окне для потока можно выполнять следующие действия:
К функциональному потоку 1 добавляется новый целевой объект передачи изменений в основной поток разработки. Такая конфигурация потока показана на рисунке 12.
На рисунке 13 показана обновленная блок-схема, на которой изображены три разработчика, работающие в данный момент с основным потоком разработки.
Добавление функционального потока 2 (см. рисунок 14) завершает сценарий, показанный на рисунке 2.
Завершение создания нового потока Для завершения показанной на рисунке 4 структуры потоков, которая состоит из потоков интеграции, выпуска и оперативных исправлений, создаются новые потоки и устанавливаются связи целевых объектов передачи с использованием описанного выше механизма. Результаты показаны на рисунке 15.
В левой части рисунка 15 показана связанная с разработкой проекта деятельность группы, в которой два разработчика (Марк и Саймон) работают с основным потоком разработки, а Адриан работает с функциональным потоком 1 (прежде Адриан работал с основным потоком разработки, а сейчас он работает над конкретными функциями в отдельном потоке). Марк и Саймон интегрируют свою работу путем поставки наборов изменений в основной поток разработки и последующего приема наборов изменений из этого потока. Схема упрощена в части количества пользователей, работающих с каждым потоком. Предполагается, что Адриан и другие разработчики будут совместно работать с функциональным потоком 1, а другие разработчики будут совместно использовать функциональный поток 2. Справа от основного потока разработки показана структура потоков для поддержки процесс выпуска и исправлений. Поток интеграции используется для постепенной (и управляемой) интеграции вносимых изменений. После создания соответствующей базовой линии в потоке интеграции его текущее состояние (наборы изменений и базовые линии) поставляется в поток выпуска 1.0. Поток выпуска для конкретной версии создается, как схематически показано на рисунке 4, а также на блок-схеме на рисунке 15. Он позволяет поддерживать несколько потоков выпуска для реализации сценария, предусматривающего одновременное использование нескольких выпусков. Такие выпуски могут потребовать применения к ним неотложных исправлений. В примере на рисунке 16 первый выпуск при создании имеет набор изменений с базовой линии #8. Возможна ситуация, когда у заказчиков, использующих данный выпуск приложения, возникнет потребность в дополнительных неотложных исправлениях ошибок после прохождения базовой линии #8 при отсутствии возможности приобрести самый последний выпуск приложения, показанный на втором потоке выпуска. Таким образом, поддержка возможности внесения исправлений в выпуск, созданный с базовой линии #6, имеет большое значение.
Поток неотложных исправлений, обозначенный на рисунке 15 как "Release Stream 1.0 - E-Fix", предназначен для максимально быстрого внесения неотложных изменений в подготавливаемый к выпуску продукт. Эти изменения не затрагивают исходный код и его перекомпиляцию; во многих случаях они относятся к конфигурационным файлам и настройкам, которые требуют немедленного обновления. Тем не менее эти изменения передаются в отдельный поток, гарантирующий, что потоки выпуска не будут использованы при разработке. Неотложные изменения, вероятно, тоже необходимо вносить в поток разработки, чтобы они естественно перетекали в следующий выпуск. На рисунке 4 показан набор изменений #7, поставляемый в поток выпуска и основной поток разработки в точке #11. Подключение пользователей к потокам В сценарии параллельной разработки приложений пользователи должны выполнять две основные задачи, касающиеся управления конфигурацией:
Создание новых рабочих пространств было описано в предыдущем разделе. Подключение рабочего пространства к различным потокам для поставки работы описывается в следующем разделе. Изменение целевого потока для поставки В сценарии на рисунке 2 разработчик внес изменения в функциональный поток 1. Этот набор изменений может содержать несколько файлов и, в соответствии с принципами выполнения проекта в среде Rational Team Concert, имеет либо описание, либо связанный с ним элемент работы. Изменения содержания файлов были выполнены на локальном жестком диске разработчика, а затем сданы в серверное рабочее пространство репозитория и собраны в набор изменений, как показано на рисунке 3. После этого изменения передаются в конкретный поток. В сценарии на рисунке 15 пользователи Марк и Саймон поставляют свои изменения в основной поток разработки, а Адриан поставляет свои изменения в функциональный поток 1. Целевой поток для операции поставки является одной из характеристик рабочего пространства репозитория разработчика, как показано на рисунке 17 для пользователя Марк.
В информационном разделе рабочего пространства репозитория есть ряд полезных элементов. В соответствии с решаемой задачей он содержит целевой объект для репозитория, который указывает, в какой поток будут поставлены наборы изменений. Чтобы изменить целевой объект, выберите Add (в разделе Flow Targets), а затем выберите требуемый поток. Если пользователь Марк хочет передать наборы изменений в функциональный поток 2, а не в основной поток разработки, раздел Flow Targets будет выглядеть так, как показано на рисунке 18.
В точке добавления нового целевого объекта на самом деле не происходит никаких изменений в способе поставки наборов изменений. Чтобы изменить текущий целевой объект поставки, новый целевой поток нужно сделать текущим с помощью кнопок с правой стороны экрана, как показано на рисунке 19.
Рисунок 19 показывает, что принятым по умолчанию целевым объектом для конкретного рабочего пространства репозитория является основной поток разработки, но текущим целевым объектом является функциональный поток 2. Это отражено на блок-схеме, показанной на рисунке 20. Текущий целевой объект изображен сплошной линией, а целевой объект по умолчанию изображен штриховой линией.
Представление Pending Changes также содержит полезную информацию, касающуюся целевых объектов. Любые объекты, не являющиеся целевыми объектами по умолчанию, выделяются курсивом в верхней строке в представлении Pending Changes, как показано на рисунке 21.
При инициализации новой поставки отображается показанное на рисунке 22 окно с предупреждением о поставке в объект, не являющийся целевым объектом по умолчанию, при этом пользователь может проверить, что поставка выполняется в нужное место.
Это предупреждение не будет появляться, если пользователь переключил текущий и принятый по умолчанию целевые объекты на новый поток, в который хочет поставлять наборы изменений. В этом случае целевой поток не будет выделяться курсивом. Изменение целевого объекта в представлении Pending Changes Также имеется возможность изменить целевой объект в представлении Pending Changes. Новый целевой поток можно выбрать, щелкнув правой кнопкой мыши на имени рабочего пространства репозитория и выбрав Change Flow Target. Как было сказано выше, стрелки, соединяющие потоки на блок-схемах на рисунках 13, 14, 15 и 20 служат исключительно для информирования о намерении передать работу из одного потока в другой. Работу по передаче конкретных изменений из потока в поток выполняет человек, которому назначена роль "интегратора". Этот процесс описывается в следующем разделе. Как показано на рисунке 4, изменения будут передаваться из потока в поток в следующем порядке (например): Функциональный поток 1 > Основной поток разработки > Интеграционный поток > Поток выпуска На практике наборы изменений должны передаваться из потока в поток через рабочее пространство репозитория. Роль интегратора часто сводится к осуществлению этого процесса. Для передачи наборов изменений из потока в поток необходимо выполнить следующие операции:
Советы. В приведенном ниже примере описаны шаги по передаче изменений из функционального потока 1 в основной поток разработки через рабочее пространство пользователя по имени Марк. Сбор изменений из функционального потока 1 Назначьте текущий целевой объект рабочего пространства репозитория (рабочее пространство Марка) функциональному потоку 1, как показано на рисунке 23. После этого в представлении Pending Changes рабочего пространства репозитория отобразятся входящие изменения, внесенные пользователем под именем Адриан в функциональный поток 1, как показано на рисунке 24. Эти изменения интегратор (Марк) должен включить в рабочее пространство репозитория.
Рисунок 24. Прием изменений из функционального потока 1 Поставка изменений в основной поток разработки Назначьте текущий целевой объект рабочего пространства репозитория основному потоку разработки, как показано на рисунке 25. После этого в представлении Pending Changes рабочего пространства репозитория отобразятся исходящие изменения для работы, находящейся в данный момент в рабочем пространстве репозитория, как показано на рисунке 26. Эти изменения интегратор Марк должен передать из рабочего пространства репозитория.
Рисунок 26. Поставка изменений в основной поток разработки Такой процесс можно использовать для сбора изменений из любого потока и последующей их передачи в любой другой поток. Однако необходимо обеспечить управление пользователями, которым разрешена передача изменений в конкретные потоки (например, в поток выпуска). В следующем разделе описана процедура управления доступом к потокам. Управление поставками в потоки В области Process Configuration проекта можно определить роли проекта, которым разрешено поставлять изменения в конкретные потоки для конкретного компонента. Соответствующую область конфигурирования можно найти, выполнив следующие шаги в Eclipse-интерфейсе системы Rational Team Concert:
На рисунке 27 показан результат этих действий. Совет.
Увеличенная версия рисунка 27. Для каждого потока можно указать роли, которым разрешено поставлять наборы изменений, как показано на рисунке 28 (который является увеличенным изображением нижней части рисунка 27).
На рисунке 28 показана новая роль Release Stream Integrators, и теперь только члены группы, имеющие доступ к потоку выпуска, смогут выполнять поставку в него. Rational Team Concert предоставляет высокоэффективную среду коллективного взаимодействия для современных проектов разработки ПО. Большинству групп необходима поддержка нескольких потоков разработки и совместного выполнения изменений проекта. Потоковая структура и взаимосвязи с рабочими пространствами пользователей делают такие процессы не просто возможным, но и весьма действенным способом сегментации и изоляции работ, обеспечивающим максимальную эффективность группы разработки ПО.
Научиться
Обсудить
|