这里为什么要在容器里运行pytest呢?因为如果在Dockerfile里运行pytest,一旦产生测试失败,是会导致jenkins退出shell执行的
Python代码中Dockerfile
FROM python:3.7
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" >> /etc/timezone
WORKDIR .
ADD . .
RUN pip install -r requirements.txt
CMD ["pytest", "-q","testsuites/test_test.py","--alluredir","allure-results"]
Jenkins Job构建
name="apitest"
sudo docker build -t $name .
sudo docker run -d --name $name -v $PWD/allure-results:/allure-results $name
遇到问题
1.解决Jenkins执行sudo命令时出现“sudo: no tty present and no askpass program specified”的错误
这是因为Jenkins服务器在执行sudo命令时的上下文有误,导致这个命令执行的异常。
解决方案:
在Jenkins宿主服务器上运行如下命令
$ sudo visudo
在文件的末尾加上一行
jenkins ALL=(ALL) NOPASSWD: ALL
因为是只读文件强制保存并退出
$ :wq!
重启Jenkins服务
$ /etc/init.d/jenkins restart
最后,重新执行构建任务,不会出现先前的错误。
2.使用docker时报错“net/http: TLS handshake timeout”的解决方案
docker默认镜像拉取地址为国外仓库下载速度较慢,则会报错“net/http: TLS handshake timeout”。
此时,只需要将拉取地址改为国内镜像仓库即可。
为了永久性保留更改,您可以修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
修改保存后重启 Docker 以使配置生效。