Xây dựng và Phân phối Gói .deb Tùy chỉnh: Hướng dẫn Thực tế

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Điểm tới hạn: Tại sao các Script thủ công thất bại

Năm ngoái, nhóm của chúng tôi phải quản lý hơn 40 công cụ nội bộ trên 12 máy chủ production. Chúng tôi đã dựa vào một sự kết hợp lỏng lẻo giữa lệnh git pull và các lệnh cp thủ công. Đó là một mớ hỗn độn. Chỉ cần một lệnh chmod bị bỏ lỡ cũng có thể khiến dịch vụ sao lưu ngừng hoạt động trong nhiều giờ. Mỗi khi mở rộng quy mô cụm máy chủ, chúng tôi mất khoảng 3 giờ chỉ để gỡ lỗi các quyền hạn đặc thù của môi trường.

Cuối cùng, tôi quyết định chuẩn hóa quy trình làm việc bằng cách đóng gói các binary của mình thành các tệp .deb. Sau khi quản lý hơn 10 thực thể Linux VPS trong ba năm, tôi đã học được rằng việc kiểm thử trong môi trường staging là điều không thể thương lượng. Chuyển sang các gói Debian đã thay đổi mọi thứ. Bằng cách coi các công cụ nội bộ là những tài sản được chuẩn hóa, chúng tôi đã có được khả năng tự động giải quyết dependency, gỡ cài đặt sạch sẽ và một nguồn sự thật duy nhất (single source of truth) cho việc quản lý phiên bản.

Tạo các gói .deb không chỉ dành riêng cho những người duy trì hệ điều hành chính thức. Đó là một cách đáng tin cậy để đảm bảo phần mềm của bạn xuất hiện trên máy chủ production chính xác như mong muốn. Kể từ khi chuyển sang quy trình này sáu tháng trước, các phiếu hỗ trợ lỗi “chạy tốt trên máy tôi” đã giảm gần 80%.

Thiết lập: Chuẩn bị môi trường Build

Bạn không cần một IDE nặng nề hay một hệ thống build phức tạp để bắt đầu. Hầu hết công việc diễn ra trong terminal bằng các tiện ích tiêu chuẩn của Debian. Mặc dù các công cụ như pbuilder tồn tại để gửi gói lên các kho lưu trữ chính thức, nhưng phương pháp dpkg-deb là con đường nhanh nhất cho các công cụ nội bộ.

Bắt đầu bằng cách cài đặt các tiện ích build cốt lõi. Ngay cả khi bạn chỉ đóng gói một script Python đơn giản, các công cụ này vẫn cung cấp cơ sở hạ tầng cần thiết cho việc nén và xác thực. Quá trình cài đặt mất chưa đầy hai phút trên một kết nối băng thông rộng tiêu chuẩn.

sudo apt update
sudo apt install build-essential devscripts debhelper lintian

Các gói này bao gồm lintian. Tôi thực sự khuyên bạn nên sử dụng nó. Nó đóng vai trò như một người gác cổng, kiểm tra gói của bạn để tìm các lỗi phổ biến trước khi bạn cố gắng triển khai nó vào môi trường thực tế.

Cấu trúc: Tổ chức các tệp tin của gói

Về cốt lõi, một tệp .deb là một kho lưu trữ chứa các tệp ứng dụng của bạn và một thư mục DEBIAN cho metadata. Bí quyết là mô phỏng hệ thống tệp gốc (root) của Linux bên trong một thư mục không gian làm việc tạm thời.

1. Bố cục thư mục

Giả sử chúng ta đang đóng gói một tiện ích có tên là mysync-tool. Hãy tạo một không gian làm việc phản chiếu đích đến cuối cùng của các tệp tin:

mkdir -p ~/build/mysync-tool-1.0/usr/local/bin
mkdir -p ~/build/mysync-tool-1.0/etc/mysync
mkdir -p ~/build/mysync-tool-1.0/DEBIAN

Nếu bạn đặt một script vào ~/build/mysync-tool-1.0/usr/local/bin/mysync, trình cài đặt sẽ tự động đặt nó vào /usr/local/bin/mysync trên máy mục tiêu. Mọi thứ đơn giản như vậy.

2. Tệp Control

Tệp control đóng vai trò là trung tâm điều khiển. Nó cho apt và dpkg biết gói đó là gì, chi phối ai chịu trách nhiệm về nó và những dependency nào nó yêu cầu. Tạo tệp ~/build/mysync-tool-1.0/DEBIAN/control với nội dung sau:

Package: mysync-tool
Version: 1.0
Section: utils
Priority: optional
Architecture: amd64
Maintainer: Tên của bạn <[email protected]>
Depends: python3 (>= 3.8), rsync
Description: Một wrapper tùy chỉnh cho rsync
 Công cụ này tự động hóa việc sao lưu trên hệ thống 12 node VPS nội bộ của chúng tôi.

Trường Depends là nơi bạn tiết kiệm thời gian. Nếu script của bạn cần rsync, việc liệt kê nó ở đây đảm bảo apt sẽ tự động tải nó về. Không còn danh sách kiểm tra apt install thủ công cho các lập trình viên cấp dưới của bạn nữa.

3. Tự động hóa tác vụ với Maintainer Scripts

Bạn có cần tạo một người dùng hệ thống hoặc khởi động lại một dịch vụ trong khi cài đặt không? Hãy sử dụng các maintainer scripts như postinst (sau khi cài đặt) hoặc prerm (trước khi gỡ bỏ). Đây là một script postinst để thiết lập các bit thực thi chính xác:

#!/bin/bash
# ~/build/mysync-tool-1.0/DEBIAN/postinst

chmod +x /usr/local/bin/mysync
echo "Cài đặt mysync-tool 1.0 thành công!"

Luôn đảm bảo các script này có quyền thực thi, nếu không trình cài đặt sẽ bỏ qua chúng:

chmod 755 ~/build/mysync-tool-1.0/DEBIAN/postinst

Thực thi: Build và Kiểm thử

Bây giờ, hãy biến thư mục đó thành một tệp có thể phân phối. Tôi không bao giờ đẩy một gói lên kho lưu trữ của chúng tôi mà không xác minh nó trong một container sạch trước. Một lỗi đánh máy nhỏ trong script có thể làm đình trệ toàn bộ quy trình triển khai.

Tạo tệp .deb

Chạy lệnh build từ thư mục home của bạn:

dpkg-deb --build ~/build/mysync-tool-1.0

Lệnh này tạo ra tệp mysync-tool-1.0.deb. Trước khi chạy nó, hãy sử dụng lintian để phát hiện các vi phạm chính sách hoặc thiếu các trang hướng dẫn (man pages):

lintian mysync-tool-1.0.deb

Kiểm tra chuyên sâu

Trước khi thực thi trình cài đặt, hãy xác minh nội dung. Bạn có thể nhìn vào bên trong gói để xác nhận cấu trúc tệp chính xác như bạn mong đợi:

# Kiểm tra metadata và các dependency
dpkg -I mysync-tool-1.0.deb

# Liệt kê tất cả các tệp và quyền hạn của chúng
dpkg -c mysync-tool-1.0.deb

Bước kiểm thử cuối cùng

Để kiểm tra việc cài đặt, hãy sử dụng apt thay vì dpkg -i. apt thông minh hơn; nó sẽ giải quyết các dependency mà chúng ta đã định nghĩa trong tệp control từ các kho lưu trữ đã cấu hình của bạn:

sudo apt install ./mysync-tool-1.0.deb

Theo dõi /var/log/dpkg.log là cách tốt nhất để kiểm tra những gì xảy ra trên hệ thống máy chủ của bạn. Nếu một lần triển khai thất bại, các bản ghi này sẽ tiết lộ chính xác script nào đã trả về mã thoát khác không. Để phân phối rộng rãi hơn, bạn có thể sử dụng reprepro để lưu trữ các tệp này trên một máy chủ web riêng tư. Điều này cho phép các máy chủ của bạn cập nhật thông qua một lệnh apt upgrade đơn giản.

Xây dựng gói .deb đầu tiên của bạn tốn nhiều công sức hơn là một lệnh scp nhanh chóng. Tuy nhiên, sự ổn định mà nó mang lại cho cơ sở hạ tầng của bạn rất xứng đáng với sự đầu tư đó. Nó biến một quy trình thủ công, dễ mắc lỗi thành một quy trình triển khai chuyên nghiệp và có thể lặp lại.

Share: