вдосконалити нашу стратегію розгортання


12

У нас є додаток для електронної комерції, який ми розробляємо в нашій компанії. Це досить стандартний додаток LAMP, який ми розробляли і вимикали вже близько 3 років. Ми розробляємо додаток на тестовому домені, тут додаємо нові функції та виправляємо помилки тощо. Нашим відстеженням помилок та розробкою функцій керує всередині розміщеного рішення про підрив (undeudle.com). Як повідомляється про помилки, ми робимо ці виправлення на тестовому домені, а потім здійснюємо зміни до svn, коли ми раді, що помилка була виправлена. Ми дотримуємось цієї ж процедури з додаванням нових функцій.

Варто вказати на загальну архітектуру нашої системи та програми на наших серверах. Кожен раз, коли розробляється нова функція, ми передаємо це оновлення на всі сайти, використовуючи наш додаток (завжди це сервер, яким ми керуємо). Кожен сайт, що використовує нашу систему, по суті використовує абсолютно однакові файли для 95% кодової бази. На кожному веб-сайті є кілька папок, які містять файли, призначені для цього сайту - файли / зображення css тощо. Крім того, відмінності між кожним сайтом визначаються різними налаштуваннями конфігурації в базі даних кожного сайту.

Це переходить до власне розгортання. Як і коли ми готові внести якесь оновлення, ми запустимо команду на сервері, на якому знаходиться тестовий сайт. Це виконує команду копіювання (cp -fru / testingite / / othersite /) і проходить кожну силу vhost, оновлюючи файли на основі зміненої дати. Кожен додатковий сервер, на якому ми розміщуємо, має vhost, до якого ми rsync-кодуємо виробничу базу даних, а потім повторюємо процедуру копіювання на всіх сайтах цього сервера. Під час цього процесу ми переміщуємо файли, які не хочемо перезаписати, переміщуючи їх назад, коли копія завершена. Наш скрипт розгортання виконує ряд інших функцій, таких як застосування команд SQL для зміни кожної бази даних, додавання полів / нових таблиць тощо.

Ми все більше стурбовані тим, що наш процес недостатньо стабільний, не є стійким до відмов, а також є чимось брутальним методом. Ми також усвідомлюємо, що не використовуємо найкраще підрив, оскільки у нас є позиція, коли робота над новою функцією заважає нам виконувати важливе виправлення помилок, оскільки ми не використовуємо гілки або теги. Також здається неправильним, що у нас так багато реплікації файлів на наших серверах. Ми також не можемо легко виконати відкат на тому, що ми тільки що розгорнули. Ми виконуємо різницю перед кожним розгортанням, щоб ми могли отримати список файлів, які будуть змінені, тому ми знаємо, що було змінено після, але процес відкату все ще буде проблематичним. З точки зору бази даних я почав розглядати dbdeploy як потенційне рішення. Хоча ми насправді хочемо, це деякі загальні вказівки щодо того, як можна покращити управління файлами та розгортання. В ідеалі ми хочемо, щоб управління файлами було більш тісно пов'язане з нашим сховищем, щоб згортання / відкат було б більш підключеним до svn. Щось на зразок використання команди експорту, щоб переконатися, що файли сайту однакові як файли репо. Було б також добре, хоча, якщо рішення, можливо, також зупинить реплікацію файлів навколо наших серверів.

Ігноруючи наші нинішні методи, було б дуже добре почути, як інші люди підходять до тієї ж проблеми.

підсумовувати ...

  • Який найкращий спосіб змусити файли на кількох серверах синхронізуватися зі svn?
  • Як слід запобігти реплікації файлів? символічні посилання / щось інше?
  • Як слід структурувати наше репо, щоб ми могли розробляти нові функції та виправляти старі?
  • Як слід запускати перемотки / відкати?

Спасибі заздалегідь

Редагувати:

Нещодавно я прочитав багато хороших речей про використання Фінга та Капістрано для таких завдань. Чи може хто-небудь дати більше інформації про них і наскільки вони були б хороші для такого роду завдань?

Відповіді:


6

Моя порада щодо випусків - мати Featured Releases та Maintenance Releases. Feature Releases - це випуски, які отримують нові функції. Вони додаються у ваш підривний магістраль. Коли ви думаєте, що ці функції завершені, ви розгалужуєте їх на гілку випуску. Після того, як ваш процес QA буде задоволений цим випуском, ви помітите випуск та розгорніть код на своїх серверах.

Тепер, коли ви отримуєте звіт про помилку, ви здійснюєте це виправлення у гілці та переносите її на стовбур. Коли ви задоволені кількістю виправлених помилок, можете помітити тег та розгорнути випуск технічного обслуговування.

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

Я б рекомендував використовувати вбудовану систему упаковки вашого дистрибутива для розгортання нового коду. Якщо у вас є пакет, який містить всю вашу кодову базу, ви знаєте, що весь ваш код був розгорнутий у вигляді атомної операції, ви можете побачити, яка версія встановлена ​​з першого погляду, ви можете перевірити свою кодову базу за допомогою контрольної суми ваших пакетів. Відкат - це лише випадок встановлення раніше встановленої версії пакету.

Єдиний блокпост, який я можу вам побачити, реалізуючи це, - це те, що у вас є кілька копій бази коду для різних клієнтів, що працюють на одному сервері. Я б спробував упорядкувати ваш код таким чином, щоб усі клієнти розбігали однакові файли та не використовували копії. Я не знаю, наскільки це було б легко для вас, але зменшення кількості копій, з якими вам доведеться мати справу, значно зменшить ваш головний біль.

Я припускаю, що, як ви згадали LAMP, ви використовуєте PHP або іншу мову сценаріїв, яка не вимагає процесу компіляції. Це означає, що ви, мабуть, пропускаєте чудовий процес під назвою Безперервна інтеграція. Це в основному означає, що ваш код постійно перевіряється, щоб переконатися, що він все ще знаходиться у звільненому стані. Кожен раз, коли хтось перевіряє новий код, процес приймає його і запускає процес збирання та тестування. За допомогою компільованої мови ви зазвичай використовуєте це, щоб переконатися, що код все ще компілюється. З кожною мовою ви повинні скористатися можливістю запускати одиничні тести (ваш код у тестованих одиницях, чи не так?) Та інтеграційні тести. Для веб-сайтів хорошим інструментом для перевірки інтеграційних тестів є Selenium. У наших Java-складах ми також вимірюємо охоплення коду та показники коду, щоб побачити, як ми прогресуємо з часом. Найкращий сервер CI, який ми знайшли для Java, - це Хадсон, але щось на кшталт buildbot може краще працювати для інших мов. Ви можете створювати пакети за допомогою свого сервера CI.


Дякую. так, ми використовуємо PHP. Я мушу визнати, що я не надто підтримую постійну інтеграцію, з того, що я знаю, дуже схоже на тестування одиниці, але я не знаю набагато більше того. Ми зацікавлені в тестуванні одиниць, але в нашій кодовій базі все ще є багато застарілого процесуального коду, який насправді не піддається одиничним тестам. хоча кілька цікавих ідей, було б добре почути ваші ідеї щодо того, як наш код міг бути краще організований для запобігання реплікації.
robjmills

безперервна інтеграція - це буквально просто автоматичне тестування на кожній реєстрації або щогодини або щодня. До тих пір, поки ви робите це регулярно та автоматизовано, це майже все.
Девід Пашлі

Я бачив сьогодні цю статтю про використання Хадсона поряд із PHP та Phing - toptopic.wordpress.com/2009/02/26/php-and-hudson
robjmills

1

Ми почали використовувати Puppet (флагманський продукт Reductive Labs). Це основа на Ruby для автоматизації роботи системного адміністратора. Я був у ляльковому кінотеатрі пару тижнів тому, і ось відео посилання:

Лука Каніс представляє - ляльковий вступ

Крім того, якщо ви хочете побачити всі презентації, зроблені в ляльковому таборі в Сан-Франциско, це посилання:

Презентації про те, як інші використовували Ляльку

Насолоджуйтесь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.