你一定聽過 CI/CD 這個很夯的名詞。CI (Continuous integration) 持續整合,CD (continuous delivery) 持續部署。但在這一系列並不在討論範圍之內,因為就開放原始碼的套件作品而言,不存在著從測試到部署上正式環境的需求,它就只是一個公開放在儲存庫的原始碼而已。但存在著持續性整合測試的需求:
- 當有其它熱心的開發者想要發送一個 PR,CI 流程將自動測試,並初步回覆該 PR 的測試結果成功或者失敗。如果有失敗,表示該服務者未經過測試就發送 PR 了,時間有限的你,其實可以略過不進行程式碼審查了,只看有測試成功及有建設性的特色補強及 Bug 修正的 PR。
- 公開的測試成功的結果,會增強開發者們採用你的套件作品的信心。
- 本地開發端的環境不代表上線後的環境,例如在 Windows 開發的專案,即使單元測試可能也測不出檔案名稱大小寫的問題。所以多多測試、測好測滿,只有好處沒半點壞處。
GitHub Action
GitHub Action 由 JavaScript 所編寫,在市集上已經有許多熱心的開發者已經寫好的快速建立好這一整套 CI 測試流程的腳本,也幸虧有開源社群的活力,我們才能很快地簡單地採用。
(圖:GitHub Action 市集)
讀者們可以在上面搜尋自己需要的腳本,不限於 PHP。
Runner 規格
每次測試所使用的虛擬機 Runner 規格:
- 2 核心 CPU
- 7 GB 記憶體
- 14 GB 的 SSD 硬碟
支援的作業系統
作業系統 | 設定檔的 YAML 標籤 |
---|---|
Windows Server 2019 | windows-latest 或 windows-2019 |
Ubuntu 20.04 | ubuntu-20.04 |
Ubuntu 18.04 | ubuntu-latest 或 ubuntu-18.04 |
Ubuntu 16.04 | ubuntu-16.04 |
macOS Catalina 10.15 | macos-latest 或 macos-10.15 |
- Linux 系統主要支援 Ubuntu LTS 版本
- Mac 和 Ubuntu 的 Runner 都支援無密碼的
sudo
指令。
GitHub Action 設定檔
在 GitHub 的儲存庫中,建立一個 .github/workflows
的目錄,並放上一個 .yml
檔案,在每次有事件發生時,就會在這個目錄等下找尋 .yml
檔案並解析內容,開始 CI 流程。
檔案名稱可自行命名,以筆者為例,命名為 php.yml
範例檔案位置:simple-cache/.github/workflows/php.yml
設定檔中的 YAML 欄位,在官方文件有詳細解說。
範例說明
(範例圖示 A)
name
第一行:
name: build
設定工作流程的名稱。例如本例:build。
(範例圖示 B)
on
觸發的事件。可以為單一個字串,或陣列,或指定事件在那一個分支上觸發。
第 3-7 行:
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
只指定在 master 分支上發生 push
及 pull_request
事件才觸發。
jobs
工作運行。可同時多個 job。在筆者的設定檔只有一個。名稱為 run
。
第 9-16 行:
jobs:
run:
runs-on: ${{ matrix.operating-system }}
strategy:
matrix:
operating-system: [ubuntu-16.04]
php-versions: ['7.1', '7.2', '7.3']
name: PHP ${{ matrix.php-versions }}
runs-on
指定的作業系統名稱。在這個設定檔案使用 strategy
標籤創造一個多重版本測試環境。例如圖 B,有三個 PHP 版本同時進行測試。
steps
第 18-59 行。各個工作步驟。
uses
執行腳本。
第 19 行:官方的腳本。
- uses: actions/checkout@v2
第 40 行:筆者採用這個腳本來建立三個 PHP 版本環境。
- uses: shivammathur/setup-php@v2
name
每個步驟的名稱
run
第 15 行:建立測試用的 MySQL 資料庫
run: sudo mysql -uroot -proot -h 127.0.0.1 -e 'CREATE DATABASE shieldon_unittest;'
在 run
標籤裡可以使用 sudo
指令操作平常在 linux 的終端機能做的事,例如用 apt 裝套件等等,來建置測試環境。
觸發測試
當第一次把 .yml
檔寫好後上傳,立即就會觸發了。因為筆者指定的是 push
和接收到 PR 的 pull_request
事件。
第一次忘了建測試資料庫,所以測試失敗了。
點進去看測試失敗的原因。發現是出在資料庫無法連線。
1) Shieldon\Test\SimpleCache\MysqlTest::testDriverCombinedTests
PDOException: SQLSTATE[HY000] [2002] Connection refused
趕緊修正一下設定檔。
測試成功。
不要忘記取得狀態徽章放到 README 去喔。
總結
在開放原始碼的專案中,善用像是 GitHub Action 這樣的服務是必要的。一方面可以自動化測試觸發的事件,一方面也可以增加其它開發者對自己專案作品的信任感,最重要的是在不同平台、不同版本測出來的結果才趨近於真實情況,提早發現可能的問題。
配合鐵人賽而生的專案程式碼會隨時修改,不一定會和本篇文章一樣。如看範例,請見本篇進度的程式碼。明天筆者會介紹關於單元測試的覆蓋率與其它第三方好用的工具。我們明天見唷。
留言