Розгалуження коду
Існує багато способів організації робочого процесу внесення змін до коду в проекті. Але робота безпосередньо в головній гілці Git та розгортання в продакшн без тестування — мабуть, не найкращий.
Тестування — це не тільки модульні чи функціональні тести, це також перевірка поведінки застосунку з продакшн даними. Якщо ви чи зацікавлені сторони можете переглянути застосунок точно так, як він буде розгорнутий для кінцевих користувачів, це стає величезною перевагою і дозволяє вам розгортати застосунок з упевненістю. Це особливо ефективно, коли люди без технічних навичок можуть перевірити нові функції.
Ми продовжимо виконувати всю роботу в основній гілці Git на наступних кроках задля простоти й щоб не повторюватися, але подивімося, як це може працювати краще.
Організація робочого процесу Git
Однією з можливих варіацій робочого процесу є створення однієї гілки для реалізації нової функціональності або виправлення помилок. Це просто та ефективно.
Створення гілок
Робочий процес починається зі створення гілки Git:
1
$ git checkout -b sessions-in-db
Ця команда створює гілку sessions-in-db із гілки master. Це "розгалужує" код і конфігурацію інфраструктури.
Зберігання сесій у базі даних
Як ви могли здогадатися з назви гілки, ми хочемо перемкнути механізм зберігання сесій із файлової системи до сховища бази даних (тут наша база даних PostgreSQL).
Необхідні кроки, щоб зробити це реальністю, типові:
- Створіть гілку Git;
- Оновіть конфігурацію Symfony, якщо це необхідно;
- Напишіть та/або оновіть код, якщо це необхідно;
- Update the PHP configuration if needed (like adding the PostgreSQL PHP extension);
- Оновіть інфраструктуру Docker і Upsun, якщо це необхідно (додайте сервіс PostgreSQL);
- Протестуйте локально;
- Протестуйте віддалено;
- Об'єднайте гілку з основною;
- Розгорніть у продакшн;
- Видаліть гілку.
Щоб зберігати сесії в базі даних, змініть конфігурацію session.handler_id так, щоб вона вказувала на DSN бази даних:
1 2 3 4 5 6 7 8 9 10 11 12
--- i/config/packages/framework.yaml
+++ w/config/packages/framework.yaml
@@ -3,7 +3,8 @@ framework:
secret: '%env(APP_SECRET)%'
# Note that the session will be started ONLY if you read or write from it.
- session: true
+ session:
+ handler_id: '%env(resolve:DATABASE_URL)%'
#esi: true
#fragments: true
Щоб зберігати сесії в базі даних, нам потрібно створити таблицю sessions. Зробіть це за допомогою міграції Doctrine:
1
$ symfony console make:migration
Виконайте міграцію бази даних:
1
$ symfony console doctrine:migrations:migrate
Протестуйте локально, переглядаючи веб-сайт. Оскільки візуальних змін немає, і оскільки ми ще не використовуємо сесії, все має працювати як і раніше.
Note
Тут нам не потрібні кроки 3-5, оскільки ми повторно використовуємо базу даних у якості сховища сесій, але розділ про використання Redis показує, наскільки просто додати, протестувати і розгорнути новий сервіс як у Docker, так і в Upsun.
Зафіксуйте свої зміни в новій гілці:
1 2
$ git add .
$ git commit -m'Configure database sessions'
Розгортання гілки
Перш ніж розгорнути гілку в продакшн, ми маємо перевірити її на тій самій інфраструктурі, що і продакшн. Ми також маємо переконатися, що все добре працює в середовищі Symfony prod (локальний веб-сайт використовував середовище Symfony dev).
Тепер, створімо середовище Upsun на основі гілки Git:
1
$ symfony cloud:push
Ця команда створює нове середовище наступним чином:
- Гілка успадковує код і інфраструктуру від поточної гілки Git (
sessions-in-db); - Дані надходять з основного (продакшн) середовища шляхом створення послідовного знімка всіх службових даних, включаючи файли (наприклад, завантажені користувачем) та бази даних;
- Для розгортання коду, даних та інфраструктури створюється новий виділений кластер.
Оскільки процес розгортання слідує тим же крокам, що і розгортання в продакшн, міграції баз даних також будуть виконані. Це відмінний спосіб перевірити, що міграції працюють з продакшн даними.
Будь-яке середовище відмінне від master майже ідентичне, за винятком невеликих відмінностей: наприклад, електронні листи не надсилаються за замовчуванням.
Після завершення розгортання відкрийте нову гілку в браузері:
1
$ symfony cloud:url -1
Зверніть увагу, що всі команди Upsun працюють у поточній гілці Git. Ця команда відкриває URL-адресу для щойно розгорнутої гілки sessions-in-db; посилання матиме приблизно наступний вигляд: https://sessions-in-db-xxx.eu-5.platformsh.site/.
Протестуйте веб-сайт у цьому новому середовищі, ви маєте побачити всі дані, які ви створили в основному середовищі.
Якщо ви додасте більше конференцій в середовищі master, вони не будуть відображатися в середовищі sessions-in-db і навпаки. Середовища є незалежними й ізольованими.
Якщо код розвивається на основній гілці, ви завжди можете перебазувати гілку Git і розгорнути оновлену версію, вирішивши конфлікти як для коду, так і для інфраструктури.
Ви навіть можете синхронізувати дані з основного середовища до середовища sessions-in-db:
1
$ symfony cloud:env:sync
Налагодження розгортання в продакшн
За замовчуванням всі середовища Upsun використовують ті ж налаштування, що й середовище master/prod (середовище Symfony prod). Це дозволяє протестувати застосунок у реальних умовах. Таким чином створюється відчуття розробки й тестування безпосередньо на продакшн-серверах, але без пов'язаних з цим ризиків. Це нагадує мені про старі добрі часи, коли ми розгортали через FTP.
У разі виникнення проблем, можливо, ви захочете перемкнутися на середовище Symfony dev:
1
$ symfony cloud:env:debug
Після закінчення поверніться до продакшн налаштувань:
1
$ symfony cloud:env:debug --off
Warning
Ніколи не вмикайте середовище dev і ніколи не вмикайте Symfony Profiler у гілці master. Це зробить ваш застосунок дуже повільним і відкриє багато серйозних вразливостей у системі безпеки.
Тестування розгортання в продакшн
Наявність доступу до майбутньої версії веб-сайту з продакшн даними відкриває безліч можливостей: від візуального регресійного тестування до тестування продуктивності. Blackfire є ідеальним інструментом для роботи.
Зверніться до кроку про doc:`Продуктивність <29-performance>`, щоб дізнатися більше про те, як можна використовувати Blackfire для тестування коду перед розгортанням.
Об'єднання з продакшн
Коли вас влаштовують зміни в гілці, об'єднайте код та інфраструктуру з основною гілкою Git:
1 2
$ git checkout master
$ git merge sessions-in-db
І розгорніть:
1
$ symfony cloud:push
Під час розгортання у Upsun публікуються лише зміни коду й інфраструктури; на дані жодним чином це не впливає.
Очищування
Нарешті, очистьте, видаливши гілку Git і середовище Upsun:
1 2
$ git branch -d sessions-in-db
$ symfony cloud:env:delete -e sessions-in-db