Tue. Apr 15th, 2025

CICD – Bài 1– CICD, các thành phần trong CICD và CICD workflow

By admin Oct 7, 2024
Picture 2
I.CI/CD LÀ GÌ?
1.CI là gì?

CI (viết tắt của Continuous Integration) được hiểu theo nghĩa “tích hợp liên tục”. Nó đòi hỏi các thành viên trong đội ngũ phát triển ứng dụng phải tích hợp công việc với nhau một cách liên tục, thường xuyên. Cần ít nhất 1 tích hợp mỗi ngày. Điều này nhằm giúp phát hiện các vấn đề phát sinh một cách nhanh nhất.

Việc sử dụng các CI sẽ giúp cho các nhà phát triển thúc đẩy quá trình triển khai, phát triển phần mềm nhanh hơn và hiệu quả hơn. Quy trình làm việc của CI diễn ra qua các bước như sau:

Các Developer sẽ push code và comit của họ lên repository.

Sau đó, CI Server thực hiện giám sát trên kho và kiểm tra tổng thể xem có vấn đề gì xảy ra không để có phương án xử lý kịp thời.

Trong trường hợp có vấn đề cần xử lý, CI server sẽ code mới ngay tại kho Repository rồi chuyển sang build, chạy các unit và integration test. Tiếp đến, CI server sẽ tạo và gửi các phản hồi lại cho từng thành viên trong team. Quá trình làm việc này diễn ra liên tục và xảy ra bất cứ thời điểm nào trong ngày.

2.CD là gì?

CD (viết tắt của Continuous Delivery) có nghĩa là chuyển giao liên tục. So với CI, thì CD thực hiện các nhiệm vụ cao cấp hơn. CD thực hiện việc kiểm tra tất cả những thay đổi về code được CI build và code trong môi trường kiểm thử.

Nó cho phép các Coder tự động hóa phần mềm testing và kiểm tra qua nhiều thước đo trước khi triển khai. Rất nhiều bài testing cần thực hiện như: UI testing, integration testing, API testing,…

CD sẽ sử dụng Deployment Pipeline để chia quy trình chuyển giao thành các giai đoạn nhỏ khác nhau. Từng giai đoạn sẽ có mục tiêu riêng, giúp xác minh chất lượng của các tính năng để tránh được các lỗi phát sinh gây ảnh hưởng tới quá trình trải nghiệm của người dùng.

3.Vậy CI/CD là gì?

Ảnh có chứa văn bản, vòng tròn, ảnh chụp màn hình, Phông chữ Mô tả được tạo tự động

Như đã tìm hiểu ở trên, CI là viết tắt của Continuous Integration (tích hợp liên tục), CD là viết tắt của Continuous Delivery (chuyển giao liên tục) hoặc Continuous Deployment (triển khai liên tục).

Vậy CI/CD LÀ GÌ?

CI/CD là một bộ đôi công việc bao gồm CI (Continuous Integration) và CD (Continuous Delivery), là quá trình tích hợp (Integration) thường xuyên, nhanh chóng hơn khi code cũng như thường xuyên cập nhật phiên bản mới (delivery).

CI/CD đã được áp dụng rộng rãi vào quy trình làm việc của các doanh nghiệp cùng với DevOps và Agile. Một quy trình CI/CD có thể được hình dung bao gồm các hành động sau: developer commit code; CI/CD tự động chạy build, test và deploy sản phẩm; chuyển giao sản phẩm tới người dùng cuối cùng.

II.CÁC THÀNH PHẦN TRONG CI/CD

CI/CD là một bộ đôi công việc bao gồm CI (Continuous Integration) và CD (Continuous Delivery), là quá trình tích hợp (Integration) thường xuyên, nhanh chóng hơn khi code cũng như thường xuyên cập nhật phiên bản mới (delivery). Do vậy trong một quy trình cần sự kết hợp của nhiều thành viên với nhau.

Ảnh có chứa văn bản, vòng tròn, ảnh chụp màn hình, Phông chữ Mô tả được tạo tự động

Các thành viên trong một quy trình triển khai CI/CD bao gồm: 

 Developer viết code, kiểm tra lỗi, commit và push code lên hệ thống quản lý mã nguồn (Git, GitLab, GitHub, Bitbucket…).
 Developer Leader/ Team Leader sẽ xem xét source code, đảm bảo code tuân thủ các chuẩn mực về coding, logic và hiệu suất, đồng thời đề xuất chỉnh sửa nếu cần.
 Security Engineer chạy các công cụ quét bảo mật (SAST) trên source code, quét các bản build các lỗi bảo mật nhằm phát hiện sớm các lỗ hổng bảo mật theo dõi các cảnh báo bảo mật và phát hiện sớm các hành vi bất thường.
 DevOps Engineer đảm bảo cấu hình chính sách quản lý branch và tích hợp các kiểm tra tự động vào pipeline CI, giúp kiểm tra code trước khi merge, lập và vận hành pipeline build bằng các công cụ như Jenkins, GitLab CI/CD, GitHub Actions hoặc CircleCI. Khi Developer commit code, hệ thống CI tự động kiểm tra, biên dịch (build) và thực hiện các kiểm tra tĩnh(ví dụ: lint, static analysis) để đảm bảo chất lượng code. Nếu phát hiện lỗi nghiêm trọng hoặc sự cố, hệ thống có thể tự động rollback phiên bản trước hoặc gửi thông báo cho Developer để can thiệp khắc phục.
 Engineering Manager/Tech Lead đánh giá tổng thể và quyết định merge code vào branch chính để hỗ trợ quá trình phát triển và kiểm thử.
 QA Engineer thực hiện các bài kiểm thử tự động như unit test, integration test, security test và performance test nhằm đảm bảo mã nguồn hoạt động đúng như mong đợi. Nếu bất kỳ bài test nào thất bại, pipeline CI/CD sẽ dừng lại và báo lỗi, cho phép Developer sửa lỗi trước khi tiếp tục.
III.QUY TRÌNH CI/CD CỤ THỂ TRONG PHÁT TRIỂN PHẦN MỀM

Quy trình CI/CD kết hợp tích hợp liên tục, phân phối và triển khai thành bốn giai đoạn chính: Source, Build, Test, Deloy.

CI/CD process stages: source, build, test, and deploy

Giai đoạn 1: Source

Developer thực hiện commit code và đẩy lên Git (GitLab, GitHub, Bitbucket). Tạo Merge Request (MR) từ nhánh feature vào nhánh develop hoặc tuân theo Git-Workflow được đặt ra.

Sau đó Manager/Team Lead duyệt và approve Merge Request. Khi MR được approve, GitLab CI hoặc Jenkins tự động trigger pipeline.

Giai đoạn 2: Build

Jenkins hoặc gitlab CI sẽ kết nối đến agent được chỉ định hoặc server dùng để build code thực hiện các kiểm tra được viết sẳn trong pipeline như:

 Unit Test: Dùng JUnit (Java) hoặc pytest (Python) được Develop để kiểm tra mã nguồn, thuật toán,….
 Dependency Test: Kiểm tra các dependencies với npm (Node.js) hoặc Maven (Java),…
 Integration Test: Sử dụng Postman hoặc Selenium để kiểm tra sự tương tác giữa các module.
 Security Test: Quét bảo mật bằng SonarQube, Trivy, Clair, Anchore hoặc OWASP ZAP để phát hiện lỗ hổng (CVE) trên ứng dụng được build ra hoặc images nếu dùng docker.

Sau khi kiểm tra hoàn tất không xuất hiện lỗi ứng dụng sẽ được build artifacts (bản build hoàn chỉnh của ứng dụng) bằng Maven, Gradle, hoặc npm(tùy vào công nghệ sử dụng), docker hoặc docker compose nếu sử dụng container, sau đó bản dựng sẽ được chuyển đến server chạy môi trường Develop triển khai ứng dụng lên môi trường Develop.

Nếu quá trình build gặp lỗi, hệ thống sẽ gửi thông báo ngay cho Developer để họ kịp thời khắc phục; trong quá trình này, Developer theo dõi log build và sửa lỗi.

Giai đoạn 3: Test

Sau khi ứng dụng đã được deloy lên môi trường kiểm thử.

QA/QC Engineer sẽ thực hiện kiểm tra lại ứng dụng thông qua các bài Manual test như

 Functional Testing: Kiểm tra chức năng của ứng dụng thủ công.
 UI/UX Testing: Kiểm tra giao diện người dùng và trải nghiệm người dùng bằng công cụ như Selenium, TestCafe, Cypress.
 Performance Testing: Kiểm tra hiệu năng ứng dụng với JMeter, Gatling.

Trong quá trình này DevOps Enginerr sẽ đảm bảo quy trình CICD được tự động hóa một các trơn tru. Nếu trong quá trình này xuất hiện lỗi, QA sẽ thông báo cho Developer để tiến hành kiểm tra lại các lỗi. Nếu không xuất hiện lỗi phát sinh source code sẽ được chuyển đến các môi trường pre-master để triển khai và kiểm tra lần cuối.

Giai đoạn 4: Deloy

Sau khi đã vượt qua được bài kiểm tra QA/QC ứng dụng sẽ được tiếp tục triển khai lên môi trường premaster đây là môi trường kiểm tra cuối cùng trước khi phát hành sản phẩm.

Môi trường Pre-Master có thể bao gồm Testing, Staging hoặc User Acceptance Testing (UAT).

Tại đây PM/Project Manager/Customer sẽ kiểm tra thủ công lại lần cuối cùng về các chức năng ứng dụng trước khi đưa vào môi trường production.

Sau khi vượt qua bài kiểm tra cuối cùng DevOps Engineer tiến hành Deploy lên môi trường Production (Golive). Nếu trong quá trình Golive gặp vấn đề, Project Manager hoặc DevOps Engineer sẽ cần thực hiện Rollback thông qua Git và Pipeline hỗ trợ rollback tự động bằng việc chuyển về commit hoặc version trước đó và thực hiện lại quá trình triển khai.

IV.CÁC CÔNG CỤ HỖ TRỢ TRONG QUY TRÌNH CI/CD

Ảnh có chứa văn bản, ảnh chụp màn hình, đa phương tiện, Hệ điều hành Mô tả được tạo tự động

1.Quản lý mã nguồn

Là bước đầu tiên trong quy trình CI/CD, nơi các developer lưu trữ mã nguồn, theo dõi các thay đổi, và hợp tác với nhau thông qua các thao tác như commit, push, pull request (PR), hoặc merge request (MR). Các công cụ này cung cấp các tính năng như quản lý branch, theo dõi lịch sử thay đổi và hỗ trợ hợp tác.

Các công cụ nổi bật như: GitLab/GitHub/Bitbucket.

 Vai trò: Quản lý mã nguồn, lưu trữ lịch sử phiên bản, hỗ trợ các thao tác như commit, branch, pull request, và merge. Phân quyền và tạo trigger để tiến hành chạy các pipeline.
 Lý do: Quản lý các thay đổi trong mã nguồn, giúp dễ dàng hợp tác giữa các developer và cung cấp cơ chế để theo dõi lịch sử code.
2.Continuous Integration (CI) Server

Là một công cụ tự động hóa giúp tích hợp và kiểm tra mã nguồn liên tục trong quá trình phát triển phần mềm. Mục tiêu của CI server là giúp phát hiện lỗi sớm và đảm bảo rằng mã nguồn luôn ở trạng thái có thể triển khai được.

Cụ thể:

Tự động build: Sau mỗi thay đổi trong source code, CI server tự động biên dịch và kiểm tra các thay đổi của code.
Kiểm thử tự động: CI server chạy các bài kiểm thử (unit tests, integration tests) đã được tích hợp sẳn trong pipeline để đảm bảo code hoạt động đúng.
Giảm xung đột code: Tích hợp code thường xuyên để tránh xung đột khi kết hợp các nhánh.
Tích hợp với công cụ khác: CI server có thể kết hợp với công cụ kiểm thử và triển khai tự động.
Cải thiện chất lượng: Phát hiện lỗi sớm giúp cải thiện chất lượng mã nguồn.
 Jenkins:

Jenkins là công cụ CI/CD mã nguồn mở rất phổ biến, giúp tự động hóa các bước build, test và triển khai phần mềm. Jenkins có thể được mở rộng thông qua các plugin để tích hợp với nhiều công cụ khác nhau.

 Tính năng:
Hỗ trợ việc tự động hóa pipeline thông qua Jenkinsfile.
Có thể tích hợp với nhiều hệ thống như Git, Docker, Kubernetes, và các công cụ kiểm thử.
Hệ sinh thái plugin phong phú, hỗ trợ các tác vụ từ kiểm thử đến triển khai.
Có thể sử dụng với các môi trường phân tán, tối ưu hóa quy trình CI/CD cho các dự án lớn.
 GitLab CI/CD:

GitLab CI/CD là công cụ tích hợp sẵn trong GitLab, cung cấp một quy trình CI/CD liền mạch từ mã nguồn đến triển khai. GitLab CI dễ dàng tích hợp với GitLab repositories và hỗ trợ việc thiết lập các pipeline tự động.

 Tính năng:
Tích hợp hoàn hảo với GitLab, giúp theo dõi và quản lý quy trình build và test trực tiếp từ giao diện GitLab.
Hỗ trợ việc tạo các pipeline tự động bằng YAML.
Quản lý dễ dàng các job trong pipeline, từ build đến kiểm thử và triển khai.
Hỗ trợ đa nền tảng và các công cụ như Docker, Kubernetes và các công cụ kiểm thử tự động.
 GitHub Actions:

GitHub Actions tích hợp trực tiếp trong GitHub, là lựa chọn tối ưu nếu dự án đã sử dụng GitHub để quản lý mã nguồn. Nó giúp tự động hóa mọi tác vụ phát triển mà không cần rời khỏi môi trường GitHub.

 Tính năng phù hợp với CI/CD:
Workflows linh hoạt: thể tạo workflows tùy chỉnh bằng file .github/workflows, từ đó xây dựng các pipeline tự động.
Tích hợp sẵn: Tích hợp trực tiếp với GitHub, hỗ trợ các tác vụ build, kiểm thử, triển khai mà không cần cài đặt công cụ bên ngoài.
Marketplace Actions: Có sẵn các actions từ cộng đồng để dễ dàng tái sử dụng và không cần phải viết code từ đầu.
Ứng dụng: Dành cho các dự án nhỏ hoặc các nhóm phát triển muốn tận dụng môi trường GitHub để tự động hóa quy trình CI/CD mà không cần các công cụ bên ngoài.
3.Continuous Deployment (CD)
 Docker, Docker Registry
Vai trò: Tạo và lưu trữ các container ứng dụng, đảm bảo môi trường phát triển và sản xuất nhất quán.
Lý do sử dụng: Docker cho phép đóng gói ứng dụng và các phụ thuộc của chúng vào trong một container dễ dàng triển khai trên bất kỳ hệ thống nào.
 Kubernetes:
Vai trò: Quản lý container, triển khai, mở rộng và giám sát các ứng dụng.
Lý do sử dụng: Kubernetes giúp tự động hóa việc triển khai, quản lý và scale các container ứng dụng, hỗ trợ nhiều dịch vụ và môi trường khác nhau.
 OpenShift:
Vai trò: OpenShift là nền tảng Kubernetes với các công cụ bổ sung, hỗ trợ CI/CD và tăng cường bảo mật.
Lý do sử dụng: OpenShift giúp đơn giản hóa việc triển khai ứng dụng container trên Kubernetes, hỗ trợ quản lý và giám sát ứng dụng hiệu quả.
4.Công cụ hỗ trợ kiểm thử tự động
 JUnit / TestNG / PyTest:
Vai trò: Công cụ kiểm thử đơn vị (unit test) cho Java, Python hoặc các ngôn ngữ khác.
Lý do sử dụng: Dễ dàng tự động kiểm thử code để đảm bảo chất lượng phần mềm.
 Selenium:
Vai trò: Kiểm thử giao diện người dùng (UI) tự động.
Lý do sử dụng: Selenium hỗ trợ kiểm thử tự động ứng dụng web trên nhiều trình duyệt khác nhau.
 SonarQube:
Vai trò: Phân tích mã nguồn để phát hiện lỗi và kiểm tra chất lượng code.
Lý do sử dụng: SonarQube cung cấp báo cáo về các vấn đề như bugs, vulnerabilities, code smells, giúp cải thiện chất lượng phần mềm.
5.Bảo mật (Security Testing)
 Snyk:
Vai trò: Quét các thư viện và container để phát hiện các lỗ hổng bảo mật.
Lý do sử dụng: Snyk giúp phát hiện và xử lý các vấn đề bảo mật trong dependencies và container images.
 Trivy:
Vai trò: Quét bảo mật cho Docker images và các dependency.
Lý do sử dụng: Trivy là công cụ quét nhanh chóng, hỗ trợ kiểm tra container images và ứng dụng.
6.Giám sát và Logging
 Prometheus:
Vai trò: Giám sát hệ thống và thu thập dữ liệu thời gian thực về hiệu suất của ứng dụng.
Lý do sử dụng: Prometheus là công cụ mạnh mẽ giúp theo dõi các chỉ số như tài nguyên, ứng dụng và cơ sở hạ tầng.
 Grafana:
Vai trò: Hiển thị các dữ liệu thu thập từ Prometheus trong các dashboard trực quan.
Lý do sử dụng: Grafana giúp người vận hành dễ dàng giám sát các chỉ số, xác định vấn đề và đưa ra quyết định.
 ELK Stack (Elasticsearch, Logstash, Kibana):
Vai trò: Thu thập, xử lý và trực quan hóa logs.
Lý do sử dụng: ELK giúp phân tích logs, xác định vấn đề trong hệ thống và nâng cao khả năng giám sát.
7.Quản lý hạ tầng
 Terraform:
Vai trò: Quản lý hạ tầng dưới dạng mã (IaC – Infrastructure as Code).
Lý do sử dụng: Terraform giúp tự động hóa việc triển khai và quản lý hạ tầng một cách nhất quán và dễ dàng tái tạo.
 Ansible:
Vai trò: Tự động hóa việc cấu hình hạ tầng và triển khai ứng dụng.
Lý do sử dụng: Ansible giúp quản lý và cấu hình các server, môi trường ứng dụng một cách tự động và dễ sử dụng.

By admin

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *

error: Content is protected !!
Don`t copy text!