Jenkins là gì? Mô hình kiểm tra code tự động nổi tiếng
Jenkins là một phần mềm tích hợp liên tục được sử dụng nhiều trong lĩnh vực phát triển phần mềm. Jenkins giúp người dùng có thê phát triển nhanh chóng mã nguồn một cách tự động hóa. Để giúp bạn đọc có thể hiểu hơn về phần mềm này hãy cùng Bizfly Cloud tìm hiểu ngay qua bài viết dưới đây.
Jenkins là gì?
Jenkins là một công cụ mã nguồn mở tự động nhiều giai đoạn trong vòng đời phát triển phần mềm. Công cụ này hỗ trợ việc build, test và deploy ứng dụng trên nhiều môi trường, trở thành một thành phần quan trọng trong các quy trình CI/CD.
- Tự động hóa: Tự động triển khai các tác vụ lặp đi lặp lại như build, test và deploy.
- Khả năng mở rộng: Hơn 1800 plugin để tích hợp với nhiều công cụ khác nhau như Docker, Kubernetes, Selenium và Git.
- Người dùng có thể tự do hơn trong phát triển phần mềm: Hỗ trợ nhiều ngôn ngữ lập trình và công nghệ khác nhau, bao gồm Java, Python, JavaScript, v.v.
- Dễ dàng thiết lập: Cung cấp giao diện GUI dạng website thân thiện để cấu hình.
- Kiến trúc Master-Slave: Cho phép xây dựng mô hình phân tán để cải thiện hiệu suất và khả năng mở rộng.
Lịch sử hình thành và phát triển của Jenkins
Jenkins là một nhánh phát triển từ một dự án tên là Hudson, một dự án mà sau đó thuộc về Oracle. Về sau, Hudson được chuyển giao cho Eclipse Foundation và hiện không còn được phát triển nữa. Trong khi đó, Jenkins hiện được quản lý như một dự án mã nguồn mở dưới sự điều hành của CD Foundation, một tổ chức thuộc Linux Foundation.
Continuous Integration (CI) cũng đã phát triển nhiều kể từ khi ra đời. Trước đây, tiêu chuẩn phổ biến là build hằng ngày. Còn hiện nay, nguyên tắc thường thấy là mỗi thành viên trong team sẽ gửi phần công việc của mình - gọi là một commit - mỗi ngày hoặc thường xuyên hơn, và hệ thống sẽ thực hiện build với mỗi thay đổi quan trọng.
Continuous Integration mang lại nhiều lợi ích, chẳng hạn như cung cấp phản hồi liên tục về trạng thái của phần mềm. Vì CI giúp phát hiện vấn đề từ rất sớm trong quá trình phát triển, nên các lỗi thường sẽ nhỏ hơn, ít phức tạp hơn và dễ khắc phục hơn.
Jenkins được sử dụng để làm gì?
Trong DevOps Jenkins là một công cụ thiết yếu, bởi ở góc độ kỹ thuật, công cụ hỗ trợ tự động hóa nhiều quy trình trong suốt quá trình phát triển phần mềm từ đầu đến cuối.
Tự động build và kiểm tra chất lượng code
Đầu tiên là khả năng tự động hóa việc build code mỗi khi có sự thay đổi. Thay vì developer phải tự triển khai thủ công như trước kia, thì có thể cấu hình Jenkins để lấy source code từ Git, cài đặt dependency, biên dịch dự án, chạy test, review code.
Jenkins tích hợp với nhiều framework và tool kiểm thử khác nhau (Maven, Gradle, npm, SonarQube, JUnit hay ESLint), cùng nhau tự động hóa việc thực hiện unit test, test tích hợp và end-to-end test. Nó sắp xếp các trường hợp test, cho phép tạo test report và cảnh báo cho các developer về các lỗi kiểm thử, giúp phát hiện lỗi sớm và đảm bảo chất lượng code luôn được duy trì trong suốt quá trình phát triển.
Tự động triển khai ứng dụng theo môi trường
Trong quá trình phát triển, ứng dụng sẽ được phát triển trên nhiều môi trường khác nhau: Development, Testing, Staging, Production. Mỗi môi trường có thể có cấu hình, biến môi trường và quy trình phê duyệt riêng. Để tránh sai sót từ việc thao tác thủ công, Jenkins sẽ chuẩn hóa ứng dụng trên các môi trường khác nhau để đảm bảo việc triển khai diễn ra đồng bộ.
Các công việc trong development mà Jenkins có thể hỗ trợ bao gồm: triển khai ứng dụng lên máy chủ, build và đẩy Docker image, triển khai lên Kubernetes, chạy script cấu hình môi trường, rollback khi triển khai lỗi. Jenkins có thể kết hợp với các công cụ Ansible, Docker, Kubernetes, Helm hoặc các cloud platform để tự động triển khai pipeline (ví dụ: triển khai Jenkins trên Bizfly Cloud Kubernetes để tự động nhiều khâu deploy ứng dụng).
Chuẩn hóa quy trình CI/CD
Continuous Integration (CI)
Mục tiêu cốt lõi của Jenkins là tự động hóa quy trình CI (Continuous Integration) - tức là liên tục tích hợp các thay đổi source code từ nhiều lập trình viên vào một repository chung.
Continuous Delivery (CD)
Jenkins XML không chỉ dừng lại ở CI, có nghĩa là nó không chỉ phục vụ cho quá trình tích hợp liên tục mà còn hỗ trợ tự động hóa quá trình đưa các thay đổi lên môi trường production một cách ổn định và hiệu quả. Nó điều phối các pipeline triển khai, từ đóng gói artifact đến chuẩn bị môi trường, thực thi các script triển khai, phân phối các bản cập nhật và đưa chúng vào hoạt động một cách trơn tru. Nói cách khác, Jenkins giúp điều phối toàn bộ deployment pipeline.
Nhờ Jenkins, doanh nghiệp có thể thiết lập một quy trình chuẩn mà mọi dự án đều tuân theo. Điều này đặc biệt quan trọng khi team lớn hoặc có nhiều nhóm phát triển song song. Jenkins Pipeline cho phép mô tả toàn bộ quy trình CI/CD dưới dạng code thông qua Jenkinsfile. Điều này giúp dễ version control, dễ review và dễ tái sử dụng.
Tích hợp chuỗi công cụ DevOps
Jenkins cung cấp khả năng tích hợp mạnh mẽ với hệ thống công cụ DevOps thông qua plugin. Với ưu điểm này giúp Jenkins có thể hỗ trợ tốt đa dạng mô hình phát triển ứng dụng, từ ứng dụng monolithic truyền thống đến hệ thống microservices hiện đại. Doanh nghiệp cũng dễ dàng tận dụng các công cụ sẵn có, dễ dàng mở rộng, tùy chỉnh theo nhu cầu, phát triển liền mạch từ đầu tới cuối quy trình.
Một số nhóm công cụ Jenkins thường tích hợp
- Quản lý mã nguồn: GitHub, GitLab, Bitbucket
- Build tools: Maven, Gradle, Ant, npm
- Kiểm thử: JUnit, Selenium, Cypress
- Phân tích chất lượng mã nguồn: SonarQube
- Container: Docker
- Orchestration: Kubernetes
- Thông báo: Slack, Email, Microsoft Teams
- Quản lý artifact: Nexus, Artifactory
- Hạ tầng cloud: ví dụ Bizfly Cloud
Chạy build phân tán để tăng tốc
Trong các dự án lớn, việc chỉ chạy trên một máy chủ duy nhất có thể cản trở thời gian hoàn thành. Khi này, Jenkins sẽ hỗ trợ mô hình phân tán master-agent hoặc controller-agent. Trong đó, Jenkins đóng vai trò trung tâm điều phối, còn các agent sẽ thực hiện tác vụ trên nhiều máy khác nhau. Ví dụ, agent cho Java build, agent cho Node.js, agent chạy test trên Windows,… Hỗ trợ này góp phần rút ngắn phát triển nhờ chạy nhiều tác vụ song song, dễ dàng mở rộng quy mô khi khối lượng công việc tăng, tận dụng tài nguyên máy chủ dư thừa.
Hudson và Jenkins

Hudson và Jenkins
Năm 2004, Kohsuke Kawaguchi - một nhà phát triển Java tại Sun vào một ngày cảm thấy mệt mỏi vì các bản dựng của mình thường xuyên bị phá bỏ và muốn tìm cách biết, trước khi đưa code vào kho lưu trữ, liệu code có hoạt động hay không. Vì vậy, Kawaguchi đã xây dựng một hệ thống server tự động hóa cho chính server và cho Java cho phép kiểm tra tình trạng code trước khi đưa vào kho, được gọi là Hudson. Hudson trở nên phổ biến tại Sun và lan sang các công ty khác dưới dạng nguồn mở.
Đến năm 2011, tranh chấp giữa Oracle (sau khi mua lại Sun) và cộng đồng nguồn mở Hudson độc lập đã dẫn đến một hướng khác với việc thay đổi tên thành Jenkins. Cả Hudson và Jenkins đều tiếp tục tồn tại, mặc dù Jenkins có phần phổ biến hơn. Năm 2014 Kawaguchi trở thành CTO của CloudBees, một công ty cung cấp các sản phẩm dựa trên nền tảng Jenkins.
Mô hình tự động Jenkins
Hiện nay Jenkins là máy chủ nguồn mở tự động hàng đầu với khoảng 1.400 plugin hỗ trợ tự động hóa tất cả các tác vụ phát triển. Vấn đề mà ban đầu Kawaguchi cố gắng khắc phục, tích hợp và phân phối mã Java liên tục (nghĩa là xây dựng dự án, chạy thử nghiệm, phân tích mã tĩnh và triển khai) chỉ là một trong số rất nhiều quy trình chúng ta có thể tự động hóa bằng Jenkins. 1.400 plugin này bao gồm 5 lĩnh vực: nền tảng, UI - giao diện người dùng, quản trị, quản lý mã nguồn và nhiều nhất là quản lý xây dựng, kiến trúc.
Một số khái niệm cốt lõi khác của Jenkins
Jenkins là công cụ được tích hợp liên tục và phân phối liên tục. Sau đây là một số khái niệm cốt lõi trong Jenkins:
Jenkins Controller
Jenkins Controller là máy chủ chính của Jenkins. Nó chịu trách nhiệm quản lý toàn bộ hệ thống Jenkins, bao gồm việc lập lịch các công việc, giám sát Jenkins Agents và hiển thị giao diện người dùng cho người dùng Jenkins. Jenkins Controller cũng chứa các thông tin cấu hình và lưu trữ các kết quả xây dựng.
Jenkins Agent
Jenkins Agent là các máy chủ phụ được Jenkins Controller chỉ đạo để thực hiện các công việc. Các Agent có thể chạy trên các máy chủ vật lý, máy ảo hoặc trong container. Jenkins Controller sẽ phân phối các công việc tới các Agent, và các Agent sẽ thực hiện các công việc đó rồi báo cáo lại kết quả cho Controller.
Jenkins Node
Trong Jenkins, một Node là một máy chủ cụ thể trong kiến trúc Jenkins. Node có thể là một Jenkins Controller hoặc một Jenkins Agent. Node là nơi các công việc được thực hiện. Jenkins Controller phân phối các công việc tới các Node phù hợp dựa trên cấu hình và khả năng của từng Node.
Jenkins Project
Jenkins Project là một định nghĩa của một quy trình xây dựng phần mềm. Mỗi Project chứa các cấu hình và các bước cần thiết để xây dựng, kiểm tra, triển khai phần mềm. Các loại Project phổ biến bao gồm Freestyle Project, Maven Project, và Pipeline Project.
Jenkins Plugins
Jenkins Plugins là các phần mở rộng có thể cài đặt vào Jenkins để bổ sung hoặc mở rộng chức năng của Jenkins. Plugins có thể cung cấp hỗ trợ cho các hệ thống kiểm soát phiên bản như Git, Subversion, hệ thống xây dựng, thông báo và nhiều tính năng khác. Plugins đóng vai trò quan trọng trong việc tùy chỉnh và mở rộng khả năng của Jenkins để phù hợp với nhu cầu cụ thể của các dự án.
Jenkins Pipeline
Jenkins Pipeline là một tính năng mạnh mẽ của Jenkins cho phép định nghĩa các quy trình CI/CD bằng mã. Pipeline sử dụng một ngôn ngữ kịch bản gọi là Groovy để viết các script định nghĩa các bước của quy trình xây dựng, kiểm tra, và triển khai phần mềm. Pipeline có thể được chia thành hai loại chính đó là: Declarative Pipeline: Được viết theo cú pháp định nghĩa rõ ràng, dễ đọc, dễ viết và duy trì. Scripted Pipeline: Được viết bằng Groovy và có tính linh hoạt cao hơn nhưng cũng phức tạp hơn.
Jenkins hoạt động như thế nào?
Jenkins được cung cấp như các gói lưu trữ Java 8 WAR và các gói cài đặt cho các hệ điều hành phổ biến, dưới dạng gói Homebrew, hình ảnh Docker và mã nguồn. Mã nguồn chủ yếu là Java, gồm một vài tệp Groovy, Ruby và Antlr.
Bạn có thể chạy độc lập Jenkins WAR hoặc dưới dạng một servlet trong máy chủ ứng dụng Java như Tomcat. Trong cả hai trường hợp, Jenkins sẽ tạo một giao diện người dùng web và chấp nhận các cuộc gọi đến API REST.
Khi bạn chạy Jenkins lần đầu tiên, chương trình sẽ tạo một tài khoản quản trị với mật khẩu ngẫu nhiên khá dài, bạn có thể patse mật khẩu này vào webpage ban đầu để unlock trình cài đặt.
Kiến trúc của Jenkins
Kiến trúc của Jenkins bao gồm nhiều thành phần và mô-đun khác nhau, giúp thực hiện các quy trình tích hợp và triển khai tự động hóa một cách hiệu quả.
Các nhà phát triển cam kết thay đổi mã nguồn, được lưu trữ trong kho lưu trữ. Máy chủ CI Jenkins kiểm tra kho lưu trữ theo các khoảng thời gian đều đặn và kéo bất kỳ mã mới nào có sẵn. Máy chủ Build xây dựng mã thành một tệp thực thi. Trong trường hợp xây dựng thất bại, phản hồi sẽ được gửi đến các nhà phát triển. Jenkins triển khai ứng dụng đã xây dựng lên máy chủ thử nghiệm.
Nếu thử nghiệm thất bại, các nhà phát triển sẽ được thông báo. Nếu mã không có lỗi, ứng dụng đã được thử nghiệm sẽ được triển khai trên máy chủ sản xuất. Các tệp có thể chứa mã khác nhau và rất lớn, đòi hỏi nhiều lần xây dựng. Tuy nhiên, một máy chủ Jenkins đơn lẻ không thể xử lý nhiều tệp và nhiều lần xây dựng cùng lúc; để làm được điều đó, cần có kiến trúc Jenkins phân tán.
Ưu, nhược điểm của Jenkins
Jenkins sở hữu các ưu và nhược điểm sau đây:
Ưu điểm
- Mã nguồn mở và miễn phí: Jenkins là một công cụ mã nguồn mở, có nghĩa là nó miễn phí và có một cộng đồng người dùng và phát triển mạnh mẽ hỗ trợ và cải tiến.
- Tích hợp đa nền tảng: Công cụ này có thể chạy trên nhiều hệ điều hành khác nhau như Windows, macOS, và Linux.
- Hỗ trợ Plugin phong phú: Có hơn 1.000 plugin có sẵn cho Jenkins, giúp tích hợp với hầu hết các công cụ phát triển phần mềm, từ các hệ thống kiểm soát phiên bản đến các nền tảng triển khai.
- Cộng đồng và hỗ trợ mạnh mẽ: Với một cộng đồng lớn, Jenkins có nhiều tài liệu, diễn đàn, và nhóm hỗ trợ. Bạn dễ dàng tìm thấy giải pháp cho các vấn đề phổ biến.
- Tích hợp dễ dàng với các công cụ khác: Jenkins có thể dễ dàng tích hợp với nhiều công cụ khác như Git, Maven, Docker, và Kubernetes, giúp quản lý các quy trình CI/CD hiệu quả hơn.
Nhược điểm
- Giao diện phức tạp: Giao diện người dùng của Jenkins có thể phức tạp và không thân thiện, đặc biệt đối với những người mới bắt đầu.
- Khó khăn trong quản lý plugin: Mặc dù có nhiều plugin hỗ trợ, việc quản lý và duy trì các plugin này có thể trở nên phức tạp và gây xung đột.
- Cấu hình phức tạp: Thiết lập và cấu hình Jenkins lần đầu có thể phức tạp và đòi hỏi kiến thức kỹ thuật sâu
- Hiệu suất và tài nguyên: Jenkins có thể tiêu tốn nhiều tài nguyên hệ thống, đặc biệt khi xử lý nhiều tác vụ cùng một lúc. Từ đó có thể gây ra các vấn đề về hiệu suất.
- Khả năng mở rộng hạn chế: Mặc dù Jenkins có thể mở rộng bằng các plugin và nút (nodes), việc quản lý một môi trường Jenkins lớn có thể trở nên phức tạp và đòi hỏi nhiều công sức.
- Bảo mật: Do đây là một công cụ mã nguồn mở và được sử dụng rộng rãi, nó cũng trở thành mục tiêu cho các cuộc tấn công. Việc duy trì bảo mật đòi hỏi phải cập nhật thường xuyên và cấu hình chính xác.
Các plugin trong Jenkins
Sau khi cài đặt, Jenkins cho phép bạn hoặc là chọn danh sách plugin mặc định hoặc là chọn plugin của riêng mình.
Khi bạn đã chọn bộ plugin ban đầu của mình, hãy nhấp vào nút Cài đặt và Jenkins sẽ thêm chúng vào.
Màn hình chính của Jenkins hiển thị các build queue hiện tại, trạng thái Executor, cung cấp các liên kết để tạo các mục mới (công việc), quản lý người dùng, xem lịch sử xây dựng, quản lý Jenkins, chế độ xem tùy chỉnh và quản lý thông tin đăng nhập.
Một mục Jenkins mới có thể là bất kỳ kiểu công việc nào trong sáu loại cộng thêm một thư mục để sắp xếp các mục bên trong.
Có 18 thao tác bạn có thể sử dụng trên trang Manage Jenkins, bao gồm tùy chọn mở giao diện dòng lệnh. Tuy nhiên, bạn cũng có thể cân nhắc các pipeline - các quy trình công việc nâng cao được xác định bởi các script.
Hướng dẫn tải và cài đặt Jenkins
Sau đây là các bước để tải và cài đặt Jenkins chi tiết:
Bước 1: Cài đặt Java
Jenkins yêu cầu Java để chạy. Hãy cài đặt Java Development Kit (JDK) nếu bạn chưa có. Mở terminal và chạy lệnh sau để cập nhật danh sách gói và cài đặt OpenJDK-> kiểm tra phiên bản java đã cài đặt.
Bước 2: Thêm khóa và nguồn của Jenkins vào hệ thống
Jenkins yêu cầu bạn thêm khóa của nó và thêm nguồn vào danh sách các nguồn của hệ thống.
Bước 3: Cài đặt Jenkins
Đầu tiên phải cập nhật danh sách gói một lần nữa, sau đó cài đặt Jenkins
Bước 4: Khởi động Jenkins
Sau khi cài đặt, hãy khởi động dịch vụ Jenkins. Cần đảm bảo Jenkins tự động khởi động mỗi khi hệ thống khởi động.
Bước 5: Mở cổng 8080
Mặc định Jenkins sẽ chạy trên cổng 8080. Bạn cần mở cổng này trên tường lửa để có thể truy cập từ trình duyệt.
Bước 6: Thiết lập Jenkins lần đầu
Mở trình duyệt và truy cập Jenkins. Bạn sẽ thấy một trang yêu cầu bạn nhập mật khẩu ban đầu. Mở terminal và lấy mật khẩu -> Dán mật khẩu vào trình duyệt và tiếp tục -> Chọn "Install suggested plugins" để cài đặt các plugin mặc định. Bạn cũng có thể chọn plugin tùy chỉnh theo nhu cầu -> Tạo tài khoản quản trị viên đầu tiên và tiếp tục cấu hình Jenkins.
.





















