上架 Snap Store
本文說明如何把 Snapcraft 打包產生的 .snap 發佈到 Snap Store。
Channel 與 revision 的概念請參考 Snap 概念。
流程總覽
- 建立 Ubuntu One 帳號並登入
- 註冊 snap 名稱
- 上傳
.snap,Store 自動檢查並產生 revision - 把 revision 發佈到 channel
- 補上 Store 頁面的 metadata
登入
還沒有帳號時,先到 Ubuntu One 註冊。
註冊名稱
名稱已被使用,或與現有品牌太相近時,需要到 Snapcraft Forum 提出名稱申請。
註冊後的名稱無法自行刪除,會一直登記在你的帳號下。snapcraft close 可以下架 snap,但不會釋放名稱,要放棄名稱需向 Store 管理員申請撤銷。已註冊的名稱可在 snapcraft.io/snaps 查看。測試時請使用不會佔用好名稱的名稱,例如加上自己的前綴。
上傳與發佈
流程
Store 不負責編譯,上傳的是已經建置好的 .snap。預設使用 snapcraft pack 在本機建置,也可以用 snapcraft remote-build 或網站上的自動建置交給 Launchpad 編譯,再上傳到 Store。
上傳和發佈是兩個獨立的步驟,建議一步步來
- 上傳:把
.snap傳到 Store,Store 做自動檢查並產生新的 revision。此時還沒有任何 channel 指向它,使用者不會裝到 - 確認 revision:確認 revision 編號與檢查結果
- 發佈到 edge:先發佈到最不穩定的 channel,自己安裝測試
- 逐級提升:測試沒問題,再把同一個 revision 依序發佈到 beta、candidate、stable
Revision 是 Store 每次上傳時指派的遞增編號,與 snapcraft.yaml 的 version 無關;channel 指向的是 revision,所以 snapcraft release 要使用 revision 編號。
第一次上傳
# 1. 上傳,不指定 channel,只產生 revision
snapcraft upload hello-shell_0.1_amd64.snap
# 2. 查看 revision 編號,以及各 channel 目前指向哪個 revision
snapcraft revisions hello-shell
snapcraft status hello-shell
# 3. 發佈到 edge,這裡的 1 是上一步看到的 revision 編號
snapcraft release hello-shell 1 edge
# 4. 從 edge 安裝,自己測試
sudo snap install hello-shell --edge
# 5. 沒問題後,逐級提升同一個 revision
snapcraft release hello-shell 1 beta
snapcraft release hello-shell 1 candidate
snapcraft release hello-shell 1 stable
發佈後也可以到 snapcraft.io/snaps 開啟自己的 snap,確認 Store 頁面與各 channel 的版本。
更新版本
已上架的 snap 要發行新版本,流程與第一次上傳相同,只是多了修改版本與重新打包,名稱不需要再註冊。
# 1. 修改 snap/snapcraft.yaml 的 version,例如 '0.1' 改成 '0.2'
# 2. 清除舊的建置狀態並重新打包,產生 hello-shell_0.2_amd64.snap
snapcraft clean
snapcraft pack
# 3. 上傳,Store 會給它新的 revision,例如 2
snapcraft upload hello-shell_0.2_amd64.snap
# 4. 查看新的 revision 編號
snapcraft revisions hello-shell
# 5. 先發佈到 edge 測試,再逐級提升
snapcraft release hello-shell 2 edge
snapcraft release hello-shell 2 beta
snapcraft release hello-shell 2 candidate
snapcraft release hello-shell 2 stable
- 每次上傳都會得到新的 revision 編號,由 Store 決定,與
version無關 - 修改
version不是 Store 的強制要求,但不改的話,使用者與你自己都分不出兩個 revision 的差別 - 新 revision 發佈到某個 channel 之前,該 channel 仍然是舊的 revision,已安裝的使用者不會被更新
- 使用者會依自己追蹤的 channel 自動更新,所以發佈到
stable就等於推送給所有預設使用者 - 更新後發現問題,把舊的 revision 重新發佈到該 channel 就能回復,例如
snapcraft release hello-shell 1 stable
注意事項
- 每個架構要各自上傳、各自發佈
- Store 會做自動檢查,未通過時 revision 不能發佈,失敗原因會顯示在上傳輸出
grade: devel或confinement: devmode的 snap 只能發佈到 beta 與 edge
各 channel 的用途
edge:每次 build 的結果,給開發者自己用beta:功能完成,給願意嘗鮮的測試者candidate:準備發行,讓測試者驗證stable:正式版本,預設使用者安裝的 channel
沒有發佈過 revision 的 channel 會沿用比它更穩定的 channel 的 revision(例如 beta 空著時,等同 candidate)。
要關閉某個 channel,讓它改為沿用更穩定的 channel,可以使用:
審核與特殊權限
多數 strict snap 通過自動檢查就能發佈,下列情況需要人工審核,需在 Snapcraft Forum 的 store-requests 版面提出申請
- 使用
classicconfinement - 要求特定 interface 自動連接,例如
system-files、personal-files - 申請自訂 track,例如
2.0 - 名稱申請、使用者介面上的認證(verified publisher)
申請時需說明用途與為什麼 strict confinement 無法滿足。
Store 頁面 metadata
多數資訊來自 snapcraft.yaml,上傳後會自動更新。
name: hello-shell
# 一行簡介,最多 78 個字元
summary: Hello from a shell script
# 詳細說明,支援部分 Markdown
description: |
A minimal snap that prints a message.
# 授權,使用 SPDX 識別碼
license: MIT
# 顯示於 Store 頁面的連結
website: https://example.com
contact: https://example.com/issues
source-code: https://github.com/example/hello-shell
# 圖示,PNG 或 SVG,建議 256x256 以上
icon: snap/gui/icon.png
截圖、分類與橫幅圖片,需要登入 snapcraft.io 的 Dashboard 設定。
在 CI 上傳
CI 不能開瀏覽器登入,需要先匯出有限權限的憑證。
# 只允許上傳並發佈到 edge 與 beta,憑證 90 天後過期
snapcraft export-login \
--snaps=hello-shell \
--channels=edge,beta \
--acls=package_upload,package_release \
--expires="$(date -d '+90 days' --iso-8601=seconds)" \
credentials.txt
把 credentials.txt 的內容存成 CI 的 secret,使用時以環境變數提供,之後的 snapcraft upload 就不用互動登入。
export SNAPCRAFT_STORE_CREDENTIALS="$(cat credentials.txt)"
snapcraft upload --release=edge hello-shell_0.1_amd64.snap
- 憑證等同帳號權限,不要提交到版本控制
- 憑證過期前重新匯出並更新 secret
自動建置
不想自己維護 CI 時,可以到 snapcraft.io 的 Dashboard 把 GitHub repository 連到 snap,之後每次 push 由 Launchpad 自動建置並發佈到指定的 channel。