Snapcraft 高峰會蒙特婁
Snapcraft 高峰會蒙特婁於 2019 年 6 月 11 日至 13 日舉行,來自不同開源專案的人們聚集在一起,以完美的方式進行迭代和工作,如果沒有這次高峰會,這將需要更多的時間和資源。共同目標是改善每個專案在 snapcraft.io 商店中的存在感。故事的另一面是能夠認識不同專案背後的人們,並分享過去的經驗和目前的想法。
每天,專案都有穩定的更新。有些專案對這個平台並不陌生,他們尋求改進和問題解決方案。其他人則了解了隔離功能、使商店運作的不同部分,並採取第一步來整合它們。每天結束時,都會舉行近四十個參與方的大規模狀態檢查,並在 forum.snapcraft.io 上發布摘要。
在深入探討 Crystal 本身的技術變更之前,我想提一下與我分享了一些對話、想法和工作的人們,這些肯定會影響未來的提案。這些人是 rustup 的 Daniel Silverstone、TravisCI 的 Ana Rosas 和 María de Antón、Julia 的 Alex Arslan 和 Jeff Bezanson、NixOS 的 Graham Christensen,以及 Snapcraft 的 Sergio Schvezov。與他們會面幫助我更好地了解這些專案的某些方面、挑戰以及不明顯的解決方案。我無法再強調我有多享受與他們所有人的會面。
有什麼新消息?
- Crystal 在 snapcraft.io/crystal 中有新的官方發行方法,適用於 10 個 Linux 發行版(且數量不斷增加...)
- Crystal 應用程式可以封裝為 snap 並發行。
- 現在可以透過簡單的方式安裝每夜組建的本機套件。
- 當指定
crystal: nightly
時,TravisCI 會使用上述方法。
Crystal snap
您可以跳轉到新的閃亮 snapcraft.io/crystal 頁面,找到 snap 安裝說明。
商店具有通道的概念,這有助於支援 edge、beta、candidate 和 stable 版本的發布流程。
CI 腳本已更新,可每晚將 master 的內容發布到 edge 通道。因此,現在每夜組建的版本可在該處取得,以及 crystal-lang/crystal:nightly
docker 映像檔中,以及組建本身的人工產物中。
在標記並發布新版本後,該套件也將在 edge 通道中提供,並會手動移至 stable 通道。目前,預計不會使用 beta 和 candidate 通道,但未來能夠使用它們很棒。
由於 Crystal snap 在 classic 隔離層級中執行(稍後會詳細介紹),因此在 Ubuntu 套件中從終端機安裝的方法是
$ sudo snap install crystal --classic # For stable releases
$ sudo snap install crystal --edge --classic # For nightly releases
TravisCI 整合
Travis 需要處理很多事情才能支援不同的語言和組態。考慮到即將到來的新版本,使用更統一的方式來安裝它們肯定會簡化他們的人工和電腦工作負載。
Travis 渴望開始透過 snap 提供對語言的支援,而我們渴望重新建立每夜組建版本的可用性。
在 @travisci 中透過 @ana_rosas 於 #snapcraftsummit 支援 @CrystalLanguage 每夜組建版本的復原,由 @snapcraftio 提供技術支援 pic.twitter.com/ayQum84Nbm
— Brian J. Cardiff (@bcardiff) 2019 年 6 月 12 日
從現在開始,當在 travis.yml
檔案中使用 crystal: nightly
時,將使用 edge 通道中的 snap。幾個月來,crystal: latest
仍將使用託管在我們套件儲存庫中的目前 .deb
套件。最終,將使用 stable 通道中的 snap。
一個額外的優點是,我們的套件儲存庫不會收到來自 CI 組建的流量。
將您的 Crystal 應用程式封裝為 snap
一旦 snapcraft#2598 已合併並發布(編輯:它已在 Snapcraft 3.7 中發布!),建置將封裝應用程式的 snap 將會很容易。如果您不熟悉 snapcraft,請不要錯過它的簡介。
假設有一個 shard.yml
宣告目標、相依性等等。
name: hello
targets:
hello:
main: src/hello.cr
# ... stripped ...
宣告所有部分的基礎 snapcraft.yaml
檔案如下所示
name: crystal-hello
version: "1.0"
description: Create the hello snap
summary: Create the hello snap
grade: devel
confinement: strict
apps:
crystal-hello:
command: bin/hello
parts:
crystal-hello:
plugin: crystal
安裝產生的 snap 後,$ crystal-hello
將會調用 ./bin/hello
。當然,您可以調整名稱並避免 crystal-
前綴。
在建置 .snap
時,會發生以下事情
- 透過
$ shards install --production
安裝相依性。 - 透過
$ shards build --production
建置所有目標。 - 將
./bin
中的所有可執行檔封裝到最終.snap
中。 - 封裝執行這些二進位檔所需的所有連結程式庫(透過
ldd
偵測到)
如果應用程式需要一些預設情況下不可用的 C 程式庫,您需要將它們列為 build-packages。
如果您等不及,可以抓取 PR 程式碼並將其用作本機外掛程式。
crystal snap 的一些技術詳細資訊
在開始開發 Crystal snap 時,我們嘗試使其在 strict 隔離中運作。讓它作為 strict 運作的挑戰是,如何讓主機和 snap 的程式庫和工具鏈共存。
安裝 snap 時,沒有可以宣告的套件相依性(例如在 .deb
套件中)。因此,為了擁有順暢的全新體驗,需要預設情況下包含所有程式庫。
一旦要編譯的程式變得更進階,或者 shard 程式庫連結到 C 程式庫,使用者將需要處理與如何找到這些程式庫相關的封裝中的一些抽象洩漏。
這就是我們堅持使用 classic 隔離模型的主要原因。注意事項是如何讓使用者知道 Linux 發行版的一些本機套件需要作為安裝後步驟提供。
目前的解決方案是透過 snap 安裝的 crystal 命令實際上是一個包裝函式,它會檢查編譯器是否可以成功用於簡單程式。如果該檢查出現問題,則會顯示有關所需套件的訊息。
在進行此操作時,我們致力於在 CircleCI 中針對其 snap 支援執行一些更新,而他們的回應速度非常快。
版本管理
這個商店使用一個稱為頻道的概念。每個頻道都只有一個版本可用。一個頻道的完整名稱是 <track>/<risk>/<branch>
,其中預設的 track 名稱為 latest。
如前所述,最新的版本將會在 latest/stable
頻道中提供,而每晚建置版本則在 latest/edge
中。我們已經設定好 CI,以便能夠按需交付一些 latest/edge/<feature-branch>
。
雖然 Crystal 還沒有達到 1.0
,但這個架構已經足夠。您能夠存取最新的穩定版本,以及未來的版本。
關於如何處理遵循語意版本控制 (semver) 的專案在商店中明確的版本可用性,曾有一些討論。普遍的共識是為每個 Major.minor
版本建立一個 track,只留下最新的 Major.minor.patch
在商店中可用。在這個架構中,某些專案可能會將 latest
track 留空,以強制使用者做出明確的決定。我們將遵循哪個架構仍待決定。
感謝 Canonical、Travis CI 以及所有參與的人員,度過了美好的一週!