Xây dựng CI/CD Pipeline sử dụng Jenkins
Khóa học này đề cập đến pipeline CI (Continuous Integration - Tích hợp liên tục) và CD (Continuous Deployment - Triển khai liên tục), một trong 4 yếu tố cốt lõi cấu thành nên ứng dụng cloud native (MSA, CI/CD, DevOps, Container). Thông qua khóa học này, bạn có thể hiểu và thực hành quy trình cần thiết để xây dựng và triển khai pipeline tự động hóa của riêng mình trên môi trường local và môi trường cloud bằng cách sử dụng Jenkins - công cụ CI/CD.
4,881 học viên
Độ khó Cơ bản
Thời gian Không giới hạn


Tin tức
8 bài viết
Xin chào. Chúng tôi đã bổ sung một bài giảng bổ sung mới vào khóa học Phát triển dịch vụ LLM thực tế dành cho lập trình viên Spring (Phần 1). Nội dung hướng dẫn tích hợp mô hình ra quyết định Jev của TypeSafe AI mới được công bố vào ứng dụng Spring Boot, với thời lượng khoảng 1 giờ.
Tại sao thêm nội dung này
Trong Section 4, chúng ta đã tìm hiểu cách nhận phản hồi của LLM dưới dạng đối tượng Java bằngentity(), cũng như cạm bẫy trong thực tế khi mô hình bọc JSON trong code fence khiến việc phân tích cú pháp bị lỗi. Dù yêu cầu bằng prompt hay tự động hóa bằngentity(), vẫn còn một hạn chế: cuối cùng, đó vẫn là cách "nhờ" LLM trả về đúng định dạng.
Jev có cách tiếp cận khác. Thay vì viết câu trả lời, nó chọn một đáp án trong số các lựa chọn được định trước và trả về cùng với xác suất. Nói cách khác, định dạng được đảm bảo một cách có cấu trúc. Khi xử lý cùng một đầu vào theo hai cách, chúng ta sẽ hiểu rõ hơn nhiều về những điều cần cân nhắc khi thiết kế "đầu ra có cấu trúc". Vì vậy, tôi đã tổng hợp nội dung này như phần tiếp nối của Section 4.Bạn sẽ học gì
Khái niệm về các mô hình Jev và System One: ý nghĩa của việc trả về "quyết định có kiểu dữ liệu được xác định" thay vì văn bản
Sự khác biệt giữa LLM và Jev: câu trả lời tự luận và câu trả lời trắc nghiệm, những việc mỗi bên làm tốt và không làm tốt
Ba loại câu hỏi (choice · score · noul) và cấu trúc yêu cầu
/v1/systemoneGọi từ Spring: gọi API Jev bằng
RestClientvà tạo các lựa chọn bằng enum Java để chuyển đổi phản hồi một cách an toàn về kiểu dữ liệuTrình diễn so sánh: phân tích cùng một bài đánh giá phim lần lượt bằng
entity()và Jev để so sánh tốc độ, lỗi định dạng, độ tin cậy và tính nhất quán
Tài liệu được cập nhật cùng nhau
Mã ví dụ Phần 4 (ch4): thêm 2 API phân tích bài đánh giá (
/api/movies/review/llm,/api/movies/review/jev) vàJevClientSlide bài giảng bổ sung và tài liệu giảng dạy
Kịch bản kiểm thử so sánh:
review-compare.shdành cho macOS,review-compare.ps1dành cho Windows
Điểm cần biết trước
Jev không phải là một tính năng của Spring AI mà là một dịch vụ bên ngoài riêng biệt do TypeSafe AI cung cấp. Trong bài giảng, chúng ta cũng gọi trực tiếp bằng
RestClient, chứ không phảiChatClientcủa Spring AI.Hiện tại Jev đang ở giai đoạn truy cập sớm, vì vậy việc cấp khóa API có thể phải chờ. Trong mã ví dụ, tính năng Jev mặc định bị tắt (
jev.enabled=false), nên ngay cả khi không có khóa, bạn vẫn có thể tiếp tục các bài thực hành như bình thường. Nếu chưa có khóa, hãy xem phần trình diễn trong video và tập trung theo dõi các khái niệm cùng mã nguồn.Vì đây là dịch vụ mới ra mắt nên giá cả hoặc API có thể thay đổi sau này. Nếu có thay đổi, chúng tôi sẽ thông báo lại qua tin tức mới.
📌 Truy cập khóa học ngay: https://inf.run/VVpnV
Nếu trong quá trình học các bài giảng được bổ sung, bạn có bất kỳ thắc mắc nào hoặc gặp khó khăn khi thực hành, hãy thoải mái để lại bình luận. Chúng tôi sẽ tiếp tục bổ sung những nội dung có thể áp dụng ngay vào công việc thực tế.
Xin chào, tôi là Lee Do-won.
"Tôi đã thử tạo pipeline Jenkins, nhưng mới chỉ nghe qua khái niệm ArgoCD hoặc GitOps."
"Tôi bối rối không biết nên thiết kế việc triển khai như thế nào cho từng môi trường dev, staging và production."
Dành cho những ai đang trăn trở như vậy, chúng tôi đã mở khóa học 「Học GitOps CI/CD thực chiến với Jenkins và ArgoCD」 trên Inflearn.
Khóa học này khác biệt ở những điểm sau
• Cùng tìm hiểu cả GitOps dựa trên ArgoCD, vượt ra ngoài CI/CD truyền thống dựa trên Jenkins.
• Trực tiếp so sánh phương thức Push (Jenkins) và phương thức Pull (ArgoCD) trên cùng một cụm Kubernetes. Khi ai đó thay đổi thủ công bằng kubectl, bạn sẽ tận mắt thấy một bên giữ nguyên thay đổi còn bên kia tự động khôi phục, đồng thời trực tiếp cảm nhận sự khác biệt trong cách rollback và kiểm tra lịch sử triển khai.
• Kết hợp hai phương thức để xây dựng từ đầu đến cuối một quy trình triển khai kết hợp, trong đó dev·staging sử dụng Jenkins Push, còn production sử dụng ArgoCD Pull (phê duyệt Sync thủ công).
• Thực hành các kỹ thuật triển khai cốt lõi cần thiết cho vận hành, từ Canary, Blue-Green, RBAC, quy trình phê duyệt, ứng phó sự cố cho đến tự động rollback.
Môi trường thực hành
Chỉ cần Docker Desktop là có thể thực hiện. Tương thích với cả Windows và macOS, không cần tài khoản đám mây như AWS hay phát sinh chi phí riêng.
Khóa học này phù hợp với những ai
• Kỹ sư backend và hạ tầng đã từng sử dụng Jenkins nhưng chưa từng làm quen với ArgoCD/GitOps
• Những người muốn chuyển việc triển khai Kubernetes từ thao tác thủ công bằng kubectl apply sang tự động hóa
• Nhân sự DevOps·SRE quan tâm đến các yêu cầu vận hành như phê duyệt triển khai, rollback và theo dõi kiểm toán
Tổng thời lượng học khoảng 10–11 giờ, đồng thời cung cấp tài liệu thực hành và hướng dẫn khắc phục sự cố.
👉 Xem khóa học: https://inf.run/dEjZE
Nếu có điều gì thắc mắc, hãy thoải mái để lại trong phần bình luận hoặc mục Q&A của khóa học nhé!
Lần này, chúng tôi đã mở khóa học mới Phát triển dịch vụ LLM thực chiến dành cho nhà phát triển Spring (Phần 1). Dù có thể hơi muộn một chút, khóa học được xây dựng nhằm giúp bạn học những nội dung cần thiết để phát triển ứng dụng LLM bằng Spring framework quen thuộc với các nhà phát triển Java. Rất mong nhận được sự quan tâm của các bạn.
Tại sao tôi tạo ra khóa học này?
Dạo gần đây, những từ khóa như RAG, tìm kiếm vector và tác nhân AI có thể bắt gặp ở khắp nơi, nhưng tài liệu hướng dẫn chuyên sâu ở cấp độ thực tế về việc “tích hợp chúng vào backend Spring Boot như thế nào” lại không nhiều.
Khóa học này đưa nguyên vẹn vào chương trình những vấn đề tôi từng gặp khi gỡ lỗi endpoint đề xuất RAG thực tế — trải nghiệm chất lượng tìm kiếm bị giảm do ý nghĩa bị phá vỡ khi chia nhỏ tài liệu theo đơn vị token, cũng như quá trình chuyển sang chiến lược chia theo đoạn văn để giải quyết vấn đề. Thay vì chỉ đưa ra đoạn mã đúng như trong các tutorial, khóa học sẽ cùng bạn theo dõi quá trình “tại sao không hoạt động → chẩn đoán như thế nào → khắc phục ra sao”.
Khóa học này được khuyến nghị cho những người sau đây:
Các lập trình viên backend đã có kinh nghiệm với Spring Boot nhưng mới bắt đầu phát triển dịch vụ LLM/AI
Các nhà phát triển muốn áp dụng RAG và tìm kiếm vector ở cấp độ dự án thực tế, thay vì chỉ theo các bài hướng dẫn.
Những người thực tế cần tự triển khai các tính năng AI nội bộ (chatbot, tìm kiếm tài liệu, đề xuất, v.v.) dựa trên Spring
Chỉ cần có kinh nghiệm xây dựng REST API bằng Spring Boot là đủ. Không cần có kiến thức nền tảng về AI/LLM.
Bạn sẽ học gì?
1. Nền tảng cốt lõi của Spring AI Cách sử dụng cơ bản ChatClient, đầu ra có cấu trúc (Structured Output), triển khai phản hồi streaming
2. Xây dựng pipeline RAG Tích hợp kho vector, so sánh các chiến lược chia nhỏ tài liệu và xử lý sự cố trong thực tế, cải thiện chất lượng tìm kiếm, thiết kế prompt
3. Mở rộng công cụ và đa phương thức Tích hợp các công cụ bên ngoài bằng MCP (Model Context Protocol), xử lý đầu vào đa phương thức như hình ảnh, tích hợp Dify
4. Ổn định dịch vụ và dự án thực tế Áp dụng các biện pháp bảo vệ, thiết kế dịch vụ đáng tin cậy và thực hiện dự án mini tích hợp những nội dung đã học cho đến nay
Phần phụ lục cũng hướng dẫn cách sử dụng công cụ lập trình AI và Ollama.
Giới thiệu về loạt bài
Sản phẩm ra mắt lần này là Part 1 của toàn bộ series. Trong Part 2 và 3, chúng tôi dự kiến sẽ đề cập đến các kiến trúc chuyên sâu hơn và những trường hợp thực tế; khi toàn bộ series được phát hành, chúng tôi cũng dự định chuẩn bị chương trình giảm giá cho trọn bộ.
📌 Truy cập khóa học: https://inf.run/VVpnV
Nếu có điều gì thắc mắc hoặc câu hỏi liên quan đến giáo trình, hãy thoải mái để lại bình luận. Thông qua Part 1, tôi muốn cùng các bạn thực hiện bước đầu tiên trong việc tích hợp LLM vào dịch vụ Spring của mình.
Xin chào, đây là Lee Do-won.
Trong bài giảng "Xây dựng đường ống CI/CD bằng Jenkins" và "Công nghệ ảo hóa Docker cho DevOps (Private Harbor Register)", một môi trường thực hành được xây dựng bằng phương pháp DinD (Docker in Docker) để chạy các container Docker một cách trơn tru và chạy các ví dụ. tôi đang làm việc đó
Tuy nhiên, môi trường Windows và MacOS là khác nhau và đối với MacOS, hình ảnh Docker phải được định cấu hình sẽ khác nhau tùy thuộc vào chip Intel hoặc chip Apple. Trong hình ảnh này, máy chủ SSH và công cụ Docker được cấu hình để cài đặt, giúp dễ dàng sử dụng khi cần nhiều bộ chứa Docker trong quá trình thực hành. Tuy nhiên, sự thật là rất khó để sản xuất nó để phù hợp với tất cả môi trường của sinh viên. Tuy nhiên, chúng tôi đang cố gắng cập nhật hình ảnh Docker để có thể thực hành mà không gặp khó khăn trong môi trường điển hình nhiều nhất có thể.
Gần đây, khi thực hành sử dụng hình ảnh docker-server:m1 được sử dụng trong chip MacOS Apple, người ta đã xác định được một lỗi khiến việc thực hành không thể thực hiện được do các lỗi sau.
exec /docker-entrypoint.sh: invalid argumentTôi đã kiểm tra và sửa lỗi qua nhiều đường dẫn khác nhau, nhưng có vẻ như lỗi xảy ra trong phương thức DinD, sử dụng kiến trúc arm64 được sử dụng trong chip MacOS Apple và cài đặt Docker engine trong vùng chứa Docker. (Không có thông báo lỗi hoặc nhật ký nên việc tìm ra nguyên nhân bị hạn chế.)
Nó được đánh giá là khó giải quyết với hình ảnh này nên chúng tôi đã xây dựng lại và phân phối một phiên bản với công cụ SSH + Docker được cài đặt trên nền tảng Ubuntu như hình bên dưới.
https://hub.docker.com/repository/docker/edowon0623/docker-server/general
Chúng tôi xác nhận rằng mọi vấn đề phát sinh nêu trên đã được giải quyết. Để khởi động dịch vụ Docker trên Ubuntn, trước tiên hãy chạy lệnh bên dưới rồi thực hành.
service start dockerChúng tôi sẽ tiếp tục cung cấp môi trường thực hành cập nhật ngay khi các vấn đề liên quan đến thực hành, chẳng hạn như vấn đề DinD, được xác định.
Tuần tới là ngày nghỉ lễ. Năm 2024 là một năm có nhiều sự kiện đối với cá nhân tôi, nhưng tôi sẽ bắt đầu một năm mới với một tinh thần mới mẻ. Năm nay tôi sẽ quay lại thường xuyên với những bài giảng hay hơn. Chúc một năm mới may mắn .
Cảm ơn
** Tham khảo khi test từ ansible-server đến K8s trên Windows
Khi kiểm tra bằng cách kết nối với Kubernetes của docker-desktop được cài đặt trên Windows bằng ansible-server, vui lòng kiểm tra thông tin bên dưới.
Khi cố gắng sao chép nội dung của tệp khóa id_rsa.pub sang Windows bằng lệnh ssh-copy-id trong ansible-server, chuỗi ECHO~ có thể được chèn thay vì nội dung của tệp khóa thông thường. Trong trường hợp này, bạn phải sao chép trực tiếp và sử dụng nội dung của tệp khóa id_rsa.pub thay vì sử dụng lệnh ssh-copy-id. Bất kể bạn sử dụng phương pháp nào, kết quả là nội dung của tệp khóa id_rsa.pub được tạo bởi ansible-server đều được lưu trữ trong tệp ủy quyền trong thư mục .ssh của Windows. Một điều cần lưu ý lúc này là tài khoản đăng nhập vào ansible-server và tài khoản đăng nhập vào máy chủ Windows phải khớp nhau, đồng thời tài khoản phải có quyền quản trị viên trong Windows để tránh xảy ra lỗi khi sử dụng các lệnh như docker hoặc kubectl. Không. Tóm lại, bạn cần tạo một tài khoản ansible-server có cùng tên tài khoản với tài khoản bạn sử dụng để đăng nhập vào Windows, sau đó sao chép khóa. Nếu quá trình này không thuận tiện, hãy sử dụng lệnh ssh-copy-id để kết nối mà không cần xác thực khi kết nối qua ssh. Tiếp tục với phần này bằng cách nhập nguyên mật khẩu và trong ansible-playbook, ghi lại thông tin kết nối Windows trong tệp máy chủ của Ansible. bạn sử dụng nó, bạn có thể chạy playbook mà không gặp vấn đề gì.
Vui lòng xem mô tả quá trình thực hiện bên dưới.
Hệ điều hành Windows (cài docker-desktop, chạy Kubernetes, IP: 192.168.0.7)
docker-server (Bộ chứa Docker, IP: 172.17.0.3)
ansible-server (Bộ chứa Docker, cài đặt Ansible, IP: 172.17.0.4)
Đầu tiên, sao chép khóa id_rsa.pub được tạo trong ansible-server sang docker-server bằng lệnh ssh-copy-id. Bạn cũng có thể sao chép khóa docker-server và kiểm tra xem ssh có thể được kết nối mà không cần mật khẩu hay không.

Sao chép khóa id_rsa.pub từ máy chủ ansible sang máy chủ windows. (Hình ảnh bên dưới nằm trong docker-server, nhưng bạn có thể tiếp tục trong ansible-server). Tuy nhiên, tài khoản dùng để tạo key id_rsa.pub và tài khoản dùng để truy cập openssh trên Windows phải giống nhau và tài khoản Windows phải có đặc quyền quản trị viên để chạy lệnh docker hoặc kubectl. Tại thời điểm này, nếu bạn cố gắng sao chép khóa id_rsa.pub bằng lệnh ssh-copy-id, nội dung của khóa id_rsa.pub có thể không được sao chép vào tệp ủy quyền_keys của Windows, nhưng chuỗi ECHO~ có thể được sao chép. Trong trường hợp này, bạn có thể sao chép khóa trực tiếp vào tệp ủy quyền của Windows bằng phương pháp COPY-PASTE. (Nếu tệp ủy quyền không tồn tại trong Windows, bạn có thể tự tạo tệp)

Trước khi sao chép khóa id_rsa.pub , hãy kiểm tra xem bạn có thể kết nối với máy chủ Windows bằng lệnh ssh trong Windows như minh họa trong bước 4) bên dưới hay không. (Nếu openssh chưa được cài đặt, vui lòng cài đặt nó.)

Lần này, vui lòng kiểm tra kết nối với máy chủ openssh trên Windows bằng lệnh ssh trực tiếp từ ansible-server.

Như đã giải thích ở số 2 ở trên, khi sao chép key id_rsa.pub , key id_rsa.pub phải được tạo bằng cùng một tài khoản với tài khoản Windows. Nếu quá trình này bất tiện, hãy nhập thông tin kết nối Windows vào tệp máy chủ Ansible như hình. bên dưới. Chúng tôi khuyên bạn nên ghi lại và sử dụng nó. Vì sẽ có nhiều trường hợp xử lý bằng lệnh ansible hơn là cố gắng kết nối trực tiếp bằng lệnh ssh, hãy lưu thông tin kết nối trực tiếp vào tệp máy chủ ansible và sử dụng nó mà không cần tiếp tục tác vụ ssh-copy-id. Trong phần này, bạn có thể lưu thông tin tài khoản truy cập Windows (tôi đã nhập thông tin tài khoản người dùng và mật khẩu với đặc quyền của quản trị viên) trong các trường ansible_user và ansible_password. Sau khi hoàn thành thông tin tệp máy chủ ansible, hãy sử dụng lệnh ansible sau để kiểm tra xem mô-đun ping có chạy bình thường hay không.
cửa sổ ansible -m in_ping -u [tài khoản windows]

Trước khi chạy ansible-playbook, hãy kiểm tra xem tệp kê khai K8s được lưu trữ ở đâu trong Windows và kiểm tra tài nguyên Kubernetes bằng lệnh kubectl. Trong ví dụ bên dưới, chúng tôi đang kiểm tra danh sách Dịch vụ của K8s và xác nhận rằng các dịch vụ do người dùng tạo không phải là các dịch vụ được tạo theo mặc định sẽ không hiển thị.

Kiểm tra nội dung của tệp playbook trong ansible-server. Vì lệnh sẽ được chuyển tới Windows, hãy sử dụng lệnh win_command như trong ví dụ bên dưới (đối với MacOS, hãy sử dụng lệnh lệnh) và chỉ định vị trí của tệp kê khai mà bạn muốn chạy dưới dạng đường dẫn tuyệt đối. Bạn có thể chạy tệp playbook và kiểm tra kết quả thực hiện.

Cuối cùng, bạn có thể sử dụng lệnh kubectl để kiểm tra xem các tài nguyên được thực thi trong Windows có được phản ánh đúng hay không.

Nếu bạn có thêm bất kỳ câu hỏi nào về những điều trên, vui lòng để lại tin nhắn trên bảng câu hỏi.
Tôi hy vọng điều này sẽ giúp ích cho những ai đang quan tâm đến vấn đề này.
Cảm ơn
Xin chào, đây là Lee Do-won.
Khi giảng bài “Xây dựng đường ống CI/CD bằng Jenkins”, nhiều bạn gặp khó khăn trong việc cấu hình môi trường lab nên chúng tôi đã tạo và chia sẻ một bài giảng riêng về cách cấu hình môi trường với VM. Môi trường lab cho phép người dùng Windows và MacOS (chip Intell) định cấu hình VM trong môi trường sử dụng VirtualBox, thay vì môi trường Docker + SSH hiện có. Xin lưu ý rằng chúng tôi đã tạo môi trường phòng thí nghiệm một cách dễ dàng bằng cách sử dụng Docker được cài đặt trên máy ảo.
Cảm ơn
Xin chào, đây là Lee Do-won.
Trước hết tôi xin cảm ơn tất cả mọi người đã tham dự buổi thuyết trình.
Khóa học này là một khóa học đòi hỏi đào tạo thực tế làm cơ sở. Đặc biệt, chúng tôi khuyên bạn nên tự mình cài đặt và thực hành các máy chủ Jenkins, Tomcat hoặc Docker.
Thật không may, một số sinh viên (đặc biệt là người dùng Windows) đã viết rằng họ gặp khó khăn trong việc thiết lập môi trường cần thiết để tiến hành phòng thí nghiệm. Mặc dù chúng tôi chưa thể kiểm tra tất cả các môi trường nhưng chúng tôi đã chuẩn bị và thử nghiệm một số môi trường có thể được xây dựng và chia sẻ các tài nguyên và tập lệnh liên quan. Chúng tôi muốn gửi lời xin lỗi đến những sinh viên không thể giải quyết vấn đề.
Chúng tôi đã cung cấp hướng dẫn thực hành trong môi trường Windows + SSH + Dokcer thông qua các câu hỏi và câu trả lời cũng như các video bổ sung mà chúng tôi đã chia sẻ trước đó.
Windows) Lệnh thực thi máy chủ SSH (có Docker) (Phương pháp 1)
docker run --privileged --name docker-server -itd -p 10022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/docker:latest /usr /sbin/init
Windows) Lệnh thực thi máy chủ SSH (có Docker) (Phương pháp 2, nếu lệnh trên không thực thi)
docker run -itd --name docker-server -p 10022:22 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v / var/run/docker.sock:/var/run/docker.sock edowon0623/docker:latest /usr/sbin/init
Tất cả các bài tập bên dưới đều hoạt động bình thường trên một số PC Windows mà chúng tôi đã thử nghiệm, nhưng chúng tôi nhận thấy có lỗi trong bài tập 1 trên PC Windows mới mua gần đây (đã cài đặt WSL2). Nguyên nhân của lỗi mà chúng tôi hiện đã xác định là do lỗi sau đã xảy ra trong quá trình tạo iptables trong WSL2. Mặc dù chúng tôi đã tìm kiếm nhiều thông tin khác nhau và giải quyết vấn đề nhưng nó không hoạt động bình thường với hình ảnh chúng tôi đã tạo, vì vậy chúng tôi tạm thời. đã xóa chức năng iptables và tạo hình ảnh. Sau khi thử nghiệm, chúng tôi đã xác định rằng cho đến nay, việc thực hành có thể được thực hiện mà không gặp bất kỳ vấn đề lớn nào, vì vậy chúng tôi đang chia sẻ hình ảnh và Dockerfile.
https://hub.docker.com/r/edowon0623/docker/tags -> docker pull edowon0623/docker:no_iptables
https://github.com/joneconsulting/docker-files
Do đó, nếu máy chủ Docker không khởi động trong môi trường Windows bằng phương pháp Dind (thực hành phương pháp Scrib 1), vui lòng thử sử dụng lệnh bên dưới.
Windows) Lệnh thực thi máy chủ SSH (có Docker) (Phương pháp 3)
docker run --privileged --name docker-server -itd -p 10022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/docker:no_iptables /usr /sbin/init
Tất nhiên, sau khi khởi động Docker container, bạn phải kết nối với SSH và chạy lệnh systemctl start docker để khởi động máy chủ Docker.
Một lần nữa xin cảm ơn các bạn đã quan tâm đến bài giảng Chúng tôi sẽ chuẩn bị những bài giảng mới với nội dung tốt hơn.
Cảm ơn
Xin chào, đây là Lee Do-won.
Chúng tôi đã thêm tài liệu bài giảng về cách triển khai các ứng dụng viết bằng Nodejs trong bài giảng về xây dựng Đường ống CI/CD bằng Jenkins. Bạn đã yêu cầu nội dung này từ tháng 9 năm ngoái và mặc dù số lượng không lớn nhưng cuối cùng chúng tôi cũng tải nó lên. Xin lỗi vì đã tải dữ liệu lên quá muộn.
Phần này giải thích quy trình khởi chạy ứng dụng Nodejs thông qua Trình quản lý quy trình có tên PM2, phân phối và thực thi nó dưới dạng hình ảnh Docker. Tuy thông tin còn chưa đầy đủ nhưng chúng tôi hy vọng sẽ giúp ích phần nào cho những ai cần, nếu có thắc mắc gì thêm vui lòng để lại tin nhắn trên bảng thông báo. Gần đây mình chưa thể kiểm tra ngay do deadline của dự án nhưng mình sẽ kiểm tra và phản hồi sớm nhất có thể.
Tôi hy vọng bạn sẽ kết thúc năm còn lại của năm 2022 một cách an toàn và đạt được thành công trong mọi việc mình làm.
Cảm ơn.

