Linux中國

使用 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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國