Một trong những thách thức lớn nhất trong phát triển ứng dụng là giai đoạn cuối cùng khi phân phối sản phẩm hoàn chỉnh tới người dùng hoặc khách hàng. Nhiều phương pháp triển khai hiện nay gặp hạn chế về tính thân thiện với người dùng, bảo mật hoặc không hỗ trợ tự động cập nhật sau khi cài đặt.
Snap là một định dạng đóng gói ứng dụng hiện đại, tích hợp các tính năng sandboxing và bảo mật vượt trội, bao gồm cách ly hệ thống tập tin, tự động cập nhật và quản lý phụ thuộc nội bộ. Các ứng dụng được đóng gói theo định dạng Snap, hay còn gọi là Snaps, có thể được tải và cài đặt thông qua công cụ dòng lệnh, tương tự như apt hoặc yum. Với Ubuntu đã cài đặt sẵn Snap, hệ sinh thái này nhanh chóng tiếp cận được một lượng lớn người dùng.
Tiếp theo, bạn sẽ được hướng dẫn cách tạo một ứng dụng Snap và xuất bản nó lên Snap Store.
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần:
● Một máy chủ Ubuntu 18.04 đã được thiết lập theo Hướng dẫn Thiết Lập Máy Chủ Ubuntu 18.04 mới cài đặt, bao gồm một người dùng sudo không phải root.
● Một ứng dụng mà bạn muốn đóng gói và phát hành dưới dạng Snap. Đây có thể là một ứng dụng phức tạp mà bạn đã tạo, một dự án mã nguồn mở phổ biến, hoặc một chương trình “Hello, world!” đơn giản. Nếu bạn chưa có ứng dụng, Bước 1 của hướng dẫn này sẽ hướng dẫn cách tạo chương trình Hello World bằng Go.
● Một tài khoản trên Snapcraft Developer Dashboard.
Khi đã sẵn sàng, hãy đăng nhập vào máy chủ với tư cách người dùng không phải root để bắt đầu.
Bước 1 – Chuẩn bị ứng dụng của bạn để đóng gói
Đầu tiên, bạn sẽ chuẩn bị ứng dụng của mình cho việc đóng gói thành một ứng dụng Snap bằng cách đảm bảo rằng tất cả các thành phần cần thiết đều có trong một thư mục duy nhất.
Bắt đầu bằng cách tạo một thư mục mới cho Snap và chuyển vào thư mục đó:
mkdir ~/your-snap cd ~/your-snap
Tiếp theo, nếu bạn đã có một ứng dụng, hãy đưa bản sao đầy đủ của mã nguồn ứng dụng vào thư mục mà bạn vừa tạo. Quá trình này sẽ thay đổi đáng kể tùy thuộc vào ứng dụng cụ thể mà bạn đang đóng gói, tuy nhiên, trong trường hợp mã nguồn được lưu trữ trong kho Git, bạn có thể sử dụng lệnh git init để khởi tạo kho lưu trữ trong thư mục đó và kéo về tất cả các mã nguồn liên quan.
Nếu bạn chưa có ứng dụng nào để đóng gói, bạn có thể tạo một chương trình “Hello World” để thay thế. Nếu bạn cần thêm bối cảnh về việc viết chương trình này bằng Go, hãy xem hướng dẫn Cách viết chương trình đầu tiên trong Go.
Bạn có thể thực hiện bằng cách tạo một file Go mới và mở nó bằng trình soạn thảo ưa thích:
nano helloworld.go
Tiếp theo, thêm đoạn mã sau vào file:
package main import "fmt" func main() { fmt.Println("Hello, world!") }
Sau đó, lưu và thoát file.
Nếu bạn chưa cài đặt Go, bạn có thể cài đặt nó bằng lệnh sau:
sudo apt install golang-go
Khi Go đã được cài đặt, bạn có thể chạy chương trình mới của mình để kiểm tra hoạt động:
go run helloworld.go
Bạn sẽ thấy kết quả sau:
Bạn đã chuẩn bị ứng dụng của mình để đóng gói thành Snap. Tiếp theo, bạn sẽ cài đặt phần mềm cần thiết để bắt đầu quá trình đóng gói.
Bước 2 – Cài đặt Snapcraft
Trong bước này, bạn sẽ tải về và cài đặt Snapcraft, tên của công cụ đóng gói ứng dụng Snap chính thức. Snapcraft có sẵn từ Snap Store, được tích hợp sẵn trong Ubuntu. Điều này có nghĩa là bạn có thể cài đặt Snapcraft từ dòng lệnh bằng cách sử dụng lệnh snap.
Lệnh snap tương đương với lệnh apt, nhưng bạn có thể sử dụng nó để cài đặt phần mềm từ Snap Store thay vì các gói từ kho Apt.
Để cài đặt Snapcraft, chạy lệnh sau:
sudo snap install snapcraft --classic
Bạn sử dụng tham số --classic
để Snapcraft cài đặt mà không bị ràng buộc bởi các tính năng sandboxing nghiêm ngặt mà Snap thường sử dụng. Snapcraft cần tham số này vì nó cần quyền truy cập cao hơn vào hệ thống của bạn để đóng gói ứng dụng một cách đáng tin cậy.
Khi Snapcraft đã được cài đặt, bạn sẽ thấy thông báo như sau:
Cuối cùng, bạn có thể kiểm tra lại cài đặt Snapcraft bằng cách chạy:
snapcraft --version
Lệnh này sẽ hiển thị một thông báo tương tự:
snapcraft, version 3.9.8
Trong bước này, bạn sẽ bắt đầu xác định cấu hình, cấu trúc và siêu dữ liệu cho ứng dụng Snap của mình.
Đầu tiên, hãy đảm bảo rằng bạn vẫn đang làm việc trong thư mục chứa ứng dụng Snap:
cd ~/your-snap
Tiếp theo, tạo và chỉnh sửa file snapcraft.yaml
bằng trình soạn thảo bạn ưa thích:
nano snapcraft.yaml
Bạn sẽ sử dụng file snapcraft.yaml
để lưu trữ toàn bộ cấu hình cho ứng dụng Snap của bạn, bao gồm tên, mô tả và phiên bản, cũng như các cài đặt liên quan đến quản lý phụ thuộc và sandboxing.
Bắt đầu bằng cách xác định tên, tóm tắt, mô tả và số phiên bản cho ứng dụng của bạn:
name: your-snap summary: A summary of your application in 78 characters or less. description: | A detailed description of your application. The description can have multiple lines. version: '1.0'
Tên của Snap của bạn cần phải là duy nhất nếu bạn muốn xuất bản nó trên Snap Store-hãy tìm kiếm xem có ứng dụng nào cùng tên không để đảm bảo tên đó chưa bị sử dụng.
Tiếp theo, bạn có thể xác định các lệnh mà bạn muốn gán cho ứng dụng của mình. Điều này cho phép Snap của bạn được sử dụng trực tiếp từ dòng lệnh Bash như một lệnh thông thường.
Thêm đoạn sau vào file snapcraft.yaml
:
. . . apps: your-snap-command: command: your-snap
Ở đây, your-snap-command
là tên của lệnh mà bạn muốn định nghĩa. Ví dụ, bạn có thể sử dụng lệnh helloworld
để chạy chương trình Hello World của mình.
Bạn sử dụng command: your-snap
để cho Snapcraft biết phải làm gì khi lệnh ứng dụng được chạy. Trong trường hợp của chương trình Hello World, bạn sẽ dùng giá trị helloworld
để tham chiếu đến file helloworld.go
, điều này cho phép Snapcraft chạy chương trình của bạn thành công.
Điều này dẫn đến cấu hình ví dụ như sau:
apps: helloworld: command: helloworld
Nếu tên lệnh khớp chính xác với tên Snap, bạn sẽ có thể chạy nó trực tiếp từ dòng lệnh. Nếu tên lệnh không khớp với tên Snap, lệnh đó sẽ được tự động thêm tiền tố với tên của Snap. Ví dụ, helloworld.command1
.
Cuối cùng, bạn có thể xác định các phần cấu thành ứng dụng Snap của bạn. Ứng dụng Snap được tạo thành từ nhiều phần, bao gồm tất cả các thành phần cấu thành ứng dụng. Trong nhiều trường hợp, chỉ có một phần duy nhất, đó là chính ứng dụng.
Mỗi phần có một plugin liên kết. Ví dụ, đối với các thành phần ứng dụng được viết bằng Ruby, plugin ruby sẽ được sử dụng, và đối với các thành phần viết bằng Go, plugin go sẽ được sử dụng.
Bạn có thể sử dụng lệnh snapcraft list-plugins
để xác định plugin phù hợp cho ứng dụng của bạn:
snapcraft list-plugins
Lệnh này sẽ xuất ra danh sách tương tự như sau:
Các plugin phổ biến nhất là những plugin dành cho các ngôn ngữ lập trình thông dụng như Go, Rust, Ruby hoặc Python.
Sau khi bạn đã xác định được plugin phù hợp cho ứng dụng của mình, bạn có thể bắt đầu thêm cấu hình cho phần (parts) vào file snapcraft.yaml
:
. . . parts: your-snap: plugin: plugin-name source: .
Bạn sử dụng tham số source
để chỉ định đường dẫn tương đối đến mã nguồn của ứng dụng. Thông thường, đây là cùng thư mục chứa file snapcraft.yaml
, vì vậy giá trị của source
chỉ là dấu chấm (.)
Lưu ý: Nếu thành phần ứng dụng của bạn có bất kỳ phụ thuộc nào cần thiết cho quá trình build hoặc chạy, bạn có thể chỉ định chúng bằng các thuộc tính
build-packages
vàstage-packages
. Các tên phụ thuộc được chỉ định sau đó sẽ tự động được tải về từ trình quản lý gói mặc định của hệ thống.Ví dụ:
parts: your-snap: plugin: plugin-name source: . build-packages: - gcc - make stage-packages: - libcurl4
Một số plugin của Snapcraft có các tuỳ chọn riêng có thể yêu cầu đối với ứng dụng của bạn, vì vậy hãy xem qua các trang manual liên quan đến plugin của bạn:
snapcraft help plugin-name
Trong trường hợp của các ứng dụng Go, bạn cũng cần chỉ định go-importpath
. Đối với cấu hình Hello World, cấu hình ví dụ sẽ như sau:
Bạn có thể giữ file snapcraft.yaml
mở để thêm các cấu hình tiếp theo ở bước kế tiếp.
Bạn đã xác định cấu hình cơ bản cho ứng dụng Snap của mình. Tiếp theo, bạn sẽ cấu hình các khía cạnh bảo mật và sandboxing của ứng dụng.
Bước 4 – Tăng cường bảo mật cho ứng dụng snap của bạn
Các ứng dụng Snap được thiết kế để chạy trong môi trường sandboxed, vì vậy trong bước này, bạn sẽ cấu hình sandboxing cho Snap của mình. Trước tiên, bạn cần kích hoạt sandboxing cho ứng dụng, được gọi trong Snapcraft là confinement.
Thêm đoạn sau vào file snapcraft.yaml
:
. . . confinement: strict
Điều này sẽ kích hoạt sandboxing cho ứng dụng của bạn, ngăn nó truy cập internet, các Snap khác đang chạy hoặc hệ thống chủ. Tuy nhiên, trong hầu hết các trường hợp, các ứng dụng cần có khả năng giao tiếp bên ngoài sandbox khi cần truy cập internet hoặc đọc/ghi vào hệ thống tập tin.
Những quyền này, được gọi trong Snapcraft là interfaces, có thể được cấp cho ứng dụng Snap của bạn thông qua Plugs. Sử dụng Plugs, bạn có thể kiểm soát chi tiết sandboxing cho ứng dụng, chỉ cấp quyền cần thiết theo nguyên tắc “ít đặc quyền nhất“.
Các interfaces cần thiết sẽ thay đổi tùy thuộc vào ứng dụng của bạn. Một số interfaces phổ biến nhất bao gồm:
● audio-playback – Cho phép xuất âm thanh/phát âm thanh.
● audio-record – Cho phép ghi âm.
● camera – Cho phép truy cập vào webcam kết nối.
● home – Cho phép truy cập vào các tập tin không ẩn trong thư mục home của bạn.
● network – Cho phép truy cập vào mạng/internet.
● network-bind – Cho phép liên kết cổng để vận hành như một dịch vụ mạng.
● system-files – Cho phép truy cập vào toàn bộ hệ thống tập tin của máy chủ.
Danh sách đầy đủ các interfaces có sẵn có thể được tìm thấy trong tài liệu Snapcraft tại mục Supported Interfaces.
Sau khi đã xác định được tất cả các interfaces cần thiết cho ứng dụng, bạn có thể bắt đầu gán chúng cho các plugs trong file snapcraft.yaml
.
Cấu hình ví dụ dưới đây sẽ cho phép ứng dụng truy cập vào mạng và thư mục home của người dùng:
. . . plugs: your-snap-home: interface: home your-snap-network: interface: network
Hãy đặt tên cho Plug sao cho có mô tả, giúp người dùng dễ nhận biết mục đích của nó.
Bạn đã kích hoạt sandboxing cho Snap và cấu hình một số Plugs để cấp quyền truy cập giới hạn vào tài nguyên hệ thống. Tiếp theo, bạn sẽ hoàn thành việc xây dựng ứng dụng Snap của mình.
Bước 5 – Xây dựng và kiểm tra ứng dụng snap của bạn
Bây giờ, khi bạn đã viết xong toàn bộ cấu hình cần thiết cho Snap, bạn có thể tiến hành xây dựng và kiểm tra gói Snap cục bộ.
Nếu bạn đang theo dõi với chương trình Hello World làm ứng dụng của mình, file snapcraft.yaml
hoàn chỉnh của bạn sẽ trông tương tự như sau:
name: helloworld summary: A simple Hello World program. description: | A simple Hello World program written in Go. Packaged as a Snap application using Snapcraft. version: '1.0' confinement: strict apps: helloworld: command: helloworld parts: helloworld: plugin: go source: . go-importpath: helloworld plugs: helloworld-home: interface: home helloworld-network: interface: network
Để xây dựng ứng dụng Snap của bạn, hãy chạy lệnh snapcraft
từ trong thư mục chứa Snap:
snapcraft
Snapcraft sẽ tự động khởi chạy một máy ảo (VM) và bắt đầu quá trình xây dựng Snap của bạn. Khi hoàn tất, Snapcraft sẽ thoát và bạn sẽ thấy thông báo như sau:
Bạn bây giờ có thể cài đặt Snap cục bộ để kiểm tra xem nó có hoạt động hay không:
sudo snap install your-snap.snap --dangerous
Tham số --dangerous
là cần thiết vì bạn đang cài đặt một Snap cục bộ chưa được ký số.
Khi quá trình cài đặt hoàn tất, bạn có thể chạy Snap bằng lệnh tương ứng. Ví dụ:
helloworld
Trong trường hợp chương trình Hello World, kết quả sẽ là:
Bạn cũng có thể xem chính sách sandboxing của Snap để kiểm tra xem các quyền đã được cấp chính xác hay chưa:
snap connections your-snap
Lệnh này sẽ xuất ra danh sách các Plugs và interfaces, tương tự như sau:
Trong bước này, bạn đã xây dựng ứng dụng Snap và cài đặt nó cục bộ để kiểm tra xem nó có hoạt động hay không. Tiếp theo, bạn sẽ xuất bản Snap trên Snap Store.
Bước 6 – Xuất bản Snap của bạn
Sau khi đã xây dựng và kiểm tra ứng dụng Snap của bạn, đã đến lúc phát hành nó trên Snap Store.
Bắt đầu bằng cách đăng nhập vào tài khoản Snap Developer của bạn sử dụng ứng dụng dòng lệnh Snapcraft:
snapcraft login
Làm theo các hướng dẫn để nhập địa chỉ email và mật khẩu.
Tiếp theo, bạn cần đăng ký tên ứng dụng trên Snap Store:
snapcraft register your-snap
Sau khi đã đăng ký tên Snap, bạn có thể đẩy gói Snap đã xây dựng lên cửa hàng:
snapcraft push your-snap.snap
Bạn sẽ thấy thông báo tương tự như sau:
Mỗi lần bạn đẩy lên Snap Store, số phiên bản (revision) sẽ được tăng lên, bắt đầu từ 1. Điều này hữu ích để giúp nhận diện các bản build khác nhau của Snap.
Cuối cùng, bạn có thể phát hành Snap ra công chúng:
snapcraft release your-snap revision-number channel
Nếu đây là lần đầu tiên bạn đẩy Snap lên Snap Store, số phiên bản sẽ là 1. Bạn cũng có thể lựa chọn phát hành trên các kênh stable, candidate, beta và edge, nếu bạn có nhiều phiên bản của ứng dụng ở các giai đoạn phát triển khác nhau.
Ví dụ, lệnh sau sẽ phát hành phiên bản 1 của Snap Hello World lên kênh stable:
snapcraft release helloworld 1 stable
Bạn sẽ thấy thông báo như sau:
Kênh ‘stable’ hiện đã mở.
Bạn có thể tìm kiếm ứng dụng của mình trên Snap Store và cài đặt nó trên bất kỳ thiết bị nào.
Trong bước cuối này, bạn đã tải gói Snap đã xây dựng lên Snap Store và phát hành nó ra công chúng.
Kết luận
Trong bài viết này, bạn đã thành công trong việc cấu hình và xây dựng một ứng dụng Snap, sau đó phát hành nó trên Snap Store để chia sẻ với công chúng. Giờ đây, bạn đã sở hữu kiến thức nền tảng vững chắc không chỉ để duy trì ứng dụng hiện có mà còn để phát triển các ứng dụng mới.
Nếu bạn muốn tìm hiểu thêm về Snap, hãy khám phá toàn bộ Snap Store để nắm bắt các ứng dụng đa dạng đang có. Bên cạnh đó, việc tham khảo tài liệu Snapcraft YAML Reference sẽ giúp bạn hiểu sâu hơn về cú pháp và các thuộc tính mở rộng trong cấu hình Snap. Cuối cùng, để nâng cao kỹ năng phát triển Snap, hãy thử khám phá Snap Hooks – công cụ mạnh mẽ giúp các ứng dụng Snap phản ứng linh hoạt với những thay đổi của hệ thống, chẳng hạn như nâng cấp hoặc điều chỉnh chính sách bảo mật.