- vừa được xem lúc

CICD Pipeline là gì? Một CI/CD Pipeline hoàn thiện trông như thế nào?

0 0 5

Người đăng: Hoàng Việt

Theo Viblo Asia

CI/CD là gì?

CI/CD là viết tắt của Continuous Integration (Tích hợp liên tục)Continuous Delivery/Deployment (Triển khai liên tục). Nói đơn giản, đây là một quy trình giúp việc phát triển phần mềm trở nên nhanh chóng, ổn định và ít lỗi hơn.

Ở bước CI (Tích hợp liên tục), mỗi khi lập trình viên đẩy code mới lên Git, hệ thống sẽ tự động kiểm tra xem code đó có bị lỗi không (ví dụ: chạy unit test, kiểm tra style code, build thử...). Nhờ đó, mình có thể phát hiện lỗi sớm và sửa ngay khi còn dễ.

Sau khi code đã ổn, đến phần CD. Tùy vào cách tổ chức, CD có thể là:

Continuous Delivery: code được đóng gói và sẵn sàng triển khai, nhưng vẫn cần người bấm nút để đẩy lên môi trường thật.

Continuous Deployment: code tự động được triển khai lên môi trường thật luôn, không cần thao tác tay.

Nhờ CI/CD, mình tiết kiệm rất nhiều thời gian trong việc kiểm tra và triển khai phần mềm, đồng thời giảm rủi ro do lỗi người gây ra khi làm thủ công.

Trong bài viết này mình sẽ chia sẻ đến các bạn một luồng CI/CD "hoàn thiện" trong thực tế trông sẽ thế nào, dựa trên kinh nghiệm làm việc của mình như một DevOps Engineer.

image.png

1. Continuous Integration (Tích hợp liên tục)

1.1 Code Checkout / Clone

Trước khi bắt đầu bất cứ quá trình CI/CD nào ta cũng cần pull/clone về source code tại các nơi lưu trữ code như Github, Gitlab để có thể thực hiện build source code ra phiên bản hoàn thiện hoặc chạy kiểm thử trên source code.

Loại Công cụ thường dùng
Source Control GitHub, GitLab, Bitbucket, Azure Repos, Gitea,...

1.2 Build/Install dependencies

Việc cài đặt phụ thuộc sẽ tải về và cài đặt các thư viện bên thứ 3 ,thư viện phụ thuộc hoặc gói cài đặt liên quan mà không thể xem trực tiếp được trong source code nếu không chạy cài đặt.

Bước này là cần thiết để có thể chạy được các bước phân tích tiếp theo hiệu quả. Tùy thuộc vào kiểu ứng dụng của bạn có chạy dưới dạng container hay không và loại ngôn ngữ mà bạn có thể chọn được công cụ phù hợp

Loại Công cụ thường dùng
Công cụ build cho từng ngôn ngữ Maven, Gradle, sbt, npm/yarn/pnpm, pip/Poetry, Cargo, Go modules, Bazel, Buck, CMake, Make, MSBuild, dotnet CLI
Container & image build Docker CLI/BuildKit, Buildah, Kaniko, Podman, Jib, ko, img, buildpacks (Paketo, Cloud Native Buildpacks)

1.3 Static Code Analysis

Khi một nhóm phát triển phần mềm làm việc cùng nhau, sẽ có rất nhiều đoạn mã được viết ra mỗi ngày. Dù mọi người đều cố gắng viết code tốt, nhưng con người vẫn dễ mắc lỗi, nhất là những lỗi nhỏ khó nhìn thấy ngay.

Static Code Analysis là cách mà mình dùng công cụ để tự động kiểm tra mã nguồn mà không cần chạy ứng dụng. Nó giống như việc bạn soát lỗi chính tả trong văn bản trước khi gửi email – nhưng ở đây là soát lỗi trong code.

Đầu vào của bước này sẽ là 2 bước trên Source codecontainer image
Các bước phân tích này có thể chạy đồng thời để tiết kiệm thời gian.

Loại phân tích Công cụ thường dùng Mục đích
Lint / style check ESLint, Pylint, Flake8, RuboCop, Prettier, Stylelint, go vet, golangci-lint Kiểm tra lỗi cú pháp, chuẩn hóa code theo quy định, giúp code dễ đọc và dễ bảo trì hơn
Unit testing & coverage JUnit, TestNG, pytest, unittest, jest, mocha, RSpec, go test, NUnit, xUnit Đảm bảo các hàm, module hoạt động đúng như mong muốn và đo mức độ bao phủ của test
Code coverage reporting JaCoCo, Istanbul/nyc, Coverlet, Codecov, SonarCloud, Clover Hiển thị trực quan phần nào của mã nguồn đã được kiểm thử, từ đó cải thiện chất lượng test
Static application security testing (SAST) SonarQube, Semgrep, Checkmarx, Veracode, GitHub CodeQL, Fortify, Coverity Quét mã nguồn để phát hiện lỗ hổng bảo mật tiềm ẩn trước khi ứng dụng được build hoặc chạy
Secrets detection TruffleHog, Gitleaks, Detect-Secrets, GitGuardian Phát hiện các thông tin nhạy cảm (API keys, mật khẩu...) bị lộ trong mã nguồn
License & SCA (open-source risk) Snyk, Black Duck, WhiteSource, Mend (trước đây là WhiteSource), FOSSA, OWASP Dependency-Check Kiểm tra các thư viện mã nguồn mở có sử dụng license hợp lệ và không chứa lỗ hổng bảo mật
Container scanning Trivy, Grype, Clair, Anchore, Snyk, Docker Scout, Aqua, Prisma Cloud Phân tích image container để phát hiện lỗ hổng bảo mật, thư viện lỗi thời, hoặc cấu hình không an toàn

1.4 Build Artifact Packaging & Signing

Sau khi bước trên đã qua với kết quả tốt và không có lỗi gì nghiêm trọng ta sẽ đến với bước tiếp theo. Đóng gói lại ứng dụng và đẩy lên kho chứa.

Các bước sau cần được chạy tuần tự

Bước Mục đích Công cụ thường dùng Giải thích dễ hiểu
1. Package binaries Đóng gói mã nguồn đã build thành định dạng chuẩn để sử dụng hoặc triển khai JAR, WAR, NuGet, PyPI wheels, OCI images, Helm charts, Debian/RPM, container SBOM Sau khi build xong, code được đóng gói lại thành các file mà hệ thống hoặc người dùng có thể sử dụng được. Tùy vào ngôn ngữ hoặc môi trường, định dạng có thể là JAR (Java), PyPI (Python), Docker image, Helm chart (K8s), v.v. Container SBOM là danh sách các thành phần có trong image để kiểm tra bảo mật.
2. Artifact/Image signing & provenance (optional) Ký số và xác minh nguồn gốc (ai tạo ra, có bị thay đổi gì không) để đảm bảo tính tin cậy và an toàn của gói phần mềm cosign, Notary v2, JReleaser, GPG, AWS KMS, HashiCorp Vault Giống như bạn ký tên hoặc đóng dấu vào một gói hàng, ký số giúp xác nhận đây là artifact "chính chủ", không bị giả mạo. Nếu sau này có sự cố, bạn có thể biết chính xác ai build ra nó, và liệu nó có bị can thiệp hay không.
3. Push artifacts Đưa artifact/image đã đóng gói và ký số lên kho lưu trữ để các môi trường khác (dev, staging, prod) có thể truy cập và triển khai JFrog Artifactory, Sonatype Nexus, GitHub Packages, GitLab Package Registry, Azure Artifacts, S3/GCS buckets, Docker Hub, ECR, GCR, OCI-compatible registries Artifact được upload lên các "kho chứa" (registry hoặc artifact store) để người khác (hoặc hệ thống CI/CD) có thể lấy về sử dụng. Ví dụ: upload Docker image lên Docker Hub, Helm chart lên GCS bucket, hoặc .jar lên GitHub Packages. Đây là bước kết nối giữa quá trình build và môi trường triển khai thực tế.

Như vậy khi đến đây là cơ bản chúng ta đã hoàn thành bước CI - Continuous Integration

2. Continuous Delivery / Deployment (Triển khai liên tục)

2.1 Fetch Build Artifact

Bắt đầu với bước CD ta cần tải về hoặc lấy thống tin Build Artifact đã xây dựng từ bước cuối cùng của quá trình CI.

Việc tải về Image, file thực thi giúp ta có thể triển khai ứng dụng lên các môi trường khác nhau trong các bước tiếp theo

2.2 Deploy non-production environment

Trong thực tế ta sẽ luôn có các môi trường kiểm thử như: Dev, Staging, UAT, Preprod để các bên liên quan có thể vào kiểm tra xem ứng dụng có hoạt động như kỳ vọng hay không

Từ phía là DevOps Engineer, ta có thể tích hợp các công cụ để tự động kiểm thử ở trên môi trường này.

Tùy thuộc vào từng chiến lược triển khai khác nhau mà bạn muốn sử dụng chúng ta sẽ có những lựa chọn về công cụ khác nhau.

Chiến lược triển khai Công cụ
Helm package & release Helm, Helmfile, Reckoner
Progressive delivery (GitOps) Argo CD, Flux CD, Jenkins X, Google Config Sync, Spinnaker, Harness CD
Blue/Green & canary Flagger, Argo Rollouts, Spinnaker, Istio, Linkerd, AWS CodeDeploy
Serverless deploy Serverless Framework, AWS SAM, Terraform, Pulumi, SST
Mobile / desktop release Fastlane, Microsoft App Center, Google Play Console pipelines
Feature flag rollout LaunchDarkly, Flagsmith, Unleash, Split, CloudBees Rollout

2.3 Run tests/scans on non-production environments

Việc chạy kiểm thử trên môi trường non-production có thể chạy trên nhiều lần trên nhiều môi trường.

Tùy thuộc vào các loại ứng dụng mà chúng ta cần chọn các loại kiểm thử phù hợp, không nhất thiết phải chạy toàn bộ các loại kiểm thử này.

Loại kiểm thử Công cụ thường dùng Mục đích
Browser / UI Testing Selenium WebDriver, Cypress, Playwright, TestCafe, Puppeteer Mô phỏng người dùng thao tác trên trình duyệt để kiểm tra giao diện và luồng hoạt động của ứng dụng web
Mobile App Testing Appium, Detox, Espresso Kiểm thử chức năng và giao diện của ứng dụng mobile (Android/iOS) như người dùng thật
Load & Performance Testing JMeter, Gatling, Locust, K6, Artillery, Vegeta Đo lường hiệu suất ứng dụng khi có nhiều người dùng truy cập cùng lúc, tìm điểm nghẽn, đo thời gian phản hồi
Chaos / Resiliency Testing Gremlin, ChaosMesh, LitmusChaos, PowerfulSeal Kiểm tra khả năng chịu lỗi của hệ thống bằng cách tạo lỗi giả lập (mất mạng, chết service...)
Black-box DAST (Security) OWASP ZAP, Burp Suite Pro, Arachni, Netsparker, Tenable Web App Scan Quét bảo mật ứng dụng đang chạy (giống như hacker bên ngoài tấn công), tìm lỗ hổng như XSS, SQLi...
Fuzz Testing (Security) Jazzer, go-fuzz, libFuzzer, AFL++, Defensics Gửi dữ liệu ngẫu nhiên vào ứng dụng để tìm crash hoặc lỗi bảo mật chưa biết trước (zero-day)
Container Image Scanning Trivy, Grype, Anchore Engine, Clair, Aqua Microscanner Kiểm tra Docker image để phát hiện thư viện chứa lỗ hổng bảo mật hoặc cấu hình không an toàn

2.4 Deploy production environment

Sau khi kiểm thử và chạy các quét bảo mật trực tiếp trên môi trường non-production không có vấn đề gì, ta có thể thực hiện quá trình tiếp theo và triển khai lên môi trường production cho người dùng thật.

Các công cụ để deploy trong môi trường production cũng sẽ tương tự khi triển khai môi trường non-production

Bước triển khai lên môi trường production nên được duyệt thủ công để tránh xảy ra sự cố

2.5 Post‑Deployment Validation

Sau khi deploy môi trường production không phải là đã kết thúc CI/CD pipeline. Lại một lần nữa sau khi hoàn tất deploy production mà không có vấn đề gì ta cần chạy lại hoặc thêm 1 số loại test nữa để đảm bảo không có lỗi gì không xuất hiện trên non-production env mà xuất hiện trên production.

Loại kiểm thử Công cụ
Smoke / sanity tests in target env Bats‑core, newman, curl + bash scripts, canary synthetic checks
Contract & health checks Spring Boot Actuator, Kubernetes readiness/liveness probes

2.6 Rollback & Disaster Recovery

Đây là một bước mà rất nhiều người sẽ bỏ quên. Bước này giúp bạn rollback ứng dụng lại phiên bản ngay trước đó khi phiên bản mới gặp lỗi. Công cụ được sử dụng để rollback thường sẽ chính là công cụ bạn sử dụng để triển khai ứng dụng.

Nhiệm vụ Công cụ thường dùng
Tự động rollback khi có sự cố Argo Rollouts, Spinnaker, Harness, Kubernetes Deployments with health‑checks
Disaster Recovery Velero, AWS Backup, Azure Backup, Google Cloud Backup & DR

2.7 Notify & Document Release

Tại bước cuối cùng này ta cần gửi thông báo về trạng thái phiên bản mới đã được triển khai cùng với thông tin thay đổi cho các bên liên quan, ở đây có thể là development team, khách hàng, PM,...

Mục đích Công cụ
Auto‑generated docs mkdocs‑material, Docusaurus, Sphinx, Swagger/OpenAPI, Storybook
Release notes & changelog Release Drafter, auto‑changelog, GitHub Releases, Keep a Changelog
ChatOps notifications Slack Apps/Bot, Microsoft Teams, Mattermost, Discord webhooks

Infrastructure pipeline (Bonus)

Ngoài việc pipeline để triển khai ứng dụng chúng ta còn có các pipeline để triển khai hạ tầng giúp chạy ứng dụng. Sau đây là một vài công cụ có thể tham khảo cho pipeline provision hạ tầng này:

Infrastructure‑as‑Code (IaC) & Policy Scan

Format Validators / linters
Terraform terraform validate, TFLint, tfsec, Checkov, Terrascan, Infracost, Regula
Kubernetes manifests kube‑score, kube‑lint, Kubeval, Kube‑No‑Trouble, Polaris, OPA Conftest
Helm charts helm lint, chart‑testing, Datree
Cloud formation cfn‑lint, CFN‑Guard
Packer packer validate, Packer Inspector

Environment Provisioning & Configuration

Automation layer Popular tools
Provision infra Terraform, Pulumi, Crossplane, AWS CloudFormation, Azure Bicep, Google Cloud Config Connector
Configuration management Ansible, Chef, Puppet, SaltStack
Container platform bootstrapping Kubernetes (kops, kube‑adm), EKS‑Blueprints, Rancher, OpenShift, K3s, Kind for testing
Secrets & parameter store HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, Sealed Secrets, Doppler

Kết

Như vậy mình đã đi qua những bước chính có trong một pipeline CI/CD thông dụng hiện tại và các công cụ bạn có thể sử dụng trong từng bước đó. Hy vọng bài viết đã giúp bạn có một cái nhìn tổng quan về các bước cần có trong CI/CD.

Nếu bài viết có ích cho bạn hãy Follow và Upvote bài viết để ủng hộ mình nhé. Cám ơn bạn ❤️

Nếu như bạn đang gặp khó khăn trong vấn đề chuyên môn, cần người hỗ trợ về mặt hệ thống, DevOps tools hay cần định hướng trong công việc thì mình tự tin có thể hỗ trợ được bạn. Liên hệ với mình để trao đổi thêm nhé https://hoangviet.io.vn/, mình rất vui khi được trao đổi và cộng tác với bạn.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Đề thi interview DevOps ở Châu Âu

Well. Chào mọi người, mình là Rice - một DevOps Engineers ở đâu đó tại Châu Âu.

0 0 110

- vừa được xem lúc

In calculus, love also means zero.

Mình nhớ hồi năm 2 đại học, thầy giáo môn calculus, trong một giây phút ngẫu hứng, đã đưa ra cái definition này. Lúc đấy mình cũng không nghĩ gì nhiều.

0 0 78

- vừa được xem lúc

Chuyện thay đổi

Thay đổi là một thứ gì đó luôn luôn đáng sợ. Cách đây vài tháng mình có duyên đi làm cho một banking solution tên là X.

0 0 63

- vừa được xem lúc

Pet vs Cattle - Thú cưng và gia súc

Khái niệm. Pets vs Cattle là một khái niệm cơ bản của DevOps. Bài viết này sẽ nói về sự phát triển của các mô hình dịch vụ từ cốt lõi Pets and Cattle. 1.

0 0 49

- vừa được xem lúc

Git workflow được Google và Facebook sử dụng có gì hay ho

Với developer thì Git hẳn là công cụ rất quen thuộc và không thể thiếu rồi. Thế nhưng có mấy ai thực sự hiểu được Git.

0 0 101

- vừa được xem lúc

Kubernetes - Học cách sử dụng Kubernetes Namespace cơ bản

Namespace trong Kubernetes là gì. Tại sao nên sử dụng namespace.

0 0 133