如何在Bitbucket Pipeline中测试Guzzle集成测试?
解决Bitbucket Pipeline中无法识别Docker服务名的问题
问题原因
本地Docker Compose环境里,服务名能通过Docker内部DNS自动解析,但Bitbucket Pipeline默认只运行单个测试容器,没有启动你的Web服务容器,因此docker_service_name这个主机名无法被解析,导致连接失败。
解决方案
方案1:使用Bitbucket Pipeline的Services配置(推荐)
通过definitions.services定义你的Web服务容器,让Pipeline在运行测试时自动启动该服务,测试容器可直接通过服务名访问它。
修改后的bitbucket-pipeline.yaml示例:
image: php:7.1.1 pipelines: default: - step: script: - apt-get update && apt-get install -y unzip - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer - composer install - vendor/bin/phpunit services: - docker_service_name # 关联定义好的服务 definitions: services: docker_service_name: image: your-web-app-image:latest # 替换为你的Web服务镜像地址 ports: - 80:80 # 根据你的Web服务端口调整
- 确保
definitions.services下的服务名docker_service_name和测试代码中的主机名完全一致 - 如果你的Web服务镜像是私有仓库,需在Pipeline中配置Docker镜像拉取权限
方案2:手动添加Hosts映射(适用于Web服务部署在外部或手动启动容器的场景)
如果Web服务已部署在外部地址,或需要在测试脚本中手动启动容器,可通过修改测试容器的/etc/hosts文件,将docker_service_name映射到对应IP地址:
在Pipeline的script中添加以下命令:
# 替换为你的Web服务实际IP地址 echo "xxx.xxx.xxx.xxx docker_service_name" >> /etc/hosts
若在测试容器内手动启动Web服务,需先启动容器并映射端口,再添加Hosts映射:
# 启动Web服务容器并映射端口到测试容器的8080 docker run -d -p 8080:80 your-web-app-image:latest # 将docker_service_name映射到本地回环地址 echo "127.0.0.1 docker_service_name" >> /etc/hosts # 同时修改测试代码中的base_uri为http://docker_service_name:8080/api/
注意事项
- 确保Web服务容器在测试执行前完全启动,可在
script中添加等待命令(如wait-for-it工具),避免因服务未就绪导致连接失败 - 检查Web服务的端口配置,确保测试代码中的端口与容器暴露的端口一致
内容的提问来源于stack exchange,提问作者Nico Anastasio
相关产品推荐
相关产品推荐

