Улучшения процесса выпуска

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

Я надеюсь, что люди поделятся улучшениями, которые они внесли в этот процесс в своей организации, чтобы мы все могли предпринять шаги, чтобы «уменьшить боль».

Итак, вопрос в том, укажите одну болезненную / трудоемкую часть процесса выпуска и что вы сделали для ее улучшения?

Мой пример: у предыдущего работодателя все разработчики вносили изменения в одну общую базу данных разработки. Затем, когда подошло время выпуска, мы использовали Redgate SQL Compare, чтобы сгенерировать огромный скрипт из различий между базами данных Dev и QA.

Это работает достаточно хорошо, но проблемы с этим подходом: -

  1. Включены ВСЕ изменения в базе данных Dev, некоторые из которых все еще находятся в стадии разработки.
  2. Иногда разработчики вносили противоречивые изменения (которые не были замечены до тех пор, пока релиз не был запущен в производство)
  3. Создание и проверка сценария занимала много времени и выполнялась вручную (под проверкой я имею в виду попытку отсеять такие проблемы, как проблема 1 и 2).
  4. Когда возникали проблемы со сценарием (например, порядок, в котором все выполнялось, например, создание записи, которая опирается на запись внешнего ключа, которая есть в сценарии, но еще не запущена), потребовалось время, чтобы `` настроить '' ее, чтобы она работала плавно .
  5. Это не идеальный сценарий для непрерывной интеграции.

Итак, решение было: -

  1. Принудительная политика всех изменений в базе данных должна быть написана сценарием.
  2. Соглашение об именах было важно для обеспечения правильного порядка выполнения скриптов.
  3. Создать / использовать инструмент для запуска скриптов во время выпуска.
  4. У разработчиков была собственная копия базы данных, на которую они разрабатывали (так что больше не было «наступать друг другу на пятки»).

Следующий выпуск после того, как мы начали этот процесс, был намного быстрее с меньшим количеством проблем, действительно, единственные обнаруженные проблемы были из-за того, что люди «нарушали правила», например, не создавали скрипт.

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

Мы применили несколько других изменений (например, введение CI), но это было наиболее значительным, в целом мы сократили время выпуска с 3 часов до 10-15 минут.


person wallismark    schedule 23.04.2010    source источник
comment
см. также serverfault. ru / questions / 16698 / ... многие ответы на этот вопрос прямо или косвенно относятся к этапам процесса выпуска.   -  person Zac Thompson    schedule 07.05.2010


Ответы (7)


По возможности автоматизируйте процесс выпуска релизов.

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

Это может включать

  • двоичные файлы,
  • Архивы JAR / WAR,
  • файлы конфигурации по умолчанию,
  • скрипты установки схемы базы данных,
  • скрипты миграции базы данных,
  • Скрипты конфигурации ОС,
  • страницы man / hlp,
  • HTML-документация,
  • Документация в формате PDF

и так далее. Сборка установщика может поместить все это в устанавливаемый пакет (InstallShield, ZIP, RPM или что-то еще) и даже создать ISO-образы компакт-дисков для физического распространения.

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

person Bernd    schedule 06.05.2010
comment
Этот. Особенно +1 за переход на RPM или другой пакет, устанавливаемый в ОС. Производственные системные администраторы должны иметь возможность управлять вашим программным обеспечением так же, как они управляют всем остальным программным обеспечением, используемым в их среде. - person Zac Thompson; 07.05.2010

За последний год или около того мы сделали несколько вещей, чтобы улучшить наш процесс сборки.

  1. Полностью автоматизированная и полная сборка. У нас всегда была ночная «сборка», но мы обнаружили, что существуют разные определения того, что составляет сборку. Некоторые сочтут это компиляцией, обычно люди включают модульные тесты, а иногда и другие вещи. Мы прояснили для себя, что наша автоматизированная сборка буквально делает все необходимое, чтобы перейти от управления версиями к тому, что мы доставляем заказчику. Чем больше мы автоматизируем различные части, тем лучше будет процесс и меньше придется делать вручную, когда пора выпустить (и меньше беспокоиться о том, что что-то забыли). Например, наша версия сборки помечает все номером версии svn, компилирует различные части приложения, выполненные на нескольких разных языках, запускает модульные тесты, копирует выходные данные компиляции в соответствующие каталоги для создания нашего установщика, создает фактический установщик, копирует установщик в в нашей тестовой сети, запускает установщик на тестовых машинах и проверяет, правильно ли установлена ​​новая версия.

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

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

person Samuel Neff    schedule 23.04.2010

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

1) Установочный комплект и развертывание UAT одним щелчком

Мы упаковали наше приложение как установочный комплект, используя NSIS (не MSI, который был намного сложнее и ненужным для наших нужд). Этот установочный комплект сделал все необходимое, например, остановил IIS, скопировал файлы, поместил файлы конфигурации в нужные места, перезапустил IIS и т. Д. Затем мы создали конфигурацию сборки TeamCity, которая запускала этот установочный комплект удаленно на тестовом сервере с помощью psexec.

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

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

2) Автоматизация развертывания базы данных

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

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

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

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

3) Ветвление для выпуска

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

person EMP    schedule 05.05.2010

Автоматическая пошаговая сборка. Сценарий сборки ant редактирует все файлы конфигурации установщика, программные файлы, которые необходимо изменить (управление версиями), а затем выполняет сборку. Никакого вмешательства не требуется.

По-прежнему выполняется запуск сценария для генерации установщиков, когда он будет готов, но мы его устраним.

Версии обложки компакт-диска создаются вручную; это тоже нужно исправить.

person Tim Williscroft    schedule 23.04.2010

Согласен с предыдущими комментариями.

Вот что изменилось там, где я работаю. Этот текущий процесс устранил «подводные камни», которые вы описали в своем вопросе.

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

Один и тот же скрипт ant (передаваемые параметры) используется для каждого env (dev, integration, test, prod).

Процесс проекта

  • Сбор требований в виде пользовательских "историй" (помогает избежать споров по поводу интерпретации требования, когда оно сформулировано как значимое взаимодействие пользователя с продуктом)
  • следование принципам Agile, чтобы каждая итерация проекта (2 недели) приводила к демонстрации текущей функциональности и готовому к выпуску, если ограничено, продукту
  • управлять историями выпусков на протяжении всего проекта, чтобы понимать, что входит, а что выходит за рамки (и не допускать путаницы, связанной с исправлениями в последний момент)
  • (повторение предыдущего ответа) Замораживание кода, затем только тест (без дополнительных функций)

Процесс разработки

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

Процесс тестирования

  • функциональное тестирование (например, селен)
  • выполнение планов тестирования и функциональных сценариев

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

Процесс выпуска

  • Утвердить выпуск на определенную дату / время
  • Проверить план выпуска / отката
  • запустить муравей с параметром "производственное развертывание"
  • выполнять задачи БД (если есть) (также эти скрипты могут иметь версию и иметь теги для производства)
  • выполнить другие системные изменения / конфигурации
  • сообщать об изменениях
person DaveG    schedule 05.05.2010

Я не знаю и не практикую SDLC, но для меня эти инструменты были незаменимы в достижении плавных выпусков:

  • Maven для сборки с менеджером локального репозитория Nexus
  • Hudson за непрерывную интеграцию, выпуск сборок, теги SCM и продвижение сборок
  • Сонар для показателей качества.
  • Отслеживание изменений базы данных в схеме базы данных разработки и управление обновлениями в qa и выпуске с помощью DbMaintain и LiquiBase
person mdma    schedule 05.05.2010

В проекте, над которым я работаю, мы использовали миграции Doctrine (PHP ORM) для обновления и понижения версии базы данных. У нас были всевозможные проблемы, поскольку сгенерированные модели больше не соответствовали схеме базы данных, что приводило к полному сбою миграции на полпути.

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

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

person Jake Worrell    schedule 09.05.2010