Làm sao để xây dựng Continuous Deployment với Symfony, Circle CI và Capifony

Các thuật ngữ như Continuous Integrate, Continuous Delivery hay Continuous Deployment xuất hiện ngày càng nhiều và thực tế một số project và dự án lớn đang dần được áp dụng. Công nghệ hiện nay cho phép bạn xây dựng một hệ thống Continuous Deployment dễ dàng với những bên cung cấp thứ 3 như Circle CI, Codeship ... hoặc các mã nguồn mở như Jenkin.

Khi bắt đầu một dự án mới, nếu cứ đi theo lối mòn và "code như kiểu thường ngày" thì quả thực là không còn thú vị, thêm một nguyên nhân nữa - "nếu bạn không áp dụng ngay từ ban đầu thì sẽ chẳng bao giờ áp dụng". Vậy nên chúng ta sẽ bắt đầu từ những điều đơn giản nhất.

Vấn đề

Trong team của mình hiện tại có 4-5 thành viên, hàng ngày vẫn làm việc trên các repo riêng của mình và khi có nhu cầu thì push và tạo pull request, các thành viên sẽ review code lẫn nhau và merge vào nhánh chính master. Với cách này, hiệu quả tương đối nhưng việc commit file lỗi hoặc thiếu là chuyện thường thấy. Chính vì vậy tôi muốn xây dựng một hệ thống tự động pull code trên nhánh chính master sau mỗi lần code được merged và tạo build package, check code syntax, chạy pass các unit test, BDD testing ... Sau đó tự động deploy trên server production, nếu trong quá trình bị đứt đoạn thì code sẽ được rollback một cách dễ dàng và nhanh chóng.

Giải Pháp

Có nhiều giải pháp như đã nêu trên, bạn có thể xài một tool khá phổ biên là Jenkin, hoặc có một số bên cung cấp thứ 3 như CodeShip, Circle CI... Dùng service hay tự host thì đều có những ưu và nhược điểm khác nhau, với mình thì chỉ muốn dùng service ngoài và ... free. Mình sẽ giới thiệu cách dùng với Circle CI.

Circle CI

  • Circle CI chỉ tự động tích hợp với Github, nếu bạn xài Gitlab thì phải chuyển qua Github.
  • Cấu hình để project hoạt động được trên Circle CI có nhiều cách, nhưng cách tốt nhất vẫn theo kiểu đơn giản là push file circle.yml trên thư mục gốc của project. File circle.yml của mình tương tự như bên dưới.

Giải thích thêm về file config, ở đây mình chọn php version 7, và ruby cho việc install capifony, Copy file parameters_test.circle.yml config dành riêng cho Circle CI.

Sau các bước chạy install một số thủ tục của Symfony,sẽ là chạy Unit test. phpunit được cài đặt tự động trên Circle CI giúp bạn chỉ cần chạy lên phpunit -c app/

Capifony

Sau các bước pull code, install dependencies, và testing thành công, chúng ta sẽ đẩy code deploy lên server production.

Nếu dùng Symfony thì Capifony là dành cho bạn, cũng chỉ cần config vài dòng là bạn có thể có được một tool deploy tự động với các bước chính xác từng centimet.

Để sử dụng được Capifony rất đơn giản, chỉ cần local bạn có ruby, chạy lệnh install gem install capifony, vào project nhập lệnh capifony ., file deploy.rb tự động thêm vào thư mục app/. Bạn cần đọc thêm một số tài liệu từ Capifony để có thể chỉnh sửa và bắt đầu deploy.

File deploy.rb của mình tương tự như bên dưới để bạn có thể làm mẫu.

Đoạn code này sẽ làm việc tốt với đoạn cấu hình deployment từ file circle.yml. Sẽ giúp bạn deploy ngay lập tức sau khi code mới được merge vào từ master sau khi qua các bước tích hợp và kiểm thử testing.

Với bài viết trên, mình chỉ giới thiệu một khía cạnh đơn giản về Continuous Deloyment là làm thế nào nó hoạt động tốt với một project vừa và nhỏ. Còn rất nhiều khuyết điểm khi ứng dụng vào thực tế như:

  • Chẳng ai tin tưởng hoàn toàn mà push code từ master lên thẳng production.

  • Chưa giải quyết cho các bài toán về load balancer

Nhưng cứ làm đi rồi mình sẽ improve, nếu không làm thì sẽ không bao giờ biết. nhỉ :D!