Vai trò của Jenkins trong mô hình phát triển phần mềm Agile
agile, continuous integration system, jenkins, quy trinh phat trien phan mem, xu huong phat trien phan mem
Vai trò của Jenkins trong mô hình phát triển phần mềm Agile
1. GIỚI THIỆU HỆ THỐNG TÍCH HỢP LIÊN
TỤC VỚI JENKINS
Lâm Minh Trí
(minhtri.itp@gmail.com)
TP.Hồ Chí Minh, ngày 20 tháng 01 năm 2014
2. Page1
MỤC LỤC
MỤC LỤC......................................................................................................................................................... 1
1. TỔNG QUAN ............................................................................................................................................... 2
2. GIỚI THIỆU HỆ THỐNG TÍCH HỢP LIÊN TỤC ...................................................................................... 2
2.1. Định nghĩa hệ thống tích hợp liên tục (Continuous Integration)............................................................ 2
2.2. So sánh mô hình phát triển phần mềm truyền thống (waterfall) và agile............................................... 4
2.3. Mô hình phát triển phần mềm Agile (với mô hình cụ thể Scrum).......................................................... 6
2.4. Thực tiễn của hệ thống tích hợp liên tục (Practices of Continuous Integration) .................................... 6
2.5. Khó khi áp dụng hệ thống tích hợp liên tục............................................................................................ 7
2.6. Tại sao cần hệ thống tích hợp liên tục? .................................................................................................. 7
3. GIỚI THIỆU JENKINS ................................................................................................................................ 8
3.1. Giới thiệu................................................................................................................................................ 8
3.2. Đặc điểm của Jenkins ............................................................................................................................. 8
3.3. Vai trò của Jenskin trong CI................................................................................................................... 8
3.4. Lợi ích của Jenkins mang lại ................................................................................................................ 10
3.5. Cài đặt – demo...................................................................................................................................... 10
4. KẾT LUẬN ................................................................................................................................................. 11
4.1. Loại dự án nào nên áp dụng Jenkins?................................................................................................... 11
4.2. Chúng ta kết hợp các công cụ hiện tại đang được sử dụng thông qua Jenkins như thế nào? .............. 11
4.3. Lợi ích mang lại.................................................................................................................................... 11
5. TÀI LIỆU THAM KHẢO (References)...................................................................................................... 13
3. Page2
1. TỔNG QUAN
Trong số chúng ta có lẽ đã từng thắc mắc với các hệ thống phần mềm cập nhật phiên bản liên tục hàng giờ,
hàng ngày thì họ đã làm điều đó như thế nào và tại sao có phiên bản liên tục và có phiên bản stable? Chúng
ta thử hình dung trong quy trình phát triển của một opensource, mã nguồn được viết bởi cộng đồng và được
tích hợp liên tục vào bất kỳ thời điểm nào trong ngày. Vậy thì làm thế nào họ có thể kiểm soát được lỗi của
phần mềm trong khi đó các phiên bản vẫn điều đặn được xuất bản ra cộng đồng? Các quá trình hotfix lỗi và
nhận phản hồi từ cộng đồng người sử dụng, cải tiến mở rộng tính năng được lặp lại liên tục.
Chúng ta đã quen với việc sử dụng các trong công cụ quản lý source code ( SVN, GIT, VSS,CSV,..), các
công cụ quản lý lỗi (redmine, mantis, testlink), các công cụ build (MS build, Nant,…), các công cụ test tự
động (Junit, Nunit,CppUnit,..),…Việc kết hợp tất cả các công cụ này thành một quy trình tự động và khép
kín sẽ mang lại hiệu quả gì cho chúng ta? Và việc kết hợp này sẽ được thực hiện như thế nào?
Phần tiếp theo sẽ phần nào giải đáp các vấn đề trên.
2. GIỚI THIỆU HỆ THỐNG TÍCH HỢP LIÊN TỤC
2.1. Định nghĩa hệ thống tích hợp liên tục (Continuous Integration).
• Tích hợp liên tục là một hoạt động phát triển phần mềm mà ở đó các thành viên của một
nhóm sẽ tích hợp công việc của họ với nhau liên tục, thường thì các thành viên tích hợp
công việc ít nhất mỗi lần trong ngày, dẫn đến có nhiều sự tích hợp trong ngày. Mỗi sự tích
hợp như vậy sẽ được kiểm tra bởi một công cụ build tự động (bao gồm test) để phát hiện ra
những lỗi tích hợp càng sớm càng tốt.
• Phần mềm phát triển theo mô hình Agile còn được gọi là phần mềm tích hợp liên tục
(Continuous Integration ).
5. Page4
2.2. So sánh mô hình phát triển phần mềm truyền thống (waterfall) và agile
Waterfall and Similar
Methodology
Agile and Similar Methodology
Hướng kế hoạch (plan –
driven)
Chỉ phù hợp khi yêu cầu
khách hàng không thay đổi
hoặc ít khi thay đổi.
Tạo ra phần mềm nhưng chưa
biết được giá trị sử dụng
(không đúng yêu cầu?).
Mất nhiều thời gian và chi phí
cho việc quay lại để chỉnh sửa
ở các giai đoạn trước.
Thường trễ tiến độ do kế
hoạch không sát với yêu cầu
và khi yêu cầu thay đổi.
Rủi ro cao.
Hướng giá trị (value – driven).
Chấp nhận thay đổi và cho phép
xử lý thay đổi nhẹ nhàng và nhanh
chóng.
Chia nhỏ để xử lý và xác định
được kết quả qua từng sprint. Quá
trình chia nhỏ xử lý được lặp lại
cho đến khi sản phẩm hoàn tất.
Tạo ra phần mềm có giá trị và
được triển khai cho khách hàng sử
dụng một cách sớm nhất có thể.
Thường xuyên giao tiếp và nhận
phản hồi từ phía khách hàng.
Liên tục cải tiến cho các giai đoạn
print sau.
Giảm thiểu rủi ro.
6. Page5
Mô hình:
Waterfall and Similar
Methodology
Others Agile and Similar
Methodology
Incremental
Spiral
Cocomo
Cocomo II
RAD
RUP
…
Minh họa khả năng giảm thiểu rủi ro của mô hình Agile so với Waterfall:
7. Page6
2.3. Mô hình phát triển phần mềm Agile (với mô hình cụ thể Scrum)
Có rất nhiều biến thể của Agile để phù hợp với từng dự án cụ thể và phù hợp với điều kiện môi trường phát
triển của mỗi công ty. Tuy nhiên tất cả điều dựa trên các mục đích chính của dự án là phát triển và triển khai
nhanh chóng sản phẩm đến khách hàng với mức độ hài lòng cao nhất và rủi ro là thấp nhất qua mỗi giai đoạn
(hoàn thành đóng gói nhóm chức năng của mỗi giai đoạn). Khách hàng có thể dùng và góp ý về sản phẩm
một cách sớm nhấtcó thể. Qua mỗi giai đoạn nhóm dự án có thể hiệu chỉnh rút kinh nghiệm và cải tiến phù
hợp với yêu cầu của khách hàng hơn vì vậy ở những giai đoạn sau được kế thừa kinh nghiệm của những giai
đoạn trước nên năng suất và hiệu quả công việc của đội dự án được tăng lên, mức độ hài lòng của khách
hàng cũng được đáp ứng một cách tốt nhất có thể.
Và một trong số mô hình cụ thể của Agile được áp dụng phổ biến hiện nay đó là Scrum.
Về chi tiết mô hình này vui lòng tham khảo quy trình sản xuất phần mềm của trung tâm (QT04)
2.4. Thực tiễn của hệ thống tích hợp liên tục (Practices of Continuous Integration)
Quản lý phiên bản (source control and version control ).
Tự động build bao gồm test (tự động test).
Đôi ngũ phát triển thường xuyên chuyển (commit) source về nơi lưu trữ chính (mainline).
Mỗi khi code có thay đổi sẽ build lại (mainline) thông qua build server.
Báo lỗi cho người lập trình gây lỗi và quản lý dự án.
Phát hành phiên bản hoàn chỉnh cho khách hàng khi không còn lỗi tính hợp.
Tự động phân phối phiên bản mới đến khách hàng bằng một quy trình tự động khép kín.
Mọi người có thể nhìn thấy những gì đã xảy ra (thay đổi, lỗi…) để xem xét và giải quyết
một cách minh bạch.
8. Page7
2.5. Khó khi áp dụng hệ thống tích hợp liên tục
Khó khăn:
Cần thời gian thiết lập hệ thống ban đầu.
Đòi hỏi quản lý dự án, người lập trình, người kiểm thử phải am hiểu mô hình phát triển phần
mềm Agile, hệ thống tích hợp CI, cách sử dụng các công cụ hỗ trợ cho Agile và CI.
Chi phí thiết bị phần cứng (các server cho CI).
2.6. Tại sao cần hệ thống tích hợp liên tục?
Giảm thiểu rủi ro do lỗi được phát hiện sớm.
Giảm thiểu sự lặp lại cho các quá trình (phân tích, thiết kế, lập trình khi sản phẩm không
đúng yêu cầu hoặc yêu cầu thay đổi).
Tạo phần mềm có giá trị sử dụng sớm nhất có thể và sẳn sàng triển khai mọi lúc mọi nơi.
Cung cấp cái nhìn xuyên suốt tổng quan và cụ thể cho từng giai đoạn.
Nâng cao kỹ năng của đội ngũ nhân viên phát triển phần mềm.
Cải thiện chất lượng phần mềm.
9. Page8
3. GIỚI THIỆU JENKINS
3.1. Giới thiệu
Là một ứng dụng web application mã nguồn mở (được cộng đồng phát triển theo giấy phép
MIT) đóng vai trò máy chủ build & test của hệ thống tích hợp liên tục.
Jenkins được viết bằng Java nên có thể kết hợp được với hầu hết các công cụ khác của hệ
thống tích hợp liên tục với nhiều nền tảng khác nhau.
Tiền thân là Hudson được viết bởi Kosuke Kawaguchi tại Sun, kể từ khi Sun được mua lại
bởi Oracle vào năm 2010, một bộ phận phát triển Hudson đã tách ra phát triển riêng và được
đặt tên là Jenkins.
Được sử dụng rộng rãi và được phát triển cải tiến liên tục bởi cộng đồng mã nguồn mở.
Đạt nhiều giải thưởng :InfoWorld Bossies Award, 2011 O'Reilly Open-Source Award, 2011
ALM&SCM, SDTimes 100, 2010, 2011 ,GlassFish Community Innovation Award 2008,
Duke's Choice Award 2008
Được các tổ chức lớn tin dùng: Ebay,Apache, NASA,Boeing,Mozilla, Linked in,…
3.2. Đặc điểm của Jenkins
Hỗ trợ đầy đủ nhất các tính năng tự động hóa của hệ thống tích hợp liên tục bằng việc kết
hợp giữa các thành phần mở rộng (so với các công cụ khác).
Dễ dàng cài đặt và sử dụng.
Đa nền tảng.
Hỗ trợ cho nhiều công nghệ phát triển phần mềm (JAVA, .NET, PHP, CPP Ruby,…).
Được sử dụng rộng rãi.
Dễ dàng tùy chỉnh mở rộng.
Dễ dàng liên kết với các công cụ khác của hệ thống tích hợp liên tục thông qua các plug in.
Miễn phí
3.3. Vai trò của Jenskin trong CI
Là CI server (build & test server) giữ vị trí trung tâm “trái tim” cho mọi hoạt động của hệ
thống.
10. Page9
Giúp khép kín quy trình phát triển phần mềm một cách tự động.
- Nhờ vào việc hỗ trợ đa nền tảng, công nghệ Jenkins giúp khép kín quy trình phát
triển phần mềm một cách tự động theo mô hình Agile nói chung và hệ thống tích
hợp liên tục nói riêng.
- Với hơn 400 plugin và được phát triển thêm không ngừng Jenkins đã trở thành trợ
thủ đắc lực cho hệ thống CI.
- Với hệ thống plugin phong phú và đa dạng cho phép chúng ta có nhiều lựa chọn kết
hợp và điều tuyệt vời hơn là hầu hết chúng đều là mã nguồn mở miễn phí và tốt nhất
hiện nay.
JENKINS
11. Page10
3.4. Lợi ích của Jenkins mang lại
Tất cả với Jenkins hầu như là tự động.
Giảm thời gian và chi phí cho quá trình phát triển phần mềm.
Nâng cao năng lực nhân viên?
Có thể tóm gọn lợi ích Jenkins mang lại là mọi thứ tự động với:
Faster.
Easier.
Safer.
Smarter.
3.5. Cài đặt – demo
Sau đây sẽ hướng dẫn việc cài đặt và ứng dụng Jenkins trong việc build và publish 1 ứng dụng windows
aplication (Với công nghệ click one của microsoft cho phép publish một ứng dụng lên một webserver và cho
phép người dùng download và cài đặt phần mềm từ server đó. Một tính năng khác của click one là cho phép
ứng dụng tự động kiểm tra phiên bản và download và cài bản mới nhất nếu có sự đồng ý của người sử dụng)
JENKINS_Tutorial.doc main.build publish-template.html
12. Page11
4. KẾT LUẬN
4.1. Loại dự án nào nên áp dụng Jenkins?
Dự án phát triển theo mô hình Agile.
Ngoài ra các dự án thường xuyên build hotfix và có quá trình build cấu hình phức tạp (gồm nhiều project liên
quan với nhau và thứ tự các bước build cũng phải chính xác – Thông thường chỉ có một hoặc hai người trong
dự án có thể build và mất rất nhiều thời gian). Thay vì phải mất nhiều thời gian vào việc này chúng ta có thể
chỉ cần cấu hình một lần và mỗi khi build chỉ cần vào Jenkins nhấn build là toàn bộ các quá trình sẽ được
thực hiện theo đúng tuần tự. Hoặc có thể đặt chế độ build tự động.
4.2. Chúng ta kết hợp các công cụ hiện tại đang được sử dụng thông qua Jenkins như thế nào?
Chúng ta có thể kết hợp công cụ quản lý source (SVN), công cụ test tự động (JUnit, NUnit,PhpUnit,..) công
cụ test redmine/mantis , công cụ quản lý test case (testlink – là công cụ quản lý test case có thể kết hợp với
mantis và Jenkins), công cụ build (Ant, Nant, MSBuild,..) để khép kín quy trình tính hợp phần mềm.
Cụ thể quy trình kết hợp các công cụ cho quá trình tích hợp liên tục với Jenkins được đề xuất tại như sau:
Tiến trình được thực hiện theo thứ tự:
- Jenkins tổng hợp source của lập trình viên thông qua SVN.
- Jenkins sử dụng công cụ build (ant,nant, MSBuild) để build ứng dụng
- Jenkins sử dụng công cụ test unit để kiểm tra các unit test case đã pass hay chưa.
Report test case, bug qua (mantis, redmine, teslink)
- Nếu các test case đã pass thì thực hiện tiếp tiến trình publish ứng dụng ra deploy
server thông qua ftp server. Lưu trữ phiên bản code vào reversion server.
- Thông báo thành công thất bại của quá trình build đến đội dự án.
- Bên cạnh đó chúng ta có thể thực hiện các tiến trình phụ trong quá trình build như
(chạy các script SQL (store procedure, function) trong quá trình build với Jenkins)
4.3. Lợi ích mang lại
- Giảm được thời gian, resource cho việc build, test và deploy ứng dụng
JENKINSSVN JUNIT/NU
NIT
ANT/MS
BUILD
MANTIS
DEPLOY
SERVER
REDMINE TESTLINK
REVERSION SERVER
REPORTS
13. Page12
- Các test case với các công cụ test tự động được tái sử dụng trong suốt quá trình phát
triển sản phẩm.
- Quản lý reversion phiên bản một cách rõ ràng.
- Phát hiện lỗi tích hợp source code dễ dàng và nhanh chóng.
- Minh bạch công khai quá trình phát hiện và xử lý lỗi.
- Giảm thiểu rủi ro trong quá trình phát triển phần mềm khi kết hợp với mô hình phát
triển Agile.
14. Page13
-
5. TÀI LIỆU THAM KHẢO (References)
Jenkins-the-definitive-guide | John Ferguson Smart
Integrating PHP Projects with Jenkins|Sebastian Bergmann
Jenkins&TestLink|Bruno P. Kinoshita
http://jenkins-ci.org/