使用 Snapcraft 構建、測試併發布 Snap 軟體包
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。原始文章可以從 這裡 找到。
via: https://insights.ubuntu.com/2017/06/28/build-test-and-publish-snap-packages-using-snapcraft/
譯者簡介:
常年混跡於 snapcraft.io,對 Ubuntu Core、snaps 和 snapcraft 有濃厚的興趣,並致力於將這些還在快速發展的新技術透過翻譯或原創的方式介紹到中文世界。有興趣的小夥伴也可以關注譯者個人的公眾號:
Snapcraft
作者:Ricardo Feliciano 譯者:Snapcrafter 校對:wxy
相關文章
- 【Azure DevOps系列】Azure DevOps構建併發布Nuget程式包dev
- 快速構建CLI程式併發布到PyPi
- 軟體測試軟環境的構建與優化優化
- 建立併發布自己的nuget包
- 利用Ant實現專案自動構建測試備份併發布到專案web(2) (轉)Web
- 利用Ant實現專案自動構建測試備份併發布到專案web(3) (轉)Web
- 利用Ant實現專案自動構建測試備份併發布到專案web(1) (轉)Web
- 使用distillery 構建專業的 phoenix 專案軟體包
- Ubuntu 的 snap 軟體包封裝真的安全嗎?Ubuntu封裝
- 開發 Laravel 包併發布到 packagist(composer)Laravel
- 配置軟體原始碼包構建環境原始碼
- 軟體測試培訓分享:哪家軟體測試培訓機構好?
- 軟體驗收測試有哪些測試方法?北京權威軟體測試機構安利
- 軟體測試培訓分享:軟體測試和軟體開發學哪個好呢
- 軟體測試真的比不上軟體開發嗎?
- 【軟體測試】軟體及其開發過程
- Zuora招聘JAVA軟體開發\軟體測試Java
- 軟體驗收測試之α測試和β測試,如何選擇權威的軟體檢測機構
- 軟體驗收測試 第三方軟體測試 軟體功能測試 軟體資訊保安測試
- 『夢話高併發』J.U.C@併發包整體結構
- 什麼是軟體測試架構架構
- 軟體測試發展趨勢
- 使用 TDD 測試驅動開發來構建 Laravel REST APILaravelRESTAPI
- 【軟體測試】——介面測試
- 軟體測試培訓分享:軟體測試的發展空間大嗎
- 軟體功能測試在軟體開發中的重要性。在哪裡做軟體測試?
- 軟體測試——三、軟體測試的分類
- 第三方軟體測試機構簡析軟體測試之原則
- 做軟體安全測試,找第三方軟體測試機構更安心!
- vue cli4構建基於typescript的vue元件併發布到npmVueTypeScript元件NPM
- 軟體工程——軟體測試軟體工程
- 使用SQLT來構建Oracle測試用例SQLOracle
- 軟體測試
- 第三方軟體測試機構▏軟體效能測試的測試流程和指標簡析指標
- 軟體測試開發:常見測試型別概念型別
- 軟體測試培訓分享:軟體測試的職業發展方向有哪些
- 什麼是軟體測試架構師架構
- 軟體自動測試架構設計架構