Hướng dẫn đóng gói và xuất bản Snap package trên Ubuntu bằng Snapcraft

cach dong goi va xuat ban ung dung snap tren ubuntu 1804

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:

Hello, world!

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.

Hướng dẫn đóng gói và xuất bản Snap package trên Ubuntu bằng Snapcraft

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:

snapcraft 3.9.8 from Canonical✓ installed

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
Bước 3 – Xác định cấu hình và siêu dữ liệu cho Snap của bạn

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:

ant        catkin-tools  conda    dump    gradle  make   nil                python  rust
autotools  cmake         crystal  go      kbuild  maven  nodejs             qmake   scons
catkin     colcon        dotnet   godeps  kernel  meson  plainbox-provider  ruby    waf

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-packagesstage-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:

parts:
  helloworld:
    plugin: go
    source: .
    go-importpath: helloworld

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:

Snapped your-snap_1.0_amd64.snap

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ố.

your-snap 1.0 installed

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à:

Hello, world!

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:

snap connections your-snap
Interface  Plug                         Slot      Notes
home       your-snap:your-snap-home     :home     -
network    your-snap:your-snap-network  :network  -

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:

Preparing to push 'your-snap_1.0_amd64.snap'.
Install the review-tools from the Snap Store for enhanced checks before uploading this snap.
Pushing 'your-snap_1.0_amd64.snap' [===================================================================================================] 100%
Processing...|
Ready to release!
Revision 1 of 'your-snap' created.

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:

Track    Arch    Channel    Version    Revision
latest   amd64   stable     1.0        1
                 candidate  ^          ^
                 beta       ^          ^
                 edge       ^          ^
The 'stable' channel is now open.

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.

cach dong goi va xuat ban ung dung snap tren ubuntu 1804 2

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.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *