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

Ricardo Feliciano發表於2017-08-18

使用 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 的方法。在這裡我將提供兩種方法:

  1. artifact —— 在執行 build 任務的時候我們可以將 snaps 儲存為一個 CircleCI 的 artifact(LCTT 譯註:artifact 是 snapcraft.yaml 中的一個 Plugin-specific 關鍵字),然後在接下來的任務中檢索它。CircleCI 工作流有自己處理共享 artifact 的方式,相關資訊可以在 這裡 找到。
  2. 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

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章