Gần đây tôi nhận được khá nhiều câu hỏi về việc đóng gói môi trường cho việc kiểm thử tự động khi sử dụng các hệ thống Tích hợp Liên tục. Nếu bạn không hiểu phần lớn câu trên thì đừng lo lắng vì chúng ta sẽ đi sâu vào tìm hiểu về containers, Docker, và cách tận dụng chúng trong môi trường nhúng và kiểm thử phần cứng trong vòng lặp.
Có rất nhiều bài viết xuất sắc về containers bao gồm bài này từ Docker (một trong những công cụ chạy container phổ biến nhất hiện nay). Containers trong môi trường xây dựng (tức là hệ thống nhúng) và môi trường kiểm thử (tức là kiểm thử phần cứng trong vòng lặp) cho phép chúng ta tách biệt mọi thiết lập rối rắm mỗi khi muốn khởi động một máy mới. Điều này không chỉ liên quan đến việc khởi động máy kiểm thử mới mà còn mở rộng hoạt động của chúng ta trên đám mây để xây dựng firmware nhúng.
Dù bạn đang vận hành quy mô hoạt động nào, ngày nay nhiều công ty tận dụng đám mây để giảm bớt việc giữ các máy chủ kim loại trần. Theo nguyên tắc DevOps, chúng ta luôn muốn đảm bảo rằng bất kỳ phần mềm nào chúng ta viết có thể được xây dựng và chạy mọi lúc, mọi nơi, ở bất kỳ đâu. Việc liên tục khởi động máy mới trên đám mây và cài đặt phần mềm biên dịch, thư viện và các gói phần mềm khác không mở rộng tốt. Chính xác là, lý do tại sao việc đóng gói đã trở nên phổ biến. Chúng ta có thể lấy môi trường xây dựng (hoặc môi trường thời gian chạy) của mình, đóng gói nó vào một máy ảo rất nhẹ và giao nó cho bất kỳ máy nào để chạy, dù là trên đám mây hay trên máy tính cá nhân của chúng ta.
Hãy khám phá cách thực sự tạo và sử dụng các containers trong dự án của bạn. Khi chúng ta bắt đầu tạo một hình ảnh container, chúng ta phải bắt đầu với một “hình ảnh cơ sở” đã tồn tại. Trong hầu hết các trường hợp, một biến thể của hệ điều hành Linux, như Debian, Ubuntu, hoặc Alpine, sẽ đủ. Sau khi bạn tạo Dockerfile của mình, bạn tham chiếu đến hình ảnh như sau:
FROM ubuntu:latest
Điều này chỉ ra rằng hệ điều hành cơ sở sẽ chạy hình ảnh Docker Ubuntu mới nhất. Sau đó, chúng ta sẽ cần cài đặt bất kỳ thư viện nào cần thiết cho môi trường xây dựng hoặc kiểm thử của mình. Trong một kho lưu trữ ví dụ, tôi đã cài đặt Arduino IDE sử dụng trình quản lý gói Debian (Apt) và sau đó thêm nhiều lớp hơn bằng cách cài đặt trình điều khiển bảng Arduino Sam. Chạy container này ở chế độ ưu tiên (hoặc truyền điểm gắn kết thể tích vào thiết bị), tôi có thể biên dịch và tải lên một bản vẽ Arduino qua dòng lệnh trên một máy mới hoàn toàn chỉ chứa Docker (tức là không có IDE hoặc trình điều khiển).
Chúng ta có thể làm điều tương tự với các máy móc được kết nối với thiết bị đang kiểm tra của chúng ta. Trong Docker container này mà tôi đã tổng hợp, tôi cài đặt tất cả các phụ thuộc và phần mềm cần thiết để chạy thiết bị Analog Discovery 2. Lý thuyết là, tôi có thể khởi động Docker container trên một máy mới hoàn toàn (chỉ chứa Docker) và bắt đầu giao tiếp với Analog Discovery 2 mà không gặp rắc rối gì. Với Analog Discovery 2, tôi có thể viết các bài kiểm tra để xác nhận ADCs, DACs của mình, hoặc gửi lệnh I2C/SPI đến các chip khác nhau trên bảng mạch của mình (cùng với nhiều khả năng khác).
Bây giờ, hãy thảo luận về cách các container có thể nâng cao hệ thống Tích hợp Liên tục để tăng cường hiệu quả và khả năng mở rộng. Phép màu thực sự xảy ra khi chúng ta bắt đầu sử dụng container cùng với hệ thống Tích hợp Liên tục (CI). Chúng ta có thể có hàng chục, nếu không muốn nói là hàng trăm máy kiểm tra vật lý hoặc truy cập vào hàng ngàn máy trên đám mây cho máy chủ kiểm tra và xây dựng của mình. Để mở rộng một cách thực tế, như đã đề cập ở trên, chúng ta không thể cấu hình từng máy riêng lẻ khi chúng được kết nối. Việc giao một container với mỗi lần chạy CI không chỉ cung cấp cho chúng ta một cách hệ thống, có thể lặp lại của việc chạy xây dựng và kiểm tra mà còn giải phóng chúng ta khỏi việc phải cấu hình lại máy mỗi lần khởi động nó (điều này, trên đám mây, xảy ra gần như mỗi lần chạy CI). Bằng cách tận dụng container cho việc xây dựng nhúng và kiểm tra phần cứng vật lý, chúng ta cung cấp cho bản thân và công ty của mình một mức độ mở rộng nhất định mà các thế hệ trước chỉ có thể mơ ước.
Trong bài viết này, chúng ta đã nêu bật vai trò quan trọng của container trong phát triển hệ thống nhúng, đặc biệt là cho môi trường xây dựng và kiểm tra nhất quán trên các loại cơ sở hạ tầng khác nhau. Sự tích hợp của chúng với hệ thống tích hợp liên tục không chỉ làm cho quá trình phát triển trở nên mạch lạc hơn mà còn tăng cường khả năng mở rộng và độ tin cậy của sản phẩm. Khi công nghệ container tiến triển, việc áp dụng nó sẽ trở nên ngày càng quan trọng đối với các nhà phát triển. Hãy khám phá sâu hơn và thử nghiệm với các cài đặt khác nhau bằng cách truy cập một số kho lưu trữ ví dụ tại https://gitlab.com/docker-embedded.