Đây là chủ đề nhận được khá nhiều sự
quan tâm thời gian gần đây, đặc biệt qua hai sự kiện gần nhất của ITLC.
Tuy rằng có nhiều người quan tâm và biết đến DevOps nhưng qua hai sự
kiện này, theo đánh giá cá nhân, lượng người “thực sự hiểu biết” không
nhiều, đa phần mọi người đánh đồng DevOps và CD; bài viết này mong cung
cấp một số thông tin giúp hiểu đúng về DevOps và CD.
CD: Continuous Delivery hay Continuous Deployment?
Những nhóm phát triển phần mềm theo
phương pháp Agile thường quen thuộc với kỹ thuật / công cụ tích hợp liên
tục (Continuos Integration – CI) nhằm liên tục tích hợp phần tăng
trưởng được tạo ra vào sản phẩm giúp kiểm soát tình hình thông qua thực
hiện kiểm thử (đặc biệt là integration test, regession test) khiến sản
phẩm đạt sự ổn định. Đây là một kỹ thuật / công cụ được thực hiện trong
giai đoạn phát triển (development).
Bên cạnh CI, mọi người hay nói đến CD,
nhưng lại không thực sự hiểu CD từ viết tắt của Continuous Delivery hay
Continuous Deployment và cũng thường cho rằng hai khái niệm này là giống
nhau. Thực tế là:
Continuous Delivery, giống như CI là
một tập hợp những kỹ thuật / công cụ đảm bảo việc triển khai
(deployment) được thành công bằng việc liên tục chuyển giao (delivery)
những phần tích hợp lên môi trường staging (thường là rất giống với môi
trường production). Bằng việc liên tục kiểm thử trong môi trường
staging, phần mềm đảm bảo đủ chất lượng để deploy qua production; những
deployable artifact này vẫn chỉ tồn tại trên staging và không được
deploy tự động qua production.
Continuous Deployment, đúng như tên
gọi, là một tập hợp những kỹ thuật / công cụ đảm bảo việc tự động hoá
toàn bộ quá trình từ development đến production. Continuous Deployment được coi là bước phát triển của Continuous Delivery, hoàn tất giai đoạn chuyển giao đến người dùng cuối.
Có thể so sánh CI, CD đơn giản thế này:
- Continuous Integration: Tập trung vào source code, tạo sự “tự tin” về source code qua unit test, integration test, tạo ra staging-ready-artifact.
- Continuous Delivery: Tập trung vào artifact và môi trường (environment), tạo sự “tự tin” về deployable-artifact qua acception test, tạo ra production-ready-artifact.
- Continuous Deployment: Tập trung vào người dùng cuối, tạo ra production-deployed.
Vậy: Continuous Delivery hay Continuous Deployment?
Nhưng tóm lại là Continuous Delivery và Continuous Deployment khác gì nhau?
Rất nhiều người vẫn bị nhập nhằng giữa 2 nguyên tắc này. Lý do là: nếu
staging là môi trường giống với production, thì khi đã làm được
Continuous Delivery thì đương nhiên chúng ta cũng làm được Continuous
Deployment (đều là deploy qua 1 môi trường, vậy thôi). Đúng. Về mặt kỹ
thuật là như vậy. Vì vậy, những công cụ như Pupet, Octopus, Ansible… đều
được sử dụng cho CD (còn ai hiểu CD là gì thì tuỳ ngữ cảnh, deploy tới
staging thì là Delivery; deploy tới production thì là Deployment). Nhưng
công cụ không phải thứ quan trọng nhất.
Thứ nhất, staging không phải production.
Dù chỉ cần 1 cấu hình đơn giản là artifact được deploy qua bất cứ đâu.
Nhưng chúng ta có đủ “tự tin” để việc deploy qua production được thực
hiện tự động?
Thứ hai, staging vẫn không phải là production. Production luôn cần ổn định và mong muốn zero-down-time, staging thì không cần thiết.
Với những single-user-app như ứng dụng
chạy trên PC, mobile… thì khá đơn giản, tôi không bàn tới. Với web app,
các tổ chức thường dè dặt trong việc triển khai Continuous Deployment vì
những lý do trên.
Về lý do thứ nhất, tổ chức chỉ có thể
thực hiện Continuous Deployment khi hệ thống QA được thực hiện tự động
hoặc “gần như tự động” với phần tích hợp để chắc chắn rằng sản phẩm đủ
chất lượng và triển khai đúng thời điểm một cách tự động – đây là vấn đề
tương đối phức tạp.
Về lý do thứ hai, cách làm phổ biến là sử dụng kỹ thuật “blue-green deployment”,
deploy lần lượt từng phần hệ thống với HAproxy đứng trước nhằm đảm bảo
traffic được route tới những phần đã được deploy thành công (green,
version mới); trước đó traffic được route tới những thành đã chạy ổn
định (blue, version cũ). Vấn đề sẽ trở nên phức tạp khi phần green và
blue có nhiều sai khác về business logic dẫn đến không toàn vẹn dữ liệu.
Đây là một trong những cản trở lớn nhất khiến tổ chức không “tự tin”
với việc deploy tự động (tôi sẽ trình bày trong một bài viết khác).
DevOps
Như bạn thấy, CD dù là Continous
Delivery hay Continuous Deployment thì vấn đề phức tạp không phải là kỹ
thuật hay công nghệ. Và DevOps cũng vậy.
Việc liên tục triển khai dẫn đến nhu cầu
cộng tác chặt chẽ giữa nhóm phát triển (development) và nhóm vận hành
(operation) và cách phân chia tổ chức theo nhóm chức năng (functional
team) trở nên lỗi thời; cách làm việc liên chức năng (cross-functional)
sẽ hiệu quả hơn rất nhiều. Và đó là DevOps. DevOps = Development + QA + Operation.
Như vậy DevOps thực sự là sự chuyển đổi
trong tổ chức về cách làm, văn hoá (trong cách tổ chức nhóm, cộng tác…)
và kỹ thuật, công nghệ nhằm linh hoạt hơn và nhanh chóng phản ứng với sự
thay đổi xuyên suốt quá trình từ phát triển tới triển khai đến tay
người dùng cuối với chất lượng đảm bảo một cách nhanh nhất.
Tại sao DevOps phức tạp? Vì
DevOps thực sự tạo ra một văn hoá cộng tác để chuyển giao sản phẩm theo
cách mới. Theo quy trình phát triển phần mềm cổ điển, các nhóm
development, QA, operation hoạt động rất riêng biệt với những kỹ năng,
văn hoá khác nhau. Giờ đây họ đứng cùng nhau với một mục tiêu chung và
một văn hoá chung. Điều này không thể có trong một thời gian ngắn.
Tại sao DevOps thông thường nhanh thành công hơn trong môi trường Linux? Tôi lưu ý là thông thường.
Vì thông thường, nhóm opeartion sử dụng Linux quen thuộc hơn với việc
sử dụng câu lệnh, lập trình (viết script…); so với Windows, nhóm sử dụng
công cụ đồ hoạ để cấu hình. Và CI, CD nói chung làm việc nhiều với dòng
lệnh.
Một nhóm toàn developer có thể thực hành DevOps? Hôm trước, anh Trịnh Minh Cường có nói rằng “nhóm của anh toàn dev, làm DevOps tốt”.
Đúng, vì bản thân nhóm phát triển đã có thể build, run phần mềm trên
môi trường local thì hoàn toàn có thể triển khai đến production và CD là
điều nằm trong tầm tay. Nhưng đó mới chỉ là kỹ thuật. Developer thường
không có kiến thức về hệ thống, vận hành như operator. Đơn giản như cấu
hình quyền thư mục, chmod 777 giúp họ chạy, test hoàn toàn tuyệt vời
trên local nhưng sẽ là thảm hoạ trên production. Chính vì vậy, tổ chức
cần sự kết hợp kiến thức, kỹ năng của cả developer, QA, operator để
triển khai DevOps thành công.
Và xu thế?
Trong bài nói chuyện của CTO Automic tại ITLC, có nói đến heuristic CD khiến tôi liên hệ tới 2 xu thế chính hiện nay.
Một là, tính agility được mở rộng theo bề ngang của tổ chức.
Bắt đầu bởi Agile software development; tiếp đến là DevOps khiến Dev và
Ops gắn kết hơn; tiếp đến là NetOps khiến Net và Ops (thậm chí là
Dev-Ops-Net) gắn kết hơn.
Hai là, tính agility được nâng cao dần.
Bắt đầu bởi manual delivery / deployment; tiếp đến là CD khiến việc
delivery / deployment tự động; tiếp đến là heuristic CD khiến việc
delivery / deployment tự động ở mức độ “thông minh” hơn, tự động nhưng
đúng thời điểm và có “trí tuệ” như manual delivery / deployment.
Những vấn đề này hơi phức tạp một chút,
hy vọng tôi có thể trở lại trong một bài viết gần. Ngoài ra, bạn có thể
tham khảo những bài viết ở dưới:
http://martinfowler.com/bliki/BlueGreenDeployment.html
Cảm ơn các bạn bên gurunh.
Cơm thêm: bài nói chuyện DevOps của chị Nicole Forsgren tại Goto 2015, Berlin
Bài gốc ở đây
No comments:
Post a Comment