都是自架 Jenkins 進行測試,產覆蓋率報告
雖然要處理一堆設定,還要裝一堆套件
不過客製化上比較方便
後來學長開始試用 Gitlab CI 後,發現比 Jenkins 好設定許多
主要是寫一個 .gitlab-ci.yml 設定
雖然方便,也能進版控,但是也缺了一些功能,像是線上查閱各種報告之類的
感覺也很難根據自己的需求客製化
幾年後,開始寫自己的網站,一時起意,想說再來研究看看能不能弄出覆蓋率報告
好增加自己寫測試的誘因 (明明就是藉口)
接下來有兩個目標
1. 讓 Gitlab Project 顯示覆蓋率的 Badge
像這樣:
2. 可以直接在 Gitlab 上查閱覆蓋率報告 (使用 Gitlab Pages)
https://hackersir.gitlab.io/VSDK/
不過本文的示範有幾個限制:
1. 必須使用 Gitlab CI
2. 使用 PHPUnit 作為示範,其他語言可能要自己摸索
提示:Gitlab Pages 無法設定存取權限,所以私有專案要小心覆蓋率報告會外洩程式碼
這邊我們使用 VSDK (https://gitlab.com/HackerSir/VSDK) 這個專案作為示範
這是當初為學生會開發的開票直播平台
使用 Laravel framework 5.2
目前只會跑 PHPUnit
而且只會產出文字版的覆蓋率簡易報告,輸出在 Console
在這個專案底下,有一個檔案叫 .gitlab-ci.yml ,這是給 Gitlab CI 使用的
Gitlab CI 會根據這個檔案進行動作
以下是檔案的內容
before_script: # Project - composer install --prefer-dist --no-ansi --no-interaction --no-progress --no-scripts --no-suggest - cp .env.example .env - php artisan key:generate - php artisan config:clear - php artisan migrate:refresh --seed after_script: # PHP Code Sniffier - ./vendor/bin/phpcs --config-set ignore_errors_on_exit 1 - ./vendor/bin/phpcs --config-set ignore_warnings_on_exit 1 - ./vendor/bin/phpcs --standard=style_ruleset.xml app variables: # MySQL Service MYSQL_DATABASE: FCU_OIA MYSQL_ROOT_PASSWORD: root_password MYSQL_USER: db_user MYSQL_PASSWORD: secret # Connection Settings DB_DATABASE: FCU_OIA DB_USERNAME: db_user DB_PASSWORD: secret # Other settings for testing CACHE_DRIVER: array SESSION_DRIVER: array phpunit:php7.0:mysql5.6: image: edbizarro/gitlab-ci-pipeline-php:7.0 services: - mysql:5.6 variables: DB_CONNECTION: mysql DB_HOST: mysql DB_PORT: '3306' script: - ./vendor/phpunit/phpunit/phpunit -v --coverage-text --stderr phpunit:php7.0:mysql5.7: image: edbizarro/gitlab-ci-pipeline-php:7.0 services: - mysql:5.7 variables: DB_CONNECTION: mysql DB_HOST: mysql DB_PORT: '3306' script: - ./vendor/phpunit/phpunit/phpunit -v --coverage-text --stderr
先來簡單介紹一下
首先看到縮排最左邊的五行:
1. before_script: 在每一個 Job 之前執行的 script
2. after_script: 在每一個 Job 之後執行的 script
3. variables: 定義變數
4. phpunit:php7.0:mysql5.6: Job Name
5. phpunit:php7.0:mysql5.7: Job Name
可以看到,兩個 Job 使用不同版本的 mysql server,而每一個 Job 的 script 都會執行 phpunit
而 before_script 是網站的安裝步驟,像是 composer、php artisan migrate
而 after_script 則是對程式碼做靜態分析
(.gitlab-ci.yml詳細文件可以參考:https://docs.gitlab.com/ce/ci/yaml/README.html)
基本上只要有 .gitlab-ci.yml ,Gitlab 就會為每次 push 跑一次 CI
(預設應該會用共用的 Gitlab CI Runner,每個月有額度上限)
(當然有可以自己架一台,就不用排隊等機器)
(Plan 可以參考:https://about.gitlab.com/gitlab-com/)
那要到哪邊看執行結果,可以到專案的 Pipelines
點擊左邊的「passed」,或是 Pipeline 編號,可以看到更詳細的資料
之後在點 Job 可以看到 Coverage,不過是空的
OK,首先我們先讓 Gitlab 抓到覆蓋率是多少
之前提到,目前只會顯示在 Console 上,如果你點進 Job 的詳細資料
應該可以看到這樣 (可能需要點圖放大)
看一下白框倒數幾行,可以看到有一行是 Lines: 0.30% (9/3021)
可以得知覆蓋率是 0.30% (覆蓋率非常低,我知道)
確定 PHPUnit 會產出覆蓋率之後
接著到專案的 Settings > Pipelines
往下拉,找到如下圖的設定:
讓 Gitlab 去從 Console 找出覆蓋率是多少
這邊剛好有提供 PHPUnit 的範例
先將 「^\s*Lines:\s*\d+.\d+\%」填到上方的 Regular expression
按下 Save changes 存檔
接著修改 .gitlab-ci.yml 檔
將
「- ./vendor/phpunit/phpunit/phpunit -v --coverage-text --stderr」
修改成
「- ./vendor/phpunit/phpunit/phpunit -v --coverage-text --colors=never --stderr」
主要是要有 --coverage-text 以及 --colors=never
--coverage-text 是要輸出覆蓋率的資訊,原本我們就有加
--colors=never 是要關閉顏色輸出,顏色的控制字元會讓 Gitlab 抓不到,不然就是要修改剛剛的 Regular expression
記得有用到的地方都要改,以本文的例子是兩個都要改
完成後,commit & push 到 gitlab 上
等待 Job 跑完後,可以看到 Gitlab 已經抓出覆蓋率了
接下來,我們要在 Readme 上顯示覆蓋率的 badge
一樣到專案的 Settings > Pipelines
往下拉,找到如下圖的地方
複製你需要的 Code 到 Readme (本例是 Markdown)
完成後,回到 Project 頁,Readme 會出現 coverage badge
接著,下一個目標是要能夠在 Gitlab 上查閱詳細的覆蓋率報告
(註:這邊只使用在一個 Job 上,多Job 可能需要研究)
首先,先讓 PHPUnit 產出 html 報告
修改 .gitlab-ci.yml
橘色的部分是新增的部分
phpunit:php7.0:mysql5.7: image: edbizarro/gitlab-ci-pipeline-php:7.0 services: - mysql:5.7 variables: DB_CONNECTION: mysql DB_HOST: mysql DB_PORT: '3306' script: - ./vendor/phpunit/phpunit/phpunit -v --coverage-text --colors=never --coverage-html=coverage --stderr artifacts: paths: - coverage/
--coverage-html=coverage 是讓 PHPunit 輸出 html 版的報告到 coverage 資料夾
artifacts:
paths:
- coverage/
這段是讓 Gitlab CI 將 coverage 資料夾進行打包
commit & push 到 Gitlab 上,讓 CI 開始工作
完成後,可以看到右邊多了下載按鈕
可以把報告整個下載下來
或是到 Job 的 console 輸出
右邊也可以下載或瀏覽(Browse)
不過瀏覽(Browse)似乎只能列出檔案清單
沒辦法直接瀏覽,等等要來解決這個問題
為了能夠直接瀏覽報告,我們需要將內容發佈到 Gitlab Pages
提示:Gitlab Pages 無法設定存取權限,所以私有專案要小心覆蓋率報告會外洩程式碼
修改 .gitlab-ci.yml
在檔案最後新增一個 Job:
pages: stage: deploy dependencies: - phpunit:php7.0:mysql5.7 before_script: - echo "before_script" script: - rm -r public - mv coverage/ public/ after_script: - echo "after_script" artifacts: paths: - public expire_in: 30 days
這邊要注意的是,Job 名稱一定要是 pages
dependencies是設定此工作要等 phpunit:php7.0:mysql5.7 完成
另外 before_script 和 after_script 是要複寫全域的 before_script 和 after_script
(應該會有更好的做法.....,畢竟才剛開始用 Gitlab CI)
script 要做的工作是把 coverage 重新命名成 public
因為 Gitlab Pages 預設是抓取 public 資料夾
不過在 laravel 專案中已經有 public 資料夾了所以我們先用 「rm -r public」移除 public 資料夾
最後再打包 public 資料夾
編輯後,commit & push 到 Gitlab 上,讓 CI 開始工作
Job 完成後
前往專案的 Gitlab Pages
(本例是:https://hackersir.gitlab.io/VSDK/)
(Group 或 Username + gitlab.io /專案名稱 )
這樣就可以線上看報告了 ^_^
參考資料:
https://about.gitlab.com/2016/11/03/publish-code-coverage-report-with-gitlab-pages/
好詳細的教學,感謝分享
回覆刪除