GitLab流水线中WordPress插件测试的MySQL服务错误排查
WordPress插件GitLab流水线单元测试故障排查与解决
一、解决mysql: command not found/mysqladmin: command not found错误
composer:2镜像默认不包含MySQL客户端工具,需在任务执行容器中手动安装,根据镜像基础系统选择对应命令:
- 基于Alpine的composer镜像(如
composer:2-alpine):before_script: - apk add --no-cache mysql-client - 基于Debian的composer镜像(如
composer:2):before_script: - apt-get update && apt-get install -y mysql-client
二、解决ERROR 2005 (HY000): Unknown server host 'database' (-2)错误
该错误多因MySQL服务未就绪或容器网络连通性问题,按以下步骤修复:
1. 规范MySQL服务容器配置
在.gitlab-ci.yml的services段中,明确设置环境变量与启动参数,确保服务能正常初始化:
services: - name: mysql:8 alias: database command: ["--default-authentication-plugin=mysql_native_password"] variables: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: wordpress_test MYSQL_USER: wp_test MYSQL_PASSWORD: wp_test_pass
2. 添加服务就绪等待逻辑
GitLab CI启动服务容器后,任务容器会立即执行脚本,但MySQL需几秒完成启动,在before_script中加入等待逻辑:
before_script: # 安装mysql-client(根据镜像系统选择对应命令) - apt-get update && apt-get install -y mysql-client # 循环等待MySQL服务就绪 - | until mysql -h database -u root -p"$MYSQL_ROOT_PASSWORD" -e "SELECT 1"; do echo "等待MySQL服务启动..." sleep 2 done
3. 验证容器网络连通性
若等待后仍无法连接,可在before_script中添加ping命令测试主机解析:
- ping -c 3 database
如果ping不通,检查GitLab Runner配置,确保启用Docker bridge网络模式(默认配置,保证任务容器与服务容器在同一网络)。
完整测试任务配置示例
stages: - test unit-test: stage: test image: composer:2 services: - name: mysql:8 alias: database command: ["--default-authentication-plugin=mysql_native_password"] variables: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: wordpress_test MYSQL_USER: wp_test MYSQL_PASSWORD: wp_test_pass before_script: - apt-get update && apt-get install -y mysql-client - | until mysql -h database -u root -p"$MYSQL_ROOT_PASSWORD" -e "SELECT 1"; do echo "等待MySQL服务启动..." sleep 2 done - composer install - curl -O https://raw.githubusercontent.com/wp-cli/wp-cli/master/utils/wp-cli-tests/install-wp-tests.sh - bash install-wp-tests.sh wordpress_test wp_test wp_test_pass database latest true script: - phpunit
额外注意事项
- 确保
install-wp-tests.sh中的数据库主机参数为database(与服务容器别名一致) - MySQL 8.0必须设置
--default-authentication-plugin=mysql_native_password,否则旧版客户端无法完成认证 - 本地Docker环境正常是因为手动控制了服务启动顺序,GitLab CI需显式添加等待逻辑
内容的提问来源于stack exchange,提问作者fudo
相关产品推荐
相关产品推荐

