[ Laravel從入門到精通 ] 測試系列 —— 基於 Github + Travis CI 實現 Laravel 專案的持續整合
在上一篇教程中,學院君介紹瞭如何在 Github 中整合 CircleCI 實現 Laravel 專案的持續整合,今天,我們基於介紹如何在 Github 中整合 TravisCI 實現 Laravel 專案的持續整合(構建、測試流程自動化),相較於 CircleCI,Travis CI 與 Github 整合更加友好,並且針對開源專案,Travis CI 完全免費,所以推薦在開源專案中使用 Travis CI 做持續整合。
建立 Github 程式碼倉庫
如果你還沒有在 Github 中為專案建立倉庫,請參考上篇教程示例為待辦任務專案建立一個程式碼倉庫,如果已經建立,則可以跳過此步驟。
整合 TravisCI 到 Github 專案
建立好程式碼倉庫後,接下來,我們要把 Travis CI 整合到 Github 專案中,以便 push 程式碼到倉庫時,可以執行相應的持續整合指令碼。
我們在Github Marketplace 的 Continuous integration 類目 可以快速定位到 Travis CI 應用:
點選上述截圖中的紅色區域,進入 Travis CI 應用詳情頁,可以看到該應用開箱支援 PHP 語言,點選「Set up a free trial」,進入訂閱計劃選擇區域:
在訂閱計劃選擇區域中,選擇開源專案選項:
然後點選綠色的「Install it for free」按鈕開始安裝,和 CircleCI 類似,安裝之前有一個訂單確認頁面,點選綠色確認按鈕確認即可:
然後,我們需要在安裝介面選擇要整合 Travis CI 的程式碼倉庫,或者你也可以一次性選擇所有倉庫,這裡我們選擇待辦任務專案對應的todoapp
程式碼倉庫:
點選「Install」按鈕正式開始安裝,然後頁面會跳轉到Travis CI 網站 ,需要我們授權繫結 Github 賬戶到 Travis CI,以便打通 Github 程式碼倉庫與 Travis CI 專案之間的關聯:
授權成功後,就會跳轉到如下歡迎頁面:
點選頭像下拉選單中的「Settings」連結,即可進入與 Github 關聯的倉庫和設定頁面,你可以點選右面右下角的「Settings」按鈕,檢視該專案的構建頁面:
由於我們還沒有提交程式碼,也沒有為專案編寫 Travis CI 配置檔案,所以當前構建記錄為空:
回到該專案的 Github 頁面,在「Settings->Integrations & services」頁面中即可看到與該專案關聯的 Travis CI 應用,這一點和 CircleCI 不同,CircleCI 與 Github 倉庫關聯配置位於 Webhooks 選單中:
點選「Configure」按鈕可以對關聯資訊進行修改,主要是修改 Travis CI 關聯的 Github 倉庫,這裡不需要做調整。
至此,我們已經完成了 Travis CI 與 Github 程式碼倉庫的關聯,接下來,我們需要為專案編寫 Travis CI 能夠識別的配置檔案並提交到倉庫,以便 Travis CI 能夠根據該配置檔案進行自動構建和測試工作,從而實現持續整合。
編寫 TravisCI 配置檔案
和 CircleCI 一樣,Travis CI也支援 YAML 配置檔案,在編寫 Travis CI 配置檔案之前,我們先來簡單看下 Travis CI 進行持續整合的底層原理。
Travis CI 底層執行原理
Travis CI 根據專案根目錄下的.travis.yml
配置檔案對測試環境進行初始化,然後按照配置檔案中會定義的構建、測試、部署流程對專案進行構建、測試及部署。
和 CircleCI 不太一樣,Travis 會為每種不同語言提供預設整合環境,然後根據每個專案自定義的 Travis 配置檔案來建立虛擬機器,將程式碼倉庫克隆進去,再根據可選外掛和服務對環境進行初始化,以及後續構建、測試或部署操作。
對於 Travis CI 預設的虛擬機器設定我們不用關心,只需圍繞專案本身對配置檔案.travis.yml
進行自定義編排即可,下面我們就來建立並編輯這個檔案。
編寫.travis.yml
配置檔案
在專案根目錄下建立 Travis CI 可以識別的.travis.yml
配置檔案:
touch .travis.yml
然後編輯.travis.yml
檔案內容如下:
language: php php: - 7.3 services: - mysql addons: chrome: stable install: - mv .env.testing .env - mysql -e 'create database todoapp;' - composer self-update - composer install --no-interaction --prefer-dist --no-suggest - npm install - npm run production - php artisan key:generate - php artisan migrate - php artisan passport:install before_script: - google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://localhost & - php artisan serve & script: - vendor/bin/phpunit - php artisan dusk
下面我們簡單看下這個配置檔案都做了哪些工作:
- 首先,指定專案對應的程式語言和版本,這裡是 PHP 7.3;
-
由於待辦任務專案需要用到資料庫,所以這裡我們通過
services
指定要啟動mysql
服務; -
對於基於 Dusk 的瀏覽器測試來說,需要 Chrome 瀏覽器,這裡我們通過
addons
來指定; -
然後就是專案初始化需要進行的一些操作:Laravel 環境配置檔案(沿用上篇教程的環境配置)、建立
todoapp
資料庫、通過 Composer 安裝專案的 PHP 依賴、通過 NPM 安裝專案的前端依賴、生成應用金鑰、執行資料庫遷移命令、初始化 Passport,這些工作和 CircleCI 配置檔案定義的一模一樣,只是配置方式不同而已; -
在執行最終測試指令碼之前,我們還要啟動 Chrome 瀏覽器以及通過
php artisan serve
啟動內建的 PHP Web 伺服器以便可以執行 HTTP 測試和瀏覽器測試; -
最後是通過
script
配置的測試指令碼,這裡,我們定義了兩個指令碼,分別是基於phpunit
進行 HTTP 功能測試和基於dusk
進行瀏覽器測試(和上篇介紹 CircleCI 時一樣,如果你想要將測試通過的程式碼自動部署到線上,可以參考將部落格應用自動部署到線上伺服器完整流程詳解 這篇教程基於 Envoy 編寫相應的自動部署指令碼)。
提交程式碼到倉庫觸發 Travis CI 進行構建測試
.travis.yml
配置檔案編寫好了之後就可以提交程式碼更改並將其推送到 Github 倉庫:
git add . git commit -m 'add travis ci config' git push
執行完上述程式碼後,即可檢視 Github 程式碼提交記錄,可以看到提交資訊中有個黃色的小圓點,代表與該專案關聯的持續整合系統在根據此次程式碼推送進行構建、測試,由於我們將該專案關聯到了兩個持續交付系統,所以可以看到 Github 會通知這兩個系統同時對此次推送進行檢查(當然,正常情況下只需要配置一個關聯的 CI 系統即可,因為它們所做的工作是一樣的):
有關CircleCI 的構建我們上篇教程已經詳細介紹過了,這裡我們重點關注下 Travis CI,點選其右側的「Details」連結即可進入 Travis CI 針對此次程式碼提交的構建頁面,該頁面被整合到 Github 網站:
我們可以點選上圖中的紅色區域連結到 Travis CI 網站檢視針對此次提交詳細的構建測試過程,如果你的專案的 Laravel 框架版本高於或等於 5.4,則在構建過程中會報錯:
通過下拉Job log
日誌列表可以看到報錯資訊如下:
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
這是因為 Laravel 5.4 之後資料庫預設字符集調整為了utf8mb4
以支援 emoji 表情,針對此更改,如果 MySQL 版本低於 5.7.7,則執行資料庫遷移命令時會報錯,為了修復此問題,可以在 Travis CI 配置檔案中指定使用更高版本的 MySQL(預設是 MySQL 5.6),我們在addons
中指定mysql
的版本及對應的 APT 安裝包:
addons: chrome: stable apt: sources: - mysql-5.7-trusty packages: - mysql-server - mysql-client dist: trusty sudo: required
再次提交程式碼修改並將其推送到 Github 倉庫,這一次,Travis CI 就會構建成功並在Job log
日誌中顯示測試通過:
程式碼構建測試通過後,就可以將其合併到主幹了。當然在大型公司和系統中,由於涉及到的系統功能模組多、開發人員多,不同團隊之間的開發往往都是並行的,這個流程往往也更加複雜,一般會將倉庫程式碼分為開發分支、釋出分支、主幹分支等多個不同種類的分支,開發分支開發、評審、測試通過後會合併到釋出分支,一個釋出分支往往包含多個開發分支,然後在固定時間節點統一上線,釋出分支上線後才會合併到主幹,然後每次開發新功能都是從主幹檢出新分支,以保證開發分支始終都是最新的、經過測試驗證的程式碼。
當然要系統展開的話,這裡就涉及到 Git 工作流的概念,不過學院君本篇重點介紹的是 Travis CI 本身,所以就不深入討論了。這裡給出的示例都是基於小型系統的、或者自己的開源專案,希望可以起到拋磚引玉的作用,至於如何整合到自己公司現有的持續整合系統中,需要你們自己去思考和嘗試,有什麼問題歡迎與我交流。其實,從開發分支的檢出、到程式碼語法風格的檢查、程式碼測試、Code Review、合併到釋出分支、部署到預發環境、部署到線上環境、以及最終合併到主幹所有這一整套 DevOps 流程都可以通過 API、開源工具實現自動化。
好了,關於基於 Github 和 Travis CI 進行 Laravel 專案的持續整合就簡單介紹到這裡,下一篇,我們將基於 Coding + Jenkins 演示如何對 Laravel 專案進行持續整合。