你一定聽過 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-latestwindows-2019
Ubuntu 20.04 ubuntu-20.04
Ubuntu 18.04 ubuntu-latestubuntu-18.04
Ubuntu 16.04 ubuntu-16.04
macOS Catalina 10.15 macos-latestmacos-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 分支上發生 pushpull_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 這樣的服務是必要的。一方面可以自動化測試觸發的事件,一方面也可以增加其它開發者對自己專案作品的信任感,最重要的是在不同平台、不同版本測出來的結果才趨近於真實情況,提早發現可能的問題。

本篇進度的程式碼
鐵人賽而生的專案程式碼

配合鐵人賽而生的專案程式碼會隨時修改,不一定會和本篇文章一樣。如看範例,請見本篇進度的程式碼。明天筆者會介紹關於單元測試的覆蓋率與其它第三方好用的工具。我們明天見唷。

最後修改日期: 2022-02-16

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。