[教程] 以 Docker 實現多 PHP 版本自動化測試

前言

最近在公司研究了一下多 PHP 版本自動化測試,為了讓之後版本升級比較沒那麼痛苦,考慮之後整合進開發流程中。

畢竟,PHP 7.0 也即將於今年 12 月 3 日終止 Active Support,升為 PHP 7.1 勢在必行。

步驟

基礎配置

Step 1. 環境配置

laravel new DockerLaravel # 建立一個名為 DockerLaravel 的新專案
mkdir -p DockerLaravel/docker/phpunit/7.0
mkdir -p DockerLaravel/docker/phpunit/7.1
mkdir -p DockerLaravel/docker/phpunit/7.2

Step 2. 建立各版本所需要的 Dockerfile

這邊下個註解,這裡的 Dockerfile 都是可以整合進版本控制的。

# 路徑:DockerLaravel/docker/phpunit/7.0/Dockerfile
FROM php:7.0-cli
WORKDIR /tmp
CMD ["php", "/tmp/vendor/bin/phpunit", "-c", "/tmp/phpunit.xml"]
# 路徑:DockerLaravel/docker/phpunit/7.1/Dockerfile
FROM php:7.1-cli
WORKDIR /tmp
CMD ["php", "/tmp/vendor/bin/phpunit", "-c", "/tmp/phpunit.xml"]
# 路徑:DockerLaravel/docker/phpunit/7.2/Dockerfile
FROM php:7.2-rc-cli # 目前 PHP 7.2 仍為 RC 版本
WORKDIR /tmp
CMD ["php", "/tmp/vendor/bin/phpunit", "-c", "/tmp/phpunit.xml"]

Step 3. 撰寫 build 用命令稿

我是比較傳統派的,什麼 docker-compose 之類的新潮工具雖然會用,不過還是習慣用傳統的 Bash Script

這邊再下個註解,build 用的 Shell Script 可以視公司的開發習慣決定是否整合進版本控制。有些公司會統一用一樣的 Docker Registry,統一用一樣的 image 進行測試,有些則是放任開發者自行測試後再提交進系統做 CI/CD。

# 路徑:DockerLaravel/docker/test.sh
#!/bin/bash

versions=("7.0" "7.1" "7.2")

for version in ${versions[@]}; do
    image=`whoami`:phpunit:$version
    path="docker/phpunit/$version"
    if [ ! "$(docker images -q $image 2> /dev/null)" == "" ]; then # 當本地找不到 docker image 時,依照 Dockerfile 建立之
        echo "Build docker image for PHP $version"
        docker build -t $image $path
    fi
done

for version in ${versions[@]}; do
    echo "Testing for PHP $version..."
        docker run --rm -it -v `pwd`:/tmp/project `whoami`/phpunit:$version # 執行 Docker image,且執行完畢後刪除 container
done

進階配置:加入 phpunit code coverage

若要使用 phpunit --coverage-text 分析測試覆蓋率,則需要加入 xdebug

在 Docker 中我們可以很輕易地安裝 xdebug,以下使用 7.0 的 Dockerfile 作為範例

# 路徑:DockerLaravel/docker/phpunit/7.0/Dockerfile
FROM php:7.0-cli
RUN pecl install xdebug-2.5.5 && docker-php-ext-enable xdebug
WORKDIR /tmp
CMD ["php", "/tmp/vendor/bin/phpunit", "-c", "/tmp/phpunit.xml", "--coverage-text"]

變更完 Dockerfile 後,重新 build Docker image 即可,其執行方式不變

值得注意的是

  • xdebug 2.5.5 尚未支援 PHP 7.2
  • phpunit 6.4.2 已不支援 PHP 5.6
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 6年前 加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

順帶一提,只使用 Dockerfile 的原因還有因為這樣可以比較容易遷移到 rkt 或其它的容器服務上。

不會被綁死在 docker 這一個容器服務

6年前 评论

你们生产环境也是使用 docker 吗?还是只是在测试环境使用 docker?

6年前 评论

@MrJing 現在的架構是完全沒有用到容器化技術,不過有考慮導入,所以我先研究了一下

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!