Jenkins流水线测试故障时替换Puppeteer容器的实现问题
解决方案
要实现测试失败时重启Puppeteer容器的逻辑,核心是让Jenkins Agent容器能执行Docker命令并访问docker:dind的Docker守护进程,具体步骤如下:
1. 修改Puppeteer测试镜像的Dockerfile
在你的MyDockerFileFolder/Dockerfile中添加Docker客户端安装和权限配置,确保容器内可执行Docker命令:
# 以常用的Node.js基础镜像为例,可根据你的实际基础镜像调整 FROM node:18-bullseye # 安装Docker客户端 RUN apt-get update && apt-get install -y --no-install-recommends docker.io \ && rm -rf /var/lib/apt/lists/* # 将容器用户加入docker组,避免Docker命令权限报错 RUN usermod -aG docker node
2. 调整Jenkins Pipeline的Agent配置
让Agent容器能连接到docker:dind的Docker守护进程,二选一即可:
方式一:挂载Docker Socket(适用于docker:dind与Jenkins共享宿主机Socket的场景)
agent { dockerfile { filename 'Dockerfile' dir 'MyDockerFileFolder' additionalBuildArgs '--build-arg UID=$(id -u) --build-arg GID=$(id -g) -t puppeteer-testing-image' args '-v /var/run/docker.sock:/var/run/docker.sock' } }
方式二:TCP连接docker:dind(适用于docker:dind作为独立容器部署的场景,需确保两者在同一Docker网络)
agent { dockerfile { filename 'Dockerfile' dir 'MyDockerFileFolder' additionalBuildArgs '--build-arg UID=$(id -u) --build-arg GID=$(id -g) -t puppeteer-testing-image' environment { DOCKER_HOST = 'tcp://docker:2375' // "docker"是你的docker:dind容器名称 } } }
3. 在Failure块中添加容器启停逻辑
假设你的测试容器固定名称为puppeteer-test-container,添加命令确保旧容器被清理后启动新容器:
post { failure { // 停止并删除旧容器,|| true 避免容器不存在时命令报错中断流水线 sh 'docker stop puppeteer-test-container || true' sh 'docker rm puppeteer-test-container || true' // 启动新的测试容器,-d 让容器后台运行 sh 'docker run -d --name puppeteer-test-container puppeteer-testing-image' } }
额外说明
- 如果你的测试是直接在Jenkins Agent容器内运行(而非单独启动Puppeteer容器),重启Agent容器无意义——Jenkins会自动管理Agent的生命周期,此时应优先优化测试逻辑而非重启容器。
- 若使用TCP连接
docker:dind,启动docker:dind时需添加参数--privileged -e DOCKER_TLS_CERTDIR=""(关闭TLS方便测试,生产环境建议配置TLS加密)。
内容的提问来源于stack exchange,提问作者ITnewbie
相关产品推荐
相关产品推荐

