[教程] 以 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
于 7年前 加精
順帶一提,只使用 Dockerfile 的原因還有因為這樣可以比較容易遷移到
rkt
或其它的容器服務上。不會被綁死在 docker 這一個容器服務
你们生产环境也是使用 docker 吗?还是只是在测试环境使用 docker?
@MrJing 現在的架構是完全沒有用到容器化技術,不過有考慮導入,所以我先研究了一下