python docker自动化_docker 和自动化脚本 --python 栈

本文记录了一位开发者在新公司使用gitlab CI/CD,通过Docker部署Python测试脚本的过程。遇到的问题包括如何在Dockerfile中处理Python、Java和Allure的依赖,以及如何通过挂载目录将测试报告保存到宿主机,并避免不必要的资源占用。最终实现了在不需要额外依赖的环境中运行自动化测试并生成Allure报告。
摘要由CSDN通过智能技术生成

一年经验的小白,第一次在社区发帖,写的太low大家见谅哈

引子

来了家新公司,持续集成用的是gitlab的CI/CD,我不会这玩意儿,上家公司用的是jenkins

,所以这块之后弄明白了再写吧。

测试脚本是这周二写完的,写完push到gitlab,leader说要用docker部署,所以让我写个Dockerfile,问题来了。

Dockerfile

首先给大家看看我最外层的执行脚本 run.py,html报告是发邮件用的,平常主要还是看allure。

import os

import time

import pytest

from common.action import del_file

from common.send_email import SendEmail

if __name__ == '__main__':

# 清除allure目录下所有文件

del_file('result/report/allure')

# allure测试报告路径

allure_path = 'result/report/allure'

# html报告路径

now = time.strftime("%Y-%m-%d %H:%M:%S")

html_path = 'result/report/html/{}.html'.format(now)

# 执行测试并生成allure报告 & html测试报告

pytest.main(['-s', '--alluredir', allure_path, 'testcase', '--html={}'.format(html_path), '--self-contained-html'])

# 运行allure服务

os.system('allure serve -p 80 result/report/allure')

# html报告邮件发送

html_dir = SendEmail().acquire_report_address('result/report/html')

SendEmail().send_email(html_dir)

常规来说,我的Dockerfile应该是这样的:

FROM python:3.8

ADD . usr/testframwork # testframwork是我的项目名称

RUN pip install -r requirements.txt

WORKDIR usr/testframwork

ENTRYPOINT python3 run.py

问题来了,基础镜像用的python3.8,那我的allure怎么办,allure还依赖java呢,所以为了我的allure报告,我需要定制一个基础镜像。

制作包含python3,java,allure的基础镜像

制作

首先pull一个centos7吧,因为之前买过一个云服务器,也是centos7,用的比较顺手

docker pull centos7

docker run -d --name centos-allure -i -t centos /bin/bash # 运行centos镜像

docker exex -it centos-allure /bin/bash # 进入

现在进入到镜像内部了,下一步是给这个容器配置python、java、allure环境

先yum install wget,python和java就直接源码安装,也没什么坑,记得把脚本需要的第三方库给pip install上去,不然docker build会慢得抠脚,还时常失败。

接下来我们来搞allure

cd /home

wget https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/2.8.0/allure-commandline-2.8.0.tgz

tar -zxvf allure-commandline-2.8.0.tgz

vi /etc/profile

export PATH=$PATH:/home/allure-2.7.0/bin

source /etc/profile

到这里有的同学们以为allure就搞定了,其实并没有,这里有个大坑。source /etc/profile之后执行allure --version,没有丝毫毛病。

等我退出容器重新进入,发现allure --version输出了个寂寞,须得重新source /etc/profile才行。

怎么解决呢,百度了一下Linux环境变量相关的,在~/.bashrc文件(也可能是~/.bash_profile,我忘了)下加上source /etc/profile,

这样用户每次进入的时候就会执行一下这个命令,这样就ok,可以往下进行了。有些同学以为这样allure就搞定了。。。其实并没有

之后exit退出容器,执行打包命令:

# bigllxx是我docker hub的用户名,/ 后面接镜像名称,: 后面要接个版本号

docker commit bigllxx/centos-allure:1.0.0

然后镜像打包成功,执行docker images ,看到这个镜像正乖乖躺在我的仓库里

Dockerfile文件再编写

基础镜像做好了,那就重写一下Dockerfile吧,基础镜像换成我们自己做的centos-allure:1.0.0,这里开了个80的端口号,因为我的allure服务指定的是80端口

FROM bigllxx/centos-allure:1.0.0

ADD . usr/testframwork

WORKDIR usr/testframwork

EXPOSE 80

ENTRYPOINT python3 run.py

搞定,接下来就要把我的测试脚本打包成一个镜像了,给大家看看我的目录结构:

就在Dockerfile的同级目录下,也就是项目目录下执行命令

# docker build -t 要放到镜像的目录/文件

docker build -t testframwork .

打包完成,docker images ,看到testframwork镜像乖乖躺在我的仓库里

重头戏来了,要启动镜像了,成败在次一举

docker run -p 127.0.0.1:2015:80 --name testframwork testframwork

。。。

败了,提示allure not found

**了个Dj的

。。。

再次制作

我思考了一下,报这个错肯定是环境变量的问题,环境变量好像是用户进入系统之后才生效,但是在docker run的时候,容器内部环境变量是不是不生效的?

那为什么python可以?因为python配了软链,对,那我给allure也配个软链试试

# 再次进入容器

docker exex -it /bin/bash

# 给allure配置软链

ln -s ln -s /home/allure-2.8.0/bin/allure /usr/bin/allure

# 退出容器

exit

# 打包镜像

docker commit bigllxx/centos-allure:1.1.0

这样我们1.1.0版本的centos-allure就做好了,更改一下Dockerfile,让其 FROM bigllxx/centos-allure:1.1.0

FROM bigllxx/centos-allure:1.1.0

ADD . usr/testframwork

WORKDIR usr/testframwork

EXPOSE 80

ENTRYPOINT python3 run.py

我们重新build再运行一遍看看

# 先把上面的垃圾容器和镜像都删掉

docker rm -f testframwork

docker rmi -f testframwork

# 再重新构建运行

docker build -t testframwork .

docker run -p 127.0.0.1:2015:80 --name testfw testframwork

这次allure又出幺蛾子了,没有报 not found,但是报了一个没找到JAVA_HOME。

想起来了,java的环境变量也是配在/etc/profile里面的,那我给java也弄个软链试试

。。。弄了一会,发现java本来就有软链,浪费时间了。

仔细看了下报错,发现allure找的是JAVA_HOME,但是JAVA_HOME是个目录啊,总不能给目录弄个软链。

Dockerfile再编写

突然想起来Dockerfile里面有个ENV,好像是弄环境变量的。我去弄弄试试:

FROM bigllxx/centos-allure:1.1.0

ADD . usr/testframwork

WORKDIR usr/testframwork

# java环境变量

ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el7_9.x86_64

ENV JRE_HOME ${JAVA_HOME}/jre

ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib

ENV PATH ${JAVA_HOME}/bin:$PATH

EXPOSE 80

ENTRYPOINT python3 run.py

然后重新build,运行

# 先把上面的垃圾容器和镜像都删掉

docker rm -f testframwork

docker rmi -f testframwork

# 再重新构建运行

docker build -t testframwork .

docker run -p 127.0.0.1:2015:80 --name testfw testframwork

成功搞定,访问127.0.0.1:2015,看到allure了,成功搞定。

这样就实现了 不需要任何外部依赖的docker接口自动化项目构建,服务器只要有个docker环境就能跑,就有allure报告可以看

还没有结束

当我把代码push到gitlab给开发同学看了之后,开发同学告诉我:建议你这个镜像run完就销毁掉,

因为你把它留着,占将近1个G的内存,就为了看个测试报告,不值当,可以把测试报告的那个文件夹想办法弄到宿主机,

然后在宿主机上弄个allure,run完你的脚本之后,把容器销毁掉,然后直接在宿主机起allure服务。

我一听有道理,想起来docker有个挂载,我在run的时候把宿主机的一个目录挂载到容器放allure报告的目录不就好了,

能不能行呢,我又去百度了一下,容器挂载宿主机的目录,容器里的这个目录变了,宿主机的变不变?

然后百度了个寂寞,我自己都被这个问题丑到了。

服务器安装allure,挂载容器报告目录

还是实践出真知,直接开干。

先在我们测试服务器 新建个文件夹,用来下载allure和挂载容器的报告目录

mkdir /home/bigllxx/allure

cd /home/bigllxx/allure

wget https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/2.8.0/allure-commandline-2.8.0.tgz

tar -zxvf allure-commandline-2.8.0.tgz

ln -s /home/bigllxx/allure/allure-2.8.0/bin/allure /usr/bin/allure

# 新建存放用来挂载allure报告的目录

mkdir allure-report

接下来又要重写Dockerfile了,在宿主机启动allure,就不需要java环境和端口号了

FROM bigllxx/centos-allure:1.1.0

ADD . usr/testframwork

WORKDIR usr/testframwork

ENTRYPOINT python3 run.py

然后改一下run.py,把运行allure服务的os.system(xxx)给注释掉

之后重新构建运行,注意需要挂载

docker build -t testframwork .

docker run -v /home/bigllxx/allure/allure-report:/usr/testframwork/result/report/allure --name testframwork testframwork

发现allure-report目录下成功生成了很多文件

我们allure一下

allure serve -p 7788 /home/bigllxx/allure/allure_report

allure服务成功被起起来,帅气

还没有结束

这篇文章也敲了一会了,慢慢想起来:allure放在服务器了,那代表java环境也不需要了,那我要自己做这个基础镜像干什么呢?

回到原点 FROM python:3.8

ADD . usr/testframwork # testframwork是我的项目名称

RUN pip install -r requirements.txt

WORKDIR usr/testframwork

ENTRYPOINT python3 run.py

盖了帽了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值