DevOps và các phương pháp Agile đã biến đổi ngành phát triển phần mềm bằng cách nhấn mạnh vào sự hợp tác, tự động hóa và cải tiến liên tục. Việc áp dụng các nguyên tắc DevOps vào thiết kế và dự án của tôi đã là một bước ngoặt, nâng cao hiệu quả và độ tin cậy. Trong bài viết này, chúng ta sẽ đi qua việc thiết lập một quy trình tích hợp liên tục (CI) cho một dự án hệ thống nhúng hiện có sử dụng vi điều khiển ATmega328P. Đến cuối bài viết này, bạn sẽ thấy cách những phương pháp này có thể tối ưu hóa quy trình phát triển của bạn và cung cấp sản phẩm chất lượng cao hơn.
DevOps là một tập hợp các phương pháp, được phổ biến bởi thế giới phần mềm, kết nối phát triển phần mềm (Dev) và hoạt động IT (Ops) thành một dòng chảy liên tục. Trong thế giới phần mềm, việc phát triển phần mềm và “ném nó qua bức tường” cho nhóm vận hành để triển khai cho khách hàng từng là điều phổ biến. DevOps đã giới thiệu một cách không chỉ phá bỏ bức tường đó mà còn tự động hóa toàn bộ quy trình từ đầu đến cuối. Trong thế giới phần cứng, chúng ta tìm thấy sự tương đồng giữa việc phát triển sản phẩm và sản xuất, liên tục ném thiết kế “qua bức tường” cho các đội kỹ sư sản xuất để đảm bảo mọi thứ sẵn sàng cho sản xuất.
Trong thiết kế sản phẩm nhúng, chúng ta vẫn phải đưa phần mềm qua quá trình sản xuất nhưng đối mặt với thách thức di chuyển nhanh hơn bao giờ hết và cung cấp với chất lượng cao nhất có thể. Với các nguyên tắc DevOps, chúng ta nhắm đến giải quyết một số thách thức đó.
Bằng cách áp dụng các nguyên tắc DevOps, chúng ta có thể lặp lại nhanh chóng sử dụng các phương pháp Agile trong khuôn khổ xây dựng-kiểm tra-triển khai cho mỗi tính năng bổ sung mà chúng ta muốn phát hành cho sản xuất.
“Xây dựng, kiểm tra và triển khai” là một bộ từ phổ biến mà bạn thường nghe khi thảo luận về DevOps. Trong hệ thống nhúng, chúng tôi cũng làm điều tương tự vì việc triển khai của chúng tôi cũng được đưa vào sản xuất (và sau đó là đến khách hàng cuối). Trong kho lưu trữ của dự án chúng tôi sử dụng Gitlab CI để điều khiển quy trình làm việc từ đầu đến cuối cho Embedded DevOps. Chúng tôi sử dụng cái gọi là “pipelines” để tạo ra các công việc nhằm đạt được một số nhiệm vụ như biên dịch phần mềm, chạy các bài kiểm tra trên mục tiêu, hoặc phát hành nó như một gói chính thức. Trong Gitlab, một pipeline là một tập hợp các công việc chạy theo một dòng tuần tự như thế này:
Hình 1: Ví dụ về pipeline được sử dụng với quy trình làm việc DevOps ATmega328P trong Gitlab
Dưới đây là bản tóm tắt về kịch bản CI (.gitlab-ci.yml file) để bạn có thể hiểu cách thức hoạt động.
Có một số chi tiết nhỏ làm cho quy trình làm việc này từ một triển khai DevOps cơ bản trở thành một hệ thống hoạt động mượt mà, được tài liệu hóa tốt và dễ dàng quan sát. Có một vài chi tiết tinh tế trong quy trình làm việc CI quan trọng cần được chỉ ra.
if [ "$CI_COMMIT_REF_SLUG" == "$CI_DEFAULT_BRANCH" ]; then
export IMAGE_TAG=$CI_REGISTRY_IMAGE/$IMAGE_TYPE:latest
else
export IMAGE_TAG=$CI_REGISTRY_IMAGE/$IMAGE_TYPE:$CI_COMMIT_REF_SLUG
fi
Logic này thiết lập cơ sở để tag “mới nhất” của chúng tôi chỉ sử dụng hình ảnh Docker được xây dựng trên nhánh chính (tức là sau khi một yêu cầu hợp nhất được thông qua thành công). Điều này đảm bảo rằng chỉ có các yêu cầu hợp nhất thành công mới công bố hình ảnh docker mới nhất và tốt nhất mà mọi người và mọi pipeline đều lấy từ đó.
Hình 2: Phủ sóng mã trong một yêu cầu hợp nhất
Trong ảnh chụp màn hình này, Gitlab tóm tắt các bài kiểm tra được thực hiện trên mục tiêu sử dụng phần cứng trong vòng lặp:
Hình 3: Tóm tắt kiểm tra cho các bài kiểm tra được thực hiện trên mục tiêu
Cuối cùng, một khi mã của chúng tôi đã được xác thực cả với kiểm tra đơn vị và trên mục tiêu, các giai đoạn xuất bản và phát hành tạo ra một gói phần mềm đẹp mắt có thể được nhóm sản xuất sử dụng:
Hình 4: Phát hành gói phần mềm
Với tất cả các bước tự động này, chúng tôi có thể phát hành một tính năng mới một cách lặp đi lặp lại theo phong cách Agile. Không cần phải phát triển nhiều tính năng, gửi chúng đến bộ phận QA, và sau đó là đánh giá để phát hành gói bởi nhóm sản xuất. Mọi thứ ở đây xảy ra trong một quy trình làm việc duy nhất và hoàn toàn tự động.
Trong bài viết này, chúng tôi đã khám phá cách áp dụng phương pháp luận DevOps và Agile vào phát triển hệ thống nhúng, cụ thể là sử dụng vi điều khiển ATmega328P. Chúng tôi đã thảo luận về lợi ích của việc triển khai luồng công việc CI trong Gitlab, bao gồm tự động hóa, thời gian xây dựng nhanh hơn và kiểm thử hiệu quả. Bằng cách phân tích kịch bản CI và giải thích từng giai đoạn, chúng tôi đã chỉ ra cách tạo ra một quy trình phát triển vững chắc và tinh gọn, tăng cường hiệu quả và chất lượng sản phẩm. Bằng cách theo dõi hướng dẫn thực tế này (và mã nguồn trong kho lưu trữ), bạn cũng nên có thể thiết lập luồng công việc Embedded DevOps của riêng mình.
Mã nguồn của dự án có thể được tìm thấy tại đây:https://gitlab.com/embedded-designs/atmega328p-serial-led-control.