Trong mỗi phân đoạn này, nhóm phát triển thực hiện đầy đủ các công việc cần thiết: lập kế hoạch, phân tích yêu cầu, thiết kế, triển khai, kiểm thử, … để cho ra các phần nhỏ của sản phẩm.
Trang 1KHOA CÔNG NGHỆ PHẦN MỀM
o
BÁO CÁO THỰC TẬP DOANH NGHIỆP ỨNG DỤNG AVAILABILITY CHAT SERVICE
Thành phố Hồ Chí Minh, tháng 6 năm 2022
Trang 2tế và chuyên nghiệp tại công ty
Lời đầu tiên, em xin gửi lời cảm ơn chân thành nhất đến trường và quý thầy cô khoa Công nghệ phần mềm đã truyền đạt vốn kiến thức làm nền tảng cho em trong quá trình thực tập
Tiếp đến, em xin gửi lời cảm ơn chân thành đến quý công ty DEK Technologies Việt Nam Không vì dịch bệnh nặng nề, công ty đã tạo cơ hội thuận lợi nhất và giành nhiều quyền lợi cho em trong thời gian thực tập Em được hưởng quyền lợi như những nhân viên chính thức, được tham gia các buổi training của công ty, tham gia các workshop, seminar, liên hoan, giải trí khi có dịp lễ hội, ngày đặc biệt trong năm
Cũng không quên gửi lời cảm ơn chân thành đến anh Lâm Khang – PO team CBA, các anh mentor team CBA và các chị phòng nhân sự đã có nhiều chỉ bảo tận tình và giúp đỡ
em trong quá trình thực tập nói chung và phát triển sản phẩm nói riêng
Cuối cùng, xin gửi lời cảm ơn đến tất cả các bạn trong team thực tập đã luôn luôn cố gắng, giúp đỡ để hoàn thành tốt sản phẩm mang tính thực tiễn cao trong quá trình thực tập
Xin chúc tất cả mọi người nhiều sức khỏe, thành công trong cuộc sống
Em xin chân thành cảm ơn!
Hà Minh Thành
Hồ Chí Minh, ngày 17 tháng 6 năm 2022
Trang 3NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Trang 4MỤC LỤC
LỜI CẢM ƠN 2
NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN 3
MỤC LỤC 4
DANH MỤC HÌNH ẢNH 7
CHƯƠNG 1: GIỚI THIỆU CÔNG TY DEK TECHNOLOGIES VIỆT NAM 9
1.1 Thông tin chung 9
1.2 Lĩnh vực hoạt động 9
1.3 Đối tác công ty 9
CHƯƠNG 2 KIẾN THỨC- KỸ NĂNG ĐÃ ĐƯỢC TẬP HUẤN 11
2.1 Kiến thức về Linux 11
2.1.1 Tổng quan về Linux 11
2.1.2 Vai trò của Linux mang lại cho doanh nghiệp 13
2.2 Kiến thức về Scrum 14
2.2.1 Tổng quan về Scrum [1] 14
2.2.2 Vai trò của Scrum mang lại cho doanh nghiệp 17
2.3 Kiến thức về Git 17
2.3.1 Tổng quan về Git 17
2.3.2 Vai trò của Git mang lại cho doanh nghiệp 18
2.4 Kiến thức về CI 18
2.4.1 Tổng quan về CI 18
Trang 52.4.2 Vai trò của CI mang lại cho doanh nghiệp 21
2.5 Kiến thức về Google Test 22
2.5.1 Tổng quan về Google Test 22
2.5.2 Vai trò của Google Test mang lại cho doanh nghiệp 24
2.6 Kiến thức về Docker 24
2.6.1 Tổng quan về Docker [4] 24
2.6.2 Vai trò của Docker mang lại cho doanh nghiệp 25
2.7 Kiến thức về Kubernetes 26
2.7.1 Tổng quan về Kubernetes [5] 26
2.7.2 Vai trò của Kubernetes mang lại cho doanh nghiệp 28
2.8 Tìm hiểu và sử dụng công cụ Qt Creator và Qt Design 29
CHƯƠNG 3 TÓM TẮT QUÁ TRÌNH THỰC TẬP 31
3.1 Giới thiệu nhóm dự án và công việc mỗi tuần 31
3.1.1 Nhóm dự án 31
3.1.2 Lịch thực tập 31
3.1.3 Bảng chi tiết công việc mỗi tuần 32
3.2 Các công việc đã thực hiện 33
3.2.1 Quá trình giao công việc 33
3.2.2 Các công cụ sử dụng trong quá trình làm việc 34
3.2.3 Nhiệm vụ được giao 34
CHƯƠNG 4 MÔ TẢ CÔNG VIỆC 36
4.1 Dự án xây dựng ứng dụng Availability Chat Service 36
Trang 64.1.1 Thông tin chung 36
4.1.2 Chi tiết cách hoạt động và tính năng 36
4.1.3 Giao diện hệ thống 44
CHƯƠNG 5 ĐÁNH GIÁ- NHẬN XÉT 51
5.1 Kết quả đạt được 51
5.1.1 Những kiến thức lý thuyết đã được cũng cố: 51
5.1.2 Những kỹ năng thực hành đã được học thêm: 51
5.2 Những hạn chế 52
5.3 Bài học kinh nghiệm 52
5.4 Quy trình công việc và các hoạt động trong tương lai 54
Tài liệu tham khảo: 55
Trang 7DANH MỤC HÌNH ẢNH
Hình 1:Mô hình làm việc Scrum 15
Hình 2: Mô hình làm việc Cross-functional 16
Hình 3: Quá trình tích hợp CI 19
Hình 4: Pipeline CI 20
Hình 5: Đồ thị Pipeline 21
Hình 6: File test_server.cpp 23
Hình 7: Kết quả run file test_server.cpp 24
Hình 8: Quy trình, các bước hoạt động của Docker 25
Hình 9: Kiến trúc của Kubernetes 26
Hình 10: Tạo mới project demo bằng QtCreator 29
Hình 11: Dùng Qt Design thiết kế giao diện 30
Hình 12: Giao task của mỗi Sprint qua Trello 34
Hình 13: Biểu đồ quá trình khởi tạo kết nối client server 37
Hình 14: Client nhập đúng tài khoản 38
Hình 15: Client nhập sai tài khoản 38
Hình 16: Flowchart deploy Docker 39
Hình 17 Flowchart deploy Kubernets 40
Hình 18 Deploy trên Kubernets 40
Hình 19: Pipeline CI 41
Hình 20: Chi tiết Pipeline 41
Hình 21: Tìm kiếm user bằng một từ bất kỳ 42
Hình 22: Chat 1-1 43
Hình 23: Đổi màu tin nhắn 43
Hình 24: Giao diện đăng nhập 44
Hình 25: Đăng nhập không thành công 44
Hình 26: Đăng nhập thành công 45
Trang 8Hình 27: Giao diện đăng ký 45
Hình 28: Giao diện đăng ký không thành công 46
Hình 29: Giao diện điền mật khẩu không hợp lệ 47
Hình 30: Giao diện điền lại mật khẩu không hợp lệ 47
Hình 31: Giao diện đăng ký thành công 48
Hình 32: Giao diện màn hình chính 49
Hình 33: Tìm kiếm tài khoản bạn bè 49
Hình 34: Đổi màu tin nhắn 50
Hình 35: Giao diện profile 50
Trang 9CHƯƠNG 1: GIỚI THIỆU CÔNG TY DEK TECHNOLOGIES VIỆT NAM 1.1 Thông tin chung
− Tóm tắt thông tin: DEK Technologies là công ty gia công, phát triển các giải pháp phần mềm và phần cứng nước ngoài có trụ sở chính ở Melbourne - Úc, được thành lập năm 1999 Công ty hiện tại có 4 chi nhánh ở Stockholm - Thụy Điển, Rome – Ý, thành phố Hồ Chí Minh - Việt Nam và chi nhánh đang mở tại Thung lũng Silicon –
Mỹ DEK Technologies Việt Nam được thành lập vào năm 2008, là văn phòng lớn nhất với hơn 170 nhân viên người Việt và được dẫn dắt bởi một giám đốc người Úc
- Daniel Tedesco Nhờ đó, môi trường làm việc nơi đây mang đậm nét riêng của văn hóa phương Tây
− Các sản phẩm của công ty:
+ Telegea
+ IoT Platform
+ Các sản phẩm dựa trên mã nguồn mở
− Trụ sở chính của công ty tại Việt Nam: 121/137 Lê Lợi, phường Bến Thành, quận
Trang 10+ Dịch vụ hỗ trợ doanh nghiệp
+ 100% các khóa đào tạo và chứng nhận OpenStack
Trang 11CHƯƠNG 2 KIẾN THỨC- KỸ NĂNG ĐÃ ĐƯỢC TẬP HUẤN
+ Tính ổn định và tin cậy cao: Khả năng xử lý cùng lúc một lượng lớn các tác vụ
mà không bị xuống cấp trong một khoảng thời gian dài được xem là ưu điểm nổi bật nhất của Linux
+ Bảo mật
• Trước khi chạy một tiến trình nó yêu cầu phải thực hiện hàng loạt các thao tác cấu hình phân quyền, cho phép truy cập, tường lửa…Điều này đòi hỏi người dùng phải hiểu rõ công việc mà mình đang thực hiện
+ Một số nhà sản xuất không phát triển driver hỗ trợ cho nên tảng Linux
+ Một số phần mềm chuyên biệt không được phát triển dành cho Linux
+ Còn quá xa lạ đối với người dùng phổ thông
Trang 12− Một số lệnh cơ bản trong Linux:
1 pwd command
− Command pwd được dùng để tìm đường dẫn của thư mục hiện tại (folder) mà ta đang ở trong đó Command này sẽ trả về đường dẫn hoàn chỉnh (đầy đủ), bắt đầu bằng dấu gạch chéo (/) Ví dụ một đường dẫn hoàn chỉnh là /home/minhthanh
− Command ls được dùng để xem nội dung thư mục Mặc định là command này
sẽ hiển thị danh sách file trong thư mục hiện tại
− Nếu muốn xem nội dung thư mục khác, nhập ls và sau đó là đường dẫn thư mục
Ví dụ: nhập ls /home/username/Documents để xem nội dung của Documents
4 Command cat
− cat được dùng để xem nội dung file trên output tiêu chuẩn (sdout) Để chạy lệnh này, gõ cat theo sau là tên file và phần mở rộng Ví dụ: cat file.txt
5 Command cp
− Sử dụng command cp để sao chép files từ thư mục hiện tại Chẳng hạn, command
cp photo1.jpg /home/username/Pictures sẽ tạo bản copy của photo1.jpg vào thư mục Pictures
6 Command mv
− Công dụng chính của command mv là di chuyển files, dù nó cũng có thể được dùng để đổi tên files
Trang 13− Arguments trong command này tương tự như command cp Ta cần nhập mv, tên file và điểm đến của thư mục Ví dụ: mv file.txt /home/username/Documents
− Để đổi tên files, cú pháp là mv oldname.ext newname.ext
7 Command mkdir
− Command mkdir được dùng để tạo thư mục mới – giống như mkdir Music sẽ tạo thư mục mới gọi là Music
− Một số cách dùng cộng thêm của lệnh mkdir:
+ Để tạo một thư mục mới bên trong thư mục khác, sử dụng lệnh Linux cơ bản sau: mkdir Music/Newfile
+ Sử dụng p (parents) option để tạo thư mục giữa 2 thư mục đã tồn tại Ví dụ, mkdir -p Music/2020/Newfile sẽ tạo thư mục “2020”
8 Command rm
− Command rm được sử dụng để xóa thư mục cùng và nội dung bên trong Nếu ta chỉ muốn xóa thư mục– sử dụng rm -r
9 Command touch
− Command touch cho phép ta tạo files mới trống thông qua dòng lệnh
− Ví dụ: nhập touch /home/username/Documents/test.txt để tạo file test.txt trong thư mục Documents
10 Command echo
− Lệnh này được dùng để chuyển dữ liệu vào một file
− Ví dụ, nếu muốn thêm text “Hello, my name is Thanh” vào trong file “name.txt”, nhập lệnh: echo Hello, my name is Thanh >> name.txt
2.1.2 Vai trò của Linux mang lại cho doanh nghiệp
− Tổ chức, quản lý và vận hành các máy chủ, các dịch vụ trong hệ thống thông tin
− Tạo môi trường, cung cấp các công cụ, các chính sách giải pháp bảo vệ an toàn thông tin cho các tổ chức, doanh nghiệp và cá nhân
Trang 14− Linux là một hệ thống thông tin an toàn, bảo mật và miễn phí
2.2 Kiến thức về Scrum
2.2.1 Tổng quan về Scrum [1]
− Scrum là một phương pháp Agile (Phát triển phần mềm linh hoạt) dựa trên cơ chế lặp và tăng trưởng Scrum được thiết kế để hỗ trợ việc phát triển, cung cấp và cải tiến các sản phẩm phức tạp
− Với Scrum, dự án sẽ được thực hiện trong các phân đoạn lặp đi lặp lại (được gọi là sprint) thường có khung thời gian ngắn (từ 1 – 4 tuần) Trong mỗi phân đoạn này, nhóm phát triển thực hiện đầy đủ các công việc cần thiết: lập kế hoạch, phân tích yêu cầu, thiết kế, triển khai, kiểm thử, … để cho ra các phần nhỏ của sản phẩm Phù hợp cho những dự án có sự điều chỉnh liên tục, thay đổi trong quá trình phát triển, yêu cầu tốc độ cao
− Với mô hình phát triển lặp đi lặp lại Scrum, có 3 vai trò chính:
+ Product Owner: Quản lý Product Backlog Định nghĩa các yêu cầu của khách hàng và đánh giá cuối cùng đầu ra của các nhà phát triển phần mềm
+ Scrum Master: chịu trách nhiệm về hiệu quả của nhóm, đảm bảo nhóm làm đúng
mô hình làm việc, cũng như đảm bảo các sprint được hoàn thành đúng mục đích + Development Team (Dev, Test, …): lập kế hoạch cho các sprint, thiết kế, thực hiện và triển khai yêu cầu từ đầu
Trang 15Hình 1:Mô hình làm việc Scrum
− Scrum định nghĩa quy tắc cho bốn sự kiện chủ chốt (các cuộc họp) nhằm tạo môi trường và quy cách hoạt động và cộng tác cho các thành viên trong dự án
− Sprint là một phân đoạn lặp đi lặp lại trong quy trình phát triển phần mềm, thường
có khung thời gian ngắn (từ 1 – 4 tuần)
+ Sprint Planning (Họp Kế hoạch Sprint)
• Nhóm phát triển gặp gỡ với Product Owner để lên kế hoạch làm việc cho một Sprint Công việc lập kế hoạch bao gồm việc chọn lựa các yêu cầu cần phải phát triển, phân tích và nhận biết các công việc phải làm kèm theo các ước lượng thời gian cần thiết để hoàn tất các tác vụ
• Scrum sử dụng cách thức lập kế hoạch từng phần và tăng dần theo thời gian, theo đó, việc lập kế hoạch không diễn ra duy nhất một lần trong vòng đời của
dự án mà được lặp đi lặp lại, có sự thích nghi với các tình hình thực tiễn trong tiến trình đi đến sản phẩm
+ Daily Scrum (Họp Scrum hằng ngày)
Trang 16• Scrum Master tổ chức cho Đội sản xuất họp hằng ngày trong khoảng 15 phút
để Nhóm Phát triển chia sẻ tiến độ công việc cũng như chia sẻ các khó khăn gặp phải trong quá trình phát triển phần mềm suốt một Sprint
+ Sprint Review (Họp Sơ kết Sprint)
• Cuối Sprint, nhóm phát triển cùng với Product Owner sẽ rà soát lại các công việc đã hoàn tất (DONE) trong Sprint vừa qua và đề xuất các chỉnh sửa hoặc thay đổi cần thiết cho sản phẩm
+ Sprint Retrospective (Họp Cải tiến Sprint)
• Dưới sự trợ giúp của Scrum Master, nhóm phát triển sẽ rà soát lại toàn diện Sprint vừa kết thúc và tìm cách cải tiến quy trình làm việc cũng như bản thân sản phẩm
− Theo đó, công ty định sẵn đặc trưng Scrum là Cross-Functional – liên chức năng: + Các thành viên kỹ năng bổ trợ cho nhau, tự hoàn thành công việc mà không phụ thuộc người khác bên ngoài nhóm
+ Không có các chức danh nào khác ngoài Team members (hoặc Developers)
Hình 2: Mô hình làm việc Cross-functional
Trang 172.2.2 Vai trò của Scrum mang lại cho doanh nghiệp
− Scrum thích ứng nhanh với sự thay đổi yêu cầu
− Scrum vận hành dựa trên đặc tính tự nhiên của người phát triển nên rất dễ hiểu, dễ
áp dụng, tạo nên tính tương tác cao giữa các thành viên trong nhóm thay vì chịu sự
áp đặt từ phía bên ngoài
− Scrum giúp team tập trung vào sản phẩm, thích ứng nhanh với các thay đổi về yêu cầu từ đó tạo nên sự tương tác cao giữa khách hàng với nhóm phát triển để sản phẩm làm ra đáp ứng đúng với các yêu cầu của khách hàng
2.3 Kiến thức về Git
2.3.1 Tổng quan về Git
− Git là phần mềm quản lí mã nguồn phân tán
− Git là một hệ thống VCS (Version Control System) đi theo hướng quản lí source code phân tán, khác với SVN và CVS là hệ thống quản lí mã nguồn đi theo hướng quản lí source code tập trung
− Các hệ thống giúp quản lí dự án hiện nay như: github, gitlab, Jira ticket, Backlog
− Một số lệnh cơ bản
+ git init: Khởi tạo git repo, sẽ tạo ra một thư mục git, thư mục này chứa tất cả các tập tin cần thiết cho repo
+ git clone: Sao chép một remote repo về máy tính mình
+ git status: để kiểm tra trạng thái của tệp tin (staged, modified, committed)
+ git add: Cập nhật các file lên Staging Area
+ git commit: Cập nhật file lên local repository
+ git push: Cập nhật file từ local repository lên remote repository
+ git fetch: Cập nhật các thay đổi từ remote repo về local repo, nhưng không tiến hành merge
Trang 18+ git pull: Cập nhật những thay đổi từ remote repo về local repo, đồng thời tiến hành merge
+ git merge: Gộp các branch lại với nhau
+ git rebase: Gộp các commit lại với nhau
+ git branch: xem các branch
+ git checkout <name-branch>: checkout sang branch
+ git checkout -b <name branch>: vừa tạo ra vừa checkout sang branch mới + git commit amend: sửa code mà không muốn tạo commit mới
2.3.2 Vai trò của Git mang lại cho doanh nghiệp
− Giúp quy trình làm việc code theo nhóm đơn giản hơn rất nhiều bằng việc kết hợp các phân nhánh (branch)
− Sắp xếp công việc tốt hơn
− Linh hoạt hơn khi cùng lúc phải làm nhiều task
− Tự tin thử nghiệm những ý tưởng mới
− Dễ dàng trong việc phát triển sản phẩm
− Có thể làm việc bất cứ đâu, chỉ cần clone mã nguồn từ repo về máy
2.4 Kiến thức về CI
2.4.1 Tổng quan về CI
− CI là tên viết tắt của Continuous Integration, hay còn gọi là tích hợp liên tục Quá trình hoạt động cho phép các thành viên trong một team liên tục lưu trữ những mã mới vào một kho nhất định Nhờ vào số lượng dữ liệu này, CI sẽ tự động chạy test
và kiểm tra độ chính xác Cùng lúc đó cũng hỗ trợ phát triển phần mềm một cách nhanh chóng hơn bằng việc báo lỗi sai và đưa ra gợi ý giải quyết [2]
− Về chi tiết, khi bản mã được lập trình viên tải lên kho lưu trữ CI sẽ tự động nhận dữ liệu và tiến hành kiểm tra Bằng nhiều thước đo khác nhau, CI đảm bảo mã nguồn không còn bất kỳ lỗi nào khi chạy trong bất cứ điều kiện nào Mỗi tiến trình đều sẽ
Trang 19có thông báo trả về để người dùng có thể nắm rõ tiến trình phát triển của phần mềm Cùng với đó nhận biết những lỗi sai mắc phải và rút kinh nghiệm cho lần tiếp theo [2]
Hình 3: Quá trình tích hợp CI
− Quá trình tích hợp mã vào kho cũng có thể diễn ra tự động nếu được cài đặt trước Vậy nên dây chuyền tích hợp – kiểm tra – test – report sẽ diễn ra liền mạch và tự động Lập trình viên có thể tiết kiệm thời gian để phát triển những phần khác và quay trở lại xem báo cáo sau khi phần này đã được build và test xong [2]
− Các yêu cầu cơ bản cho một hệ thống CI đó là: [2]
+ Build được chạy tự động
+ Test được chạy tự động
+ Thường xuyên commits các thay đổi tới repository của dự án
+ Cung cấp giao diện dễ nhìn cho các tiền trình của hệ thống cũng như real-time status cho cả team có thể theo dõi
+ Bên cạnh đó cũng cần một Version Control System (VCS) Xem như một nơi tập trung hóa cũng như lưu giữ các thay đổi mà chúng ta tạo ra cho dự án theo thời gian Ngoài ra cũng cần một server hoặc máy ảo để có thể chạy hệ thống CI tại chỗ
− CI với Gitlab CI [3]
+ Gitlab có tính năng Gitlab CI, code để ở Gitlab, rồi trong đó có cho cài đặt CI để test và deploy code tự động
Trang 20+ Để GitLab CI cỏ thể hoạt động được chúng ta sẽ cần 02 thành phần:
• File gitlab-ci.yml: nằm trong thư mục gốc của repo, file này sẽ định nghĩa các Job để thực hiện, các Job sẽ chạy như thế nào, ở đâu và cấu hình project
▪ Một Pipeline CI sinh ra và report sẽ được hiển thị giao diện sau
Hình 4: Pipeline CI
+ Pipelines là thành phần cấp cao nhất của tích hợp, phân phối và triển khai liên tục Pipeline bao gồm:
• Jobs: Các công việc được giao thực thi (Ví dụ: biên dịch mã hoặc chạy test)
• Stage: Xác định các thời điểm và cách thực hiện (Ví dụ: test chỉ chạy sau khi biên dịch thành công)
• Pipeline hoạt động theo nguyên tắc sau:
▪ Tất cả các công việc trong cùng một stage được Runner thực hiện song song, nếu có đủ số lượng Runner đồng thời
▪ Nếu Success, pipeline chuyển sang stage tiếp theo
Trang 21▪ Nếu Failed, pipeline sẽ dừng lại Có một ngoại lệ là nếu job được đánh dấu làm thủ công, thì dù bị fail thì pipeline vẫn tiếp tục
▪ Bên dưới là ví dụ về đồ thị Pipeline thông thường:
Hình 5: Đồ thị Pipeline
+ Tóm lại, các bước để Gitlab CI hoạt động như sau:
• Thêm.gitlab-ci.yml vào thư mục gốc của repo
• Cấu hình gitlab Runner
2.4.2 Vai trò của CI mang lại cho doanh nghiệp
− Giảm thiểu đi những rủi ro nhờ việc phát hiện và sửa lỗi sớm, giúp tăng chất lượng sản phẩm nhờ khả năng tự động kiểm tra và quan sát
− Không những vậy, những quy trình thủ công lặp đi lặp lại hằng ngày cũng được giảm tải, thay vào đó là xây dựng và kiểm thử tự động mà không cần đến sự giúp đỡ của con người
− Một đặc điểm nữa của CI chính là có thể deploy, triển khai phần mềm ở bất cứ địa điểm và thời gian nào
− Ngoài ra, việc tích hợp mã lên CI tăng tính chia sẻ giữa các thành viên Khi thông tin được cập nhật liên tục, các thành viên trong team sẽ có những kế hoạch triển khai phù hợp cho phần việc của bản thân
Trang 222.5 Kiến thức về Google Test
2.5.1 Tổng quan về Google Test
− Google Test (còn được gọi là gtest) là một thư viện kiểm thử đơn vị cho ngôn ngữ lập trình C ++, dựa trên kiến trúc xUnit, là một tập hợp của các “Frameworks” để lập trình và thực thi tự động các trường hợp thử nghiệm
− Nói cách khác, chúng ta không phải liệt kê tất cả thử nghiệm trong bộ thử nghiệm của mình theo cách thủ công Nó hỗ trợ một tập hợp phong phú các xác nhận như xác nhận nghiêm trọng (ASSERT_), xác nhận không nghiêm trọng (EXPECT_) và death test để kiểm tra xem chương trình có kết thúc dự kiến hay không
− Cách setup và sử dụng Google Test trên Ubuntu:
1 Install source package của Gtest
+ Trên terminal gõ lệnh sau:
sudo apt-get install libgtest-dev
+ Sau khi kết thúc lệnh này, source code của Gtest sẽ được download về đường dẫn /usr/src/gtest Việc tiếp theo là build thư viện Gtest từ source code này
2 Build thư viện Gtest
+ Cài đặt cmake:
sudo apt-get install cmake
+ Thực hiện build thư viện:
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make
+ Copy thư viện Gtest vừa build vào đường dẫn /usr/lib
sudo cp *.a /usr/lib
3 Thực hiện Unit test với Gtest
+ Giả sử chúng ta cần thực hiện Unit test: one client connect to server
Trang 23Hình 6: File test_server.cpp
4 Build và chạy Unit test
+ Di chuyển vào folder test: cd test
+ Tạo folder build: mkdir build
+ Di chuyển vào folder build và tạo Makefile bằng lệnh cmake
Trang 24Hình 7: Kết quả run file test_server.cpp
2.5.2 Vai trò của Google Test mang lại cho doanh nghiệp
− Googletest giúp viết các C ++ tests tốt hơn
− Độc lập và lặp lại: Googletest tách biệt các tests bằng cách chạy mỗi test trên một đối tượng khác nhau
− Di động và Có thể tái sử dụng: Googletest hoạt động trên các hệ điều hành khác nhau (Linux, Windows hoặc Mac), với các trình biên dịch khác nhau
− Khi các test không thành công, nó phải cung cấp càng nhiều thông tin về vấn đề càng tốt
để viết code
Trang 25Hình 8: Quy trình, các bước hoạt động của Docker
+ Build: đầu tiên truy cập Docker và tạo lập một dockerfile, trong đó chứa code của người dùng Dockerfile này sẽ được thiết lập trên thiết bị đã được cài đặt Docker Engine Sau khi tạo Dockerfile, người dùng sẽ có 1 Container lưu trữ bộ thư viện
và ứng dụng của mình
+ Push: có được container sẽ được người dùng push lên đám mây và lưu trữ tại đó Thao tác này được thực hiện qua mạng Internet
+ Pull, Run: thao tác này áp dụng khi người dùng muốn truy cập container này bằng
1 thiết bị khác (đã được cài đặt Docker Engine) thì yêu cầu phải Pull container này về máy và cho phép quá trình Run Container diễn ra
2.6.2 Vai trò của Docker mang lại cho doanh nghiệp
− Nhanh chóng và tiện lợi: Nếu như trước đây thực hiện ứng dụng/ dịch vụ trên VMs phải tốn mất vài chục phút thì với Docker thì nó sẽ giảm xuống còn vài phút
− Tiết kiệm tối đa tài nguyên: Mỗi một Docker container nếu như sử dụng bao nhiêu resource thì sẽ tốn bấy nhiêu, nếu như không sử dụng thì tất cả tài nguyên sẽ được mang trả về cho máy chủ host
Trang 26− Mức độ tự động của hệ thống sẽ mở rộng cao hơn: Để đáp ứng được mọi nhu cầu phục vụ cho người dùng thì việc khởi tạo và tắt đi của một docker container diễn ra
dễ dàng hơn cũng như dựa trên nhiều metric của hệ thống
2.7 Kiến thức về Kubernetes
2.7.1 Tổng quan về Kubernetes [5]
− Kubernetes, hoặc k8s là một nền tảng mã nguồn mở tự động hoá việc quản lý, scaling
và triển khai ứng dụng dưới dạng Nó loại bỏ rất nhiều các quy trình thủ công liên quan đến việc triển khai và mở rộng các containerized applications
− Kubernetes orchestration cho phép xây dựng các dịch vụ ứng dụng mở rộng nhiều containers Nó lên lịch các containers đó trên một cụm, mở rộng các containers và quản lý tình trạng của các containers theo thời gian
− K8s quản lý nhiều Docker host bằng cách tạo các container cluster (cụm container)
− Kiến trúc của Kubernetes: Ở một mức vô cùng cao, Kubernetes có các thành phần chính như sau:
+ Một nút master hoặc nhiều hơn, đây là một bộ phận của control plane
+ Một nút worker hoặc nhiền hơn
Hình 9: Kiến trúc của Kubernetes
Trang 27− Khái niệm cơ bản trong Kubernetes:
+ Master node: Là server điều khiển các máy Worker chạy ứng dụng Master node bao gồm 4 thành phần chính:
• Kubernetes API Server: là thành phần giúp các thành phần khác liên lạc nói chuyện với nhau
• Scheduler: Thành phần này lập lịch triển khai cho các ứng dụng, ứng dụng được đặt vào Worker nào để chạy
• Controler Manager: Thành phần đảm nhiệm phần quản lý các Worker, kiểm tra các Worker sống hay chết, đảm nhận việc nhân bản ứng dụng…
• Etcd: Đây là cơ sở dữ liệu của Kubernetes, tất cả các thông tin của Kubernetes được lưu trữ cố định vào đây
+ Worker node: Là server chạy ứng dụng trên đó Bao gồm 3 thành phần chính:
• Container runtime: Là thành phần giúp chạy các ứng dụng dưới dạng Container Thông thường người ta sử dụng Docker
• Kubelet: đây là thành phần giao tiếp với Kubernetes API Server, và cũng quản
là cho phép các quản trị viên có thể quản trị được cụm Kubernetes
+ Pod: Là khái niệm cơ bản và quan trọng nhất trên Kubernetes Bản thân Pod có thể chứa 1 hoặc nhiều hơn 1 container Pod chính là nơi ứng dụng được chạy trong
đó Pod là các tiến trình nằm trên các Worker Node Bản thân Pod có tài nguyên riêng về file system, cpu, ram, volumes, địa chỉ network…
+ Image: Là phần mềm chạy ứng dụng đã được gói lại thành một chương trình để
có thể chạy dưới dạng container Các Pod sẽ sử dụng các Image để chạy Các
Trang 28Image này thông thường quản lý ở một nơi lưu trữ tập trung, ví dụ như Docker Hub là nơi chứa Images của nhiều ứng dụng phổ biến như nginx, mysql, wordpress…
+ Deployment: Là cách thức để giúp triển khai, cập nhật, quản trị Pod
+ Replicas Controller: Là thành phần quản trị bản sao của Pod, giúp nhân bản hoặc giảm số lượng Pod
+ Service: Là phần mạng (network) của Kubernetes giúp cho các Pod gọi nhau ổn định hơn, hoặc để Load Balancing giữa nhiều bản sao của Pod, và có thể dùng để dẫn traffic từ người dùng vào ứng dụng (Pod), giúp người dùng có thể sử dụng được ứng dụng
+ Label: Label ra đời để phân loại và quản lý Pod Người dùng có thể đánh nhãn các Pod chạy ở theo chức năng frontend, backend, chạy ở môi trường dev, qc, uat, production…
2.7.2 Vai trò của Kubernetes mang lại cho doanh nghiệp
− Điều phối bộ nhớ: Kubernetes cho phép ta tự động mount một hệ thống lưu trữ mà
ta chọn, như local storages, public cloud providers, v.v
− Tự động rollouts và rollbacks: Ta có thể mô tả trạng thái mong muốn cho các container được triển khai dùng Kubernetes và nó có thể thay đổi trạng thái thực tế sang trạng thái mong muốn với tần suất được kiểm soát Ví dụ, ta có thể tự động hoá Kubernetes để tạo mới các container cho việc triển khai của mình, xoá các container hiện có và áp dụng tất cả các resource của chúng vào container mới
− Đóng gói tự động: Ta cung cấp cho Kubernetes một cluster gồm các node mà nó có thể sử dụng để chạy các tác vụ được đóng gói (containerized task) Cho Kubernetes biết mỗi container cần bao nhiêu CPU và bộ nhớ (RAM) Kubernetes có thể điều phối các container đến các node để tận dụng tốt nhất các resource của mình