CircleCI 是山姆鍋到目前為止認為最好用的雲端持續整合方案 。 《 我 . 影化身 》 開發自然也需要利用持續整合來自動執行軟體測試與建置工作 。 本文便以 《 我 . 影化身 》 作為應用實例 , 說明如何簡單完成與 CircleCI 的設定 。

山姆鍋假設您已經有 GitHub 以及 CircleCI 關聯的帳戶 , 且有可以使用的開源專案 。 如果沒有 , 您也可以直接 Fork 《 我 . 影化身 》 開源專案 :https://github.com/eavatar/eavatar-me

設定目標

山姆鍋希望每次有程式碼簽入 (check-in) 時 , 便會啟動整個建置流程完成下列工作 :

  • 執行單元測試
  • 執行功能測試
  • 製作應用發行包 (distribution package)

未來目標之一是能夠建置 Docker 映像 (image), 但本文並沒有相關說明 。 想了解如何使用 CircleCI 建置 Docker 映像 , 可以參考 Amo Wu 的 DevOps: 持續整合 & 持續交付 (Docker、CircleCI、AWS)

建置環境需求

自動跟手動建置軟體對於環境的需求基本上是類似的 , 對於 《 我 . 影化身 》 建置環境的基本需求 , 請參考專案文件 : http://docs.eavatar.me/en/latest/development.html

準備描述檔 circle.yml

要讓專案可以在 CircleCI 建置 , 基本上只需要一個描述檔 , circle.yml。 透過這個描述檔 , CircleCI 便可以了解專案所需要的執行環境 , 以及根據描述安裝相依套件 、 執行測試 、 建置與部署工作 。

general:
    artifacts:
        - "dist/avame-0.1.0+${CIRCLE_BUILD_NUM}.tgz"

dependencies:
    override:
        - sudo mkdir -p /usr/local/lib
        - sudo pip install -U pip
        - sudo easy_install -U setuptools
        - pip install -r requirements.txt
        - pip install selenium

test:
    override:
        - sudo cp plat.libs/libsodium.so.13.1.0 /usr/local/lib/
        - sudo ln -s /usr/local/lib/libsodium.so.13.1.0 /usr/local/lib/libsodium.so.13
        - sudo ln -s /usr/local/lib/libsodium.so.13.1.0 /usr/local/lib/libsodium.so
        - PYTHONPATH=".:./src" py.test -vvv tests/unit/
        - PYTHONPATH=".:./src" py.test -vvv tests/functional/test_home_page.py
        - PYTHONPATH=".:./src" pyinstaller pack/avame.spec --clean -y
    post:
        - cd dist && tar zcvf avame-0.1.0+${CIRCLE_BUILD_NUM}.tgz avame/

其中 ,

  • general:

    描述建置完成後要保留的產出物 (artifacts), 這裏山姆鍋指定建置出來的應用發行包 。

  • dependencies:

    安裝編譯 、 測試過程會用的系統與應用套件 。 這裏也升級 pip 以及 setuptools 套件 , 這是從之前的專案移植過來 , 已經不確定需不需要了 。 安裝 selenium 是為了網頁介面的功能測試 ,CircleCI 已經有安裝測試時需要的 Firefox 瀏覽器 。

  • test/override:

    把 Ubuntu 環境需要使用的 libsodium 動態連結檔複製到正確的位置 。 《 我 . 影化身 》 使用它來支援非對稱式 加解密功能 。 如果沒有這個步驟 , 相關測試會出現找不到程式庫的問題 。 本文範例只使用一個簡單的功能測試案例 , 這部分內容會根據專案進展而更動 。

  • test/post:

    如果單元以及功能測試都完成 , 打包發行套件所需的檔案 。 這裏檔名中 ${CIRCLE_BUILD_NUM} 部分 , 會根據環境變數 CIRCLE_BUILD_NUM 來決定 , 代表目前建置工作的順序編號 。 CircleCI 在建置時會提供一些環境變數 , 可以參考這篇文件 : https://circleci.com/docs/environment-variables

開始持續集成工作

要讓 CircleCI 開始為專案工作 , 需要完成下列步驟 :

  1. 登入 CircleCI, 從選單 ( 應該在左邊 ) 選擇 "Add Projects"
  2. 選擇要使用的 GitHub 用戶或組織帳戶
  3. 選擇要建置的專案 , 點擊 "Build project"

以上步驟是根據撰寫本文時的使用介面流程 , 如果跟您看到的不同 , 請自行斟酌調整 。 由於已經授權過 CircleCI 自動設定 GitHub 上的開源專案 ,CircleCI 會幫我們把相關的設定完成 。 之後只要有程式碼 check-in, 便會自動執行建置工作 。 其它有更多的設定可以運用 , 請自行參考 CircleCI 文件

結語

雖然文章沒有提到 , 但 CircleCI 對於 Docker 映像 (image) 建置的支援也很完整 。 不過這是根據山姆鍋之前的經驗 , 現在其它雲端持續整合方案應該也有 Docker 支援才對 。 因為 《 我 . 影化身 》 有圖形用戶介面 , 需要針對不同桌面環境做建置工作 , 採用 CircleCI 主要是做持續整合測試與 Docker 映像的建置與發佈工作 。