使用Snapcraft構建、測試並發布Snap軟體包

2021-01-08 TechWeb

【51CTO活動】8.26 帶你深度了解清華大學、搜狗基於算法的IT運維實踐與探索

snapcraft 是一個正在為其在 Linux 中的地位而奮鬥的包管理系統,它為你重新設想了分發軟體的方式。這套新的跨發行版的工具可以用來幫助你構建和發布 snap 軟體包。接下來我們將會講述怎麼使用 CircleCI 2.0 來加速這個過程以及一些在這個過程中的可能遇到的問題。

snap 軟體包是什麼?snapcraft 又是什麼?

snap 是用於 Linux 發行版的軟體包,它們在設計的時候吸取了像 Android 這樣的移動平臺和物聯網設備上分發軟體的經驗教訓。snapcraft 這個名字涵蓋了 snap 和用來構建它們的命令行工具、這個 snapcraft.io 網站,以及在這些技術的支撐下構建的幾乎整個生態系統。

snap 軟體包被設計成用來隔離並封裝整個應用程式。這些概念使得 snapcraft 提高軟體安全性、穩定性和可移植性的目標得以實現,其中可移植性允許單個 snap 軟體包不僅可以在 Ubuntu 的多個版本中安裝,而且也可以在 Debian、Fedora 和 Arch 等發行版中安裝。snapcraft 網站對其的描述如下:

為每個 Linux 桌面、伺服器、雲端或設備打包任何應用程式,並且直接交付更新。

在 CircleCI 2.0 上構建 snap 軟體包

在 CircleCI 上使用 CircleCI 2.0 語法 來構建 snap 和在本地機器上基本相同。在本文中,我們將會講解一個示例配置文件。如果您對 CircleCI 還不熟悉,或者想了解更多有關 2.0 的入門知識,您可以從 這裡 開始。

基礎配置

version: 2 jobs:   build:     machine: true     working_directory: ~/project     steps:       - checkout       - run:           command: |             sudo apt update && sudo apt install -y snapd             sudo snap install snapcraft --edge --classic             /snap/bin/snapcraft 

這個例子使用了 machine 執行器來安裝用於管理運行 snap 的可執行程序 snapd 和製作 snap 的 snapcraft 工具。

由於構建過程需要使用比較新的內核,所以我們使用了 machine 執行器而沒有用 docker 執行器。在這裡,Linux v4.4 已經足夠滿足我們的需求了。

用戶空間的依賴關係

上面的例子使用了 machine 執行器,它實際上是一個內核為 Linux v4.4 的 Ubuntu 14.04 (Trusty) 虛擬機。如果 Trusty 倉庫可以滿足你的 project/snap 構建依賴,那就沒問題。如果你的構建依賴需要其他版本,比如 Ubuntu 16.04 (Xenial),我們仍然可以在 machine 執行器中使用 Docker 來構建我們的 snap 軟體包 。

version: 2 jobs:   build:     machine: true     working_directory: ~/project     steps:       - checkout       - run:           command: |             sudo apt update && sudo apt install -y snapd             docker run -v $(pwd):$(pwd) -t ubuntu:xenial sh -c "apt update -qq && apt install snapcraft -y && cd $(pwd) && snapcraft" 

這個例子中,我們再次在 machine 執行器的虛擬機中安裝了 snapd,但是我們決定將 snapcraft 安裝在 Ubuntu Xenial 鏡像構建的 Docker 容器中,並使用它來構建我們的 snap。這樣,在 snapcraft 運行的過程中就可以使用在 Ubuntu 16.04 中可用的所有 apt 包。

測試

在我們的博客、文檔以及網際網路上已經有很多講述如何對軟體代碼進行單元測試的內容。搜索你的語言或者框架和單元測試或者 CI 可以找到大量相關的信息。在 CircleCI 上構建 snap 軟體包,我們最終會得到一個 .snap 的文件,這意味著除了創造它的代碼外我們還可以對它進行測試。

工作流

假設我們構建的 snap 軟體包是一個 webapp,我們可以通過測試套件來確保構建的 snap 可以正確的安裝和運行,我們也可以試著安裝它或者使用 Selenium 來測試頁面加載、登錄等功能正常工作。但是這裡有一個問題,由於 snap 是被設計成可以在多個 Linux 發行版上運行,這就需要我們的測試套件可以在 Ubuntu 16.04、Fedora 25 和 Debian 9 等發行版中可以正常運行。這個問題我們可以通過 CircleCI 2.0 的工作流來有效地解決。

工作流是在最近的 CircleCI 2.0 測試版中加入的,它允許我們通過特定的邏輯流程來運行離散的任務。這樣,使用單個任務構建完 snap 後,我們就可以開始並行的運行 snap 的發行版測試任務,每個任務對應一個不同的發行版的 Docker 鏡像 (或者在將來,還會有其他可用的執行器)。

這裡有一個簡單的例子:

workflows:   version: 2   build-test-and-deploy:     jobs:       - build       - acceptance_test_xenial:           requires:             - build       - acceptance_test_fedora_25:           requires:             - build       - acceptance_test_arch:           requires:             - build       - publish:           requires:             - acceptance_test_xenial             - acceptance_test_fedora_25             - acceptance_test_arch 

在這個例子中首先構建了 snap,然後在四個不同的發行版上運行驗收測試。如果所有的發行版都通過測試了,那麼我們就可以運行發布 job,以便在將其推送到 snap 商店之前完成剩餘的 snap 任務。

留著 .snap 包

為了測試我們在工作流示例中使用的 .snap 軟體包,我們需要一種在構建的時候持久保存 snap 的方法。在這裡我將提供兩種方法:

artifact —— 在運行 build 任務的時候我們可以將 snaps 保存為一個 CircleCI 的 artifact(LCTT 譯註:artifact 是 snapcraft.yaml 中的一個 Plugin-specific 關鍵字),然後在接下來的任務中檢索它。CircleCI 工作流有自己處理共享 artifact 的方式,相關信息可以在 這裡 找到。 snap 商店通道 —— 當發布 snap 軟體包到 snap 商店時,有多種通道可供我們選擇。將 snap 的主分支發布到 edge 通道以供內部或者用戶測試已經成為一種常見做法。我們可以在 build 任務中完成這些工作,然後接下來的的任務就可以從 edge 通道來安裝構建好的 snap 軟體包。

第一種方法速度更快,並且它還可以在 snap 軟包上傳到 snap 商店供用戶甚至是測試用戶使用之前對 snap 進行驗收測試。第二種方法的好處是我們可以從 snap 商店安裝 snap,這也是 CI 運行期間的測試項之一。

snap 商店的身份驗證

snapcraft-config-generator.py 腳本可以生成商店證書並將其保存到 .snapcraft/snapcraft.cfg 中(注意:在運行公共腳本之前一定要對其進行檢查)。如果覺得在你倉庫中使用明文來保存這個文件不安全,你可以用 base64 編碼該文件,並將其存儲為一個私有環境變量,或者你也可以對文件 進行加密,並將密鑰存儲在一個私有環境變量中。

下面是一個示例,將商店證書放在一個加密的文件中,並在 deploy 環節中使用它將 snap 發布到 snap 商店中。

- deploy:     name: Push to Snap Store     command: |       openssl aes-256-cbc -d -in .snapcraft/snapcraft.encrypted -out .snapcraft/snapcraft.cfg -k $KEY       /snap/bin/snapcraft push *.snap 

除了 deploy 任務之外,工作流示例同之前的一樣, deploy 任務只有當驗收測試任務通過時才會運行。

更多的信息

Alan Pope 在 論壇中發的帖子:「popey」 是 Canonical 的員工,他在 snapcraft 的論壇上寫了這篇文章,並啟發作者寫了這篇博文。 snapcraft 網站: snapcraft 官方網站。 snapcraft 的 CircleCI Bug 報告:在 Launchpad 上有一個開放的 bug 報告頁面,用來改善 CircleCI 對 snapcraft 的支持。同時這將使這個過程變得更簡單並且更「正式」。期待您的支持。 怎麼使用 CircleCI 構建 Nextcloud 的 snap:這裡有一篇題為 「複雜應用的持續驗收測試」 的博文,它同時也影響了這篇博文。

這篇客座文章的作者是 Ricardo Feliciano —— CircleCi 的開發者傳道士。如果您也有興趣投稿,請聯繫 ubuntu-iot@canonical.com。原始文章可以從 這裡 找到。

點讚 0

相關焦點

  • 未經授權擅自覆蓋軟體包,Linux Mint 放棄支持 Snap
    不同於傳統的 Linux 軟體包管理方法(如 APT 和 RPM),Snap 包含了軟體運行需要的所有依賴關係,並將其全部捆綁在一個系統鏡像中,這在一定程度上簡化了軟體管理過程。不僅如此,統一化的 Snap 軟體包能夠在不同 Linux 發行版上運行,開發者無需再針對不同的發行版分別構建,軟體部署的難度有所降低,軟體開發和最終部署之間的延遲也得以縮減。
  • 未經授權擅自覆蓋軟體包,Linux Mint 20 放棄支持 Snap
    上個月,隨著 Linux Mint 20 的發布,Linux Mint 開始默認禁止安裝 snapd 工具。直接起因是,從 Ubuntu 19.10 開始,系統會直接從上遊覆蓋 Chromium 的 APT 軟體包,然後自行下載 snapd 工具,隨即以 Snap 包的形式安裝 Chromium 瀏覽器。
  • 基於Snap7使用C 編程訪問西門子PLC系列教程(1)-初識Snap7
    本文是該系列教程的第1篇,我們先來認識下Snap7軟體包。Snap7是一個基於S7通信協議的開源軟體包,作者是Davide Nardella。該軟體包封裝了S7通信的底層協議,可以使普通個人電腦通過編程與西門子S7系列PLC進行通信。
  • 一文教你使用Jenkins集成Junit自動化測試,超簡單!
    隨著技術的發展,Devops的概念越來越深入人心,Devops使得構建、測試、發布軟體能夠更加地快捷、頻繁和可靠。DevOps對應用程式發布的有著重要影響,具備DevOps能力則發布軟體產品時風險更低,其中一個重要的原因就是自動化,減少了人工幹預,強大的部署自動化手段確保部署任務的可重複性、減少部署出錯的可能性。
  • 微軟發布首個Linux版Edge瀏覽器的Insider構建版
    我們早就知道微軟一直在開發新的Chromium Edge瀏覽器的Linux版本,但是知道今天這家軟體巨頭才宣布了第一個Insider構建版本供測試用戶試用。今天發布的版本支持Ubuntu、Debian、Fedora和openSUSE發行版,微軟表示今後將每周發布新的構建版本。
  • 20+統計分析軟體使用工具包,一次全搞定
    數據越來越多,使用統計軟體對數據進行處理不失為一個減少工作量的好辦法。在學習統計時,又怎麼能少得了各種分析數據的助手呢?情報站為大家準備了常用統計軟體使用工具包,各項常用統計軟體課程一次全到手!(領取方式見文末)統計分析工具包1、權威機構發布:生物統計講座SPSS軟體使用視頻教程2、零起點直達高級:SPSS20快速入門基礎教程(軟體+視頻)3、零基礎學Stata:Meta分析教程(軟體+視頻)
  • 軟體安全測試:安全左移的痛點與要點
    ,需人工複合; (5)無法準確掌握軟體所使用開源組件的資產使用情況和安全漏洞情況。可以說,通過這四類技術的實踐應用和有機融合,能夠有效開展軟體安全測試。 而當前軟體研發團隊普遍使用的研發流程為「需求、設計、編碼、測試、部署運營」,並在DevOps過程中做到流程的快速迭代。研發團隊根據軟體安全保障的需要和自身的能力,選擇、配置和實施有關軟體安全測試的實踐,如:使用SAST技術執行白盒安全測試、使用DAST技術執行黑盒安全測試。
  • Octonion發布STM32Cube擴展軟體包
    打開APP Octonion發布STM32Cube擴展軟體包 STM32單片機 發表於 2020-12-22 15:54:20
  • 軟體測試的魅力何在?為什麼選擇測試而不做開發?
    不斷變化的行業現狀 在早年,軟體測試還屬於一個嶄新的內容,出現在大家的眼中。而軟體測試究竟需要什麼樣的軟體基礎,還不得而知。但是看近年,軟體測試越來越受到公司的重視,軟體測試工程師崗也在凸顯重要的作用。然而測試人員數量的增長反映了優秀測試人員相當稀缺,原則上在自動化覆蓋率高的行業,從業人員相對較少。
  • 谷歌發布TensorFlow,用於測試人工智慧模型的隱私保護
    谷歌發布了隱私保護TensorFlow工具包,可以評估各種機器學習分類器的隱私屬性。當前,各種人工智慧隱私技術仍然是社區內爭論的話題,但還沒有一個規範的指南來建立一個私有模型。分類器越精確,記憶就越多,因此模型的隱私保護就越少,做出高精度預測的攻擊者將成功找出訓練集中使用了哪些數據。新模塊提供的測試是黑盒,這意味著它們只使用模型的輸出,而不是內部或輸入樣本。它們產生一個漏洞得分,確定模型是否從訓練集中洩漏信息,並且它們不需要任何再訓練,使得它們相對容易執行。
  • Jenkins+Docker+SpringCloud+K8s構建持續集成平臺
    Jenkins是什麼Jenkins是一個開源軟體項目,是基於Java開發的一種持續集成工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平臺,使軟體的持續集成變成可能。Jenkins的6大特徵:開源的ava語言開發持續集成工具,支持持續集成,持續部署易於安裝部署配置可通過yum安裝,或下載war包以及通過docker容器等快速實現安裝部署可方便web界面配置管理。
  • 英特爾為 XPU 軟體開發推出 oneAPI 工具包正式版本
    IT之家12月11日消息 英特爾於 12 月 9 日發布了 oneAPI 工具包正式版,即 11 月宣布將推出的英特爾 oneAPI Gold 版本,將用於為英特爾 CPU、GPU 和 FPGA 等(統稱為 XPU)開發跨架構應用程式。
  • An2020安裝教程 animate 軟體安裝包怎麼使用Adobe下載方法步驟
    An2020安裝教程 animate 軟體安裝包怎麼使用Adobe下載方法步驟 原標題:An2020安裝教程 animate
  • 軟體測試你了解多少?寫給在學軟體測試的新人
    一、關於軟體測試你了解多少?軟體測試最經典的定義:在規定的條件下對程序進行操作,以發現程序錯誤,衡量軟體質量,並對其是否能滿足設計要求進行評估的過程。測試一般指軟體測試工程師,說白了就是軟體開發過程中的質量檢測者和保障者,負責軟體質量的把關工作。
  • 十個最流行的軟體測試工具!
    隨著軟體快速交付需求的增長,越來越多的企業開始通過DevOps方法加速軟體開發速度。但是,「魚」和「熊掌」不可兼得,有時候軟體的快速交付,並不能完全保證質量。而測試自動化可有效解決軟體快速交付問題,並能確保質量。尤其是隨著人工智慧和ML的出現,新一代測試工具正在以高性能、智能化測試為特色,提供服務。
  • 英特爾為XPU軟體開發推出oneAPI工具包正式版本
    英特爾於12月9日發布了英特爾 oneAPI工具包的正式版本(即11月宣布將推出的英特爾oneAPI Gold版本),將用於為英特爾 CPU另外面向高性能計算、人工智慧、物聯網和渲染,額外工具包還提供工具和組件幫助加速專業工作負載。 英特爾oneAPI工具包讓開發者能夠使用跨XPU的單一代碼庫來開發跨架構應用程式,充分利用獨特的硬體特性並降低軟體開發和維護成本。開發者可以針對他們要解決的特定問題選擇最佳的加速器架構,且無需為新的架構和平臺再次重寫軟體。
  • 常用的軟體測試工具大全
    通過以模擬上千萬用戶實施並發負載及實時性能監測的方式來確認和查找問題,LoadRunner 能夠對整個企業架構進行測試。通過使LoadRunner ,企業能最大限度地縮短測試時間,優化性能和加速應用系統的發布周期。LoadRunner 是一種適用於各種體系架構的自動負載測試工具,它能預測系統行為並優化系統性能。
  • BlackArch Linux 2020.12.01 發布,滲透測試發行版
    時隔半年,BlackArch Linux 發布了2020年的最後一次版本更新 2020.12.01,新版本增加了超過 100 款工具
  • 南京軟體測試培訓怎麼樣?南京軟體測試培訓課程要學多久?
    現在很多年輕人都喜歡從事跟計算機相關的工作,那麼軟體測試其實是一個不錯的工作方向。南京軟體測試培訓怎麼樣?很多人可能並不了解軟體測試這份工作,也不知道具體要培訓多長時間,下面小編就來和大家說一說南京軟體測試培訓課程要學多久?
  • Ubuntu 20.04 切換至使用 Snap 版本的應用商店
    Ubuntu 開發團隊的郵件列表顯示,即將發布的 Ubuntu 20.04 將默認附帶 Snap 版本的應用商店。ubuntu-desktop 和 ubuntu-minimal meta-packages 已被引入應用商店中,以代替常見的 apt/repo 版本。