Có nhiều cách để sắp xếp dòng workflow công việc thay đổi các code trong một dự án. Làm trực tiếp trên nhánh Git master và deloying trực tiếp trên production mà không test không phải là một cách tốt nhất.
Thử nghiệm (testing) không chỉ về unit và chức năng, mà nó còn kiểm tra ứng dụng với dữ liệu thực tế (production data). Nếu như khách hàng có thể lướt ứng dụng như thực tế với người dùng cuối, điều đó sẽ làm một lợi thế lớn và bạn triển khai ứng dụng một cách đảm bảo. Testing đặc biệt hữu dụng đối với những người không rành về kỹ thuật có thể xác nhận các tính năng mới.
Chúng ta tiếp tục làm tất cả thao tác trên nhánh Git master trong các bước tiếp theo để đơn giản hoá mọi thứ để tránh các thao tác lặp lại, nhưng để xem nó có thể tốt hơn không.
Git Workflow
Một workflow đó là tạo một nhánh cho mỗi tính năng mới và bug fix. - Đơn giản và hiệu quả.
Creating Branches Tạo các nhánh Git
Workflow bắt đầu với việc tạo một nhánh Git:
$ git checkout -b sessions-in-db
Lệnh này tạo một nhánh sessions-in-db
Git từ nhánh Git master
. Nó sẽ 'fork' code và cấu hình infrastructure.
Lưu các phiên (sessions) trong CSDL
Từ tên nhánh bạn có thể đoán, là chúng ta chuyển phiên lưu trữ từ hệ thống file sang lưu trữ ở CSLD (ở đây là CSDL PostgreSQL)
Thực tế thì các bước tiến hành như sau.
Bước 1: Tạo một nhánh Git (như đã làm bên trên - git checkout -b sessions-in-db
Bước 2: Cập nhật cấu hình Symfony nếu cần thiết
Bước 3: Viết hoặc cấp nhật code của ai đó trong nhóm nếu cần thiến
Bước 4: Cập nhật cấu hình PHP nếu cần thiết (ví dụ như thêm PostgreSQL PHP extension)
Bước 5: Cập nhật CSHT trên Docker và Platform.sh nếu cần thiết (chẳng hạn thêm PostgreSQL service)
Bước 6: Test locally
Bước 7: Test remotely.
Bước 8: Nhập nhánh vào master
Bước 9: Triển khai thực tế (depoly to production)
Bươc 10: Xoá nhánh đã tạo từ bước 1.
Để lưu trữ các phiên trên CSLD, đổi cấu hình session.handler_id
chỉ tới CSLD DSN (Data Source Name):
--- a/config/packages/framework.yaml
+++ b/config/packages/framework.yaml
@@ -8,7 +8,7 @@ framework:
# Enables session support. Note that the session will ONLY be started if you read or write from it.
# Remove or comment this section to explicitly disable session support.
session:
- handler_id: null
+ handler_id: '%env(resolve:DATABASE_URL)%'
cookie_secure: auto
cookie_samesite: lax
storage_factory_id: session.storage.factory.native
Để lư trữ các phiên trên CSLD, chúng ta cần tạo bảng sessions.
Làm điều này với một Doctrine migration.
$ symfony console make:migration
Thêm bảng sessions
trong up()
method bằng cách sửa file dưới đây;
--- a/migrations/Version00000000000000.php
+++ b/migrations/Version00000000000000.php
@@ -21,6 +21,15 @@ final class Version00000000000000 extends AbstractMigration
{
// this up() migration is auto-generated, please modify it to your needs
+ $this->addSql('
+ CREATE TABLE sessions (
+ sess_id VARCHAR(128) NOT NULL PRIMARY KEY,
+ sess_data BYTEA NOT NULL,
+ sess_lifetime INTEGER NOT NULL,
+ sess_time INTEGER NOT NULL
+ )
+ ');
+ $this->addSql('CREATE INDEX expiry ON sessions (sess_lifetime)');
}
public function down(Schema $schema): void
Tiếp đó là di chuyển CSLD:
$ symfony console doctrine:migrations:migrate
Test locally (bước 6) bằng cách lướt trang web. Vì không có thay đổi, và chúng ta vẫn chưa sử dung các phiên nên trang web trông vẫn như trước.
We don't need steps 3 to 5 here as we are re-using the database as the session storage, but the chapter about using Redis shows how straightforward it is to add, test, and deploy a new service in both Docker and Platform.sh.
Chúng ta không làm bước 3 và 5 ở đây, vì chúng ta đang sử dụng là CSDL là lưu trữ phiên, nhưng chương về sử dụng Redis chỉ ra cách để thêm, test và triển khai một dịch vụ mới (service) trên Docker và Platform.sh.
Bảng mới sessions
vừa tạo chưa được quản lý bởi Doctrine, chúng ta cần lên cấu hình để Doctrine không xoá nó cho lần di chuyển CSLD tiếp theo.
--- a/config/packages/doctrine.yaml
+++ b/config/packages/doctrine.yaml
@@ -5,6 +5,8 @@ doctrine:
# IMPORTANT: You MUST configure your server version,
# either here or in the DATABASE_URL env var (see .env file)
#server_version: '14'
+
+ schema_filter: ~^(?!session)~
orm:
auto_generate_proxy_classes: true
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
Commit các thay đổi vào nhánh git.
$ git add .
$ git commit -m'Configure database sessions'
Triển khai một nhánh Git
Trước khi triển khai thực tế lên server, chúng ta nên test nhánh có CSHT tương tự như trên server. Chúng ta cũng nên bảo đảm chắc chắn là tất cả mọi thứ hoạt động tốt cho môi trường Symfony prod
(Local website sử dụng môi trường Symfony dev
)
Tạo môi trường Platform.sh dựa trên nhánh Git:
$ symfony cloud:deploy
Lệnh này tạo một môi trường mới như sau:
- Nhánh kế thừa code và CSHT từ nhánh Git hiện tại
sessions-in-db
- Dữ liệu từ môi trường master (production) - bằng cách lấy một bản ghi ổn định (a consistant snapshot) của tất các các dữ liệu service, bao gồm files mà người dùng đã tải lên và CSLD.
- Một cụm chuyên biệt (dedicated cluster) được tạo ra để triển khai code, dữ liệu và CSHT.
Việc triển khai theo các bước tương tự như triển khai ở trên server, di chuyển CSDL cũng được thực thi. Đây là một cách tuyệt vời để xác nhận việc di chuyển hoạt động với dữ liệu trên server.
Các môi trường không phải master thường rất giống với môi trường master
ngoại trừ một vài khác biệt nhỏ: như emails không được gửi đi theo mặc định.
Khi việc triển khai hoàn thành, mở nhánh mới trên trình duyệt.
$ symfony cloud:url -1
Note that all Platform.sh commands work on the current Git branch. This command opens the deployed URL for the sessions-in-db
branch; the URL will look like https://sessions-in-db-xxx.eu-5.platformsh.site/
.
Ghí chú là Platform.sh hoạt động trên nhánh Git hiện tại. Lệnh trên mở URL đã triển khai cho nhánh sessions-in-db.
Đường đẫn có dạng https://sessions-in-db-xxx.eu-5.platformsh.site/
.
Thử nghiệm (test) trang web trên môi trường mới, bạn sẽ thấy tất cả các dự liệu bạn đã tạo trong môi trường master (môi trường chủ)
Nếu bạn thêm tiếp conferences vào môi trường master
chúng sẽ không hiện trong môi trường sessions-in-db
và ngược lại. Các môi trường được tác biệt và độc lập.
Nếu code phát triển trên master (nhánh chủ) bạn luôn có thể rebase nhánh Git và triển khai bản cập nhật, gỉai quyết mâu thuẫn cho cả code và CSHT.
Bạn thậm chí có thể đồng bộ dữ liều từ master trở lại môi trường sessions-in-db
$ symfony cloud:env:sync
Debugging việc triển khai trên server trước khi triển khai
Tất cả các môi trường Platform.sh sử dụng các thiết lập tương tự như trên môi trường master
/prod
(còn gọi là môi trường Symfony prod
). Điều này cho phép bạn thử nghiệm ứng dụng trong điều kiện thực tế. Nó đem lại cảm giác phát triển và thử nghiệm trực tiếp trên server, nhưng không có rủi ro liên quan tới nó.
In case of a problem, you might want to switch to the dev
Symfony environment:
Trường hợp có vấn đề, bạn có thể chuyển qua môi trường Symfony dev
$ symfony cloud:env:debug
Xongg việc, quay trở lại thiết lập cho server.
$ symfony cloud:env:debug --off
Never enable the dev
environment and never enable the Symfony Profiler on the master
branch; it would make your application really slow and open a lot of serious security vulnerabilities.
Không bao giờ bật môi trường dev
và Symfony Profiler trên nhánh master
điều này sẽ làm cho ứng dụng của bạn chậm và mở ra nhiều lỗ hỗng nghiêm trọng.
Thử nghiệm triển khai trên server trước khi triển khai
Having access to the upcoming version of the website with production data opens up a lot of opportunities: from visual regression testing to performance testing. Blackfire is the perfect tool for the job.
Truy cập vào phiên bản sắp tới của trang web với dữ liệu trên server mở ra nhiều cơ hội, từ thử nghiệm hình ảnh tới vận hành. Tham khảo bước về Performance để học cách bạn có thể sử dụng Blackfire để thử nghiệm code trước khi triển khai.
Nhập vào server
Khi mà bạn hài lòng với những thay đổi ở nhánh, thì nhập code và CSHT vào nhánh chủ - Git master.
$ git checkout master
$ git merge sessions-in-db
Và triển khai:
$ symfony cloud:deploy
When deploying, only the code and infrastructure changes are pushed to Platform.sh; the data are not affected in any way.
Khi triển khai chỉ có những thay đổi về code và CSHT được đẩy lển Platform.sh, dữ liệu sẽ không ảnh hưởng.
Dọn sạch
Dọn sạch bằng cách bỏ nhánh Git và môi trường Platform.sh
$ git branch -d sessions-in-db
$ symfony cloud:env:delete -e sessions-in-db