基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程
1 Jenkins是什么?
-
学习官网:Jenkins官网,Jenkins中文官网;
-
Jenkins
是一款开源CI&CD
软件,用于自动化各种任务,包括构建、测试和部署软件; -
用
Java
语言编写的,可在Tomcat
、Docker
等流行的容器中运行,也可独立运行。
通俗的讲,比如把编译、打包、上传、部署到Tomcat中的过程交由Jenkins,Jenkins通过给定的代码地址URL(代码仓库地址),将代码拉取到其“宿主服务器”(Jenkins的安装位置),进行编译、打包和发布到Tomcat容器中。
2 Jenkins目标是什么?
-
持续、自动地构建软件项目或者自动化测试项目;
-
帮助快速定位问题,提升开发效率;
-
自动化测试中可帮助提升测试效率。
3 什么是CI/CD?
3.1 CI持续集成
-
CI:即
Continuous integration
持续集成; -
强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起;
-
团队需要为每个新功能、代码改进、或者问题修复创建自动化测试用例;
-
需要一个持续集成服务器,它可以监控代码提交情况,对每个新的提交进行自动化测试;
-
尽可能快的提交代码;
-
以下图片来源于网络,可帮助理解,仅供参考:
-
优势:
① 提早拿到回归测试的结果,避免问题到生产环境中;② 发布编译将会更加容易;③ 减少工作问题切换,快速获得构建失败的消息,快速解决问题;④ 测试成本大幅降低,包括时间和人力成本等;⑤ 节省QA团队时间,侧重质量文化建设。
3.2 CD持续部署
-
CD:即
continuous deployment
持续部署; -
通过自动化的构建、测试和部署循环来快速交付高质量的产品;
-
团队应具有完善的测试理念;
-
单元测试尤为重要;
-
文档和部署频率需要保持一致;
-
优势:
① 发布频率快;② 风险降低,问题可很快修复;③ 客户可很快看到产品的交付结果。
3.3 CD持续交付
-
CD:即
Continuous Delivery
持续交付; -
可让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以释出的状况;
-
在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中;
-
目标在于让软件的构建、测试与释出变得更快以及更频繁;
-
需要有强大的持续集成组件和足够多的测试项可以满足代码的需求;
-
部署需要自动化;
-
以下图片来源与网络,仅供参考:
4 Ubuntu环境
4.1 环境需求
-
我的环境是:
在Windows10操作系统上安装虚拟机Hyper-V,然后在虚拟机里安装Ubuntu操作系统,自动化测试在Ubuntu上运行;
-
后续根据自身的环境选择合适的安装步骤,如果是以上环境,可参考以下:LinuxGUI自动化测试框架搭建(三)-虚拟机安装(Hyper-V或者VMWare)
-
# 我们的环境是:
-
1、Linux服务器一台(我的是Ubuntu),在虚拟机中的,哈哈
-
2、在服务器上正确安装docker
-
3、拉取jenkins镜像:jenkins/jenkins:lts
-
4、拉取python3镜像:docker pull python:3.7
4.2 实现思路
1、在Linux服务器安装docker;2、创建jenkins容器;3、根据自动化项目依赖包构建python镜像(构建自动化python环境);4、运行新的python容器,执行jenkins从仓库中拉下来的自动化项目 5、执行完成之后删除容器。
5 Ubuntu下安装Docker
-
详细的安装步骤请参考:Docker笔记3 | 在Ubuntu下安装Docker;
-
此处不再赘述了。
6 安装Jenkins
6.1 拉取Jenkins镜像
-
使用
docker
拉取Jenkins
镜像:
docker pull jenkins/jenkins:lts
6.2 启动Jenkins
-
docker run
-
-dit
-
--name=jenkins
-
-p 8080:8080
-
-u=root
-
-v /var/run/docker.sock:/var/run/docker.sock
-
-v /usr/bin/docker:/usr/bin/docker
-
jenkins/jenkins:lts
-
参数说明:
-
参数说明
-
-i:表示运行容器
-
-t:表示容器启动后会进入其命令行
-
-d:守护式方式创建容器在后台运行
-
--name:容器名称
-
-p 8080:8080:端口映射,宿主机端口:jenkins容器端口
-
-u=root:指定容器用户为root用户
-
-v /var/run/docker.sock:/var/run/docker.sock:将docker.sock映射到jenkins容器中
-
docker.sock文件是docker client与docker daemon通讯的文件
-
-v /usr/bin/docker:/usr/bin/docker:将宿主机docker客户端映射到jenkins容器中
在这里插入图片描述
6.3 修改jenkins权限
-
如果
docker
安装jenkins
运行失败; -
查看日志提示权限不够:
docker logs jenkin
-
则修改以上目录
/var/jenkins_home
的权限:
chown -R 1000 /var/jenkins_home
-
或者运行容器时,以
root
权限运行,加-u=root
。 -
浏览器输入地址:8080即可:
7 Jenkins初始配置
7.1 查看容器日志
docker logs jenkins
以上就是我们的jenkins
密码,复制后解锁即可;
7.2 插件选择
-
进入如下页面:
如下会进行插件安装,如果报错,点重试即可:
7.3 创建管理员用户
-
插件安装完进入如下界面:
记住自己填的用户名和密码,然后保存继续;
继续保存进行下一步。
7.4 安装插件
7.4.1 git插件安装
-
我们之前插件安装的时候,选的是默认插件安装,那么
git
插件已经是安装好了的,可从以下图示查看:
-
点击【
install plugins
】可以查看已经安装的插件: -
点击【
available plugins
】可选择下载自己需要的插件,这里我安装下gitee
;
7.4.2 Docker插件安装
-
如下搜索
docker
安装即可: -
安装完后,如下所示:
7.4.3 HTML Publisher插件安装
-
如下搜索:
7.4.4 Email Extension插件安装
-
如下所示:
7.4.5 JDK、Maven、SSH插件(可选)
-
安装
JDK
: -
输入账号和密码:
-
安装
maven
: -
配置
SSH
: -
设置主机和端口,点击【添加】:
-
如果添加无反应,点击右上角的用户名添加一个即可:
-
可以自行尝试是否ok即可。
以上步骤完成后,安装完成后重启jenkins
容器
docker restart jenkins
在这里插入图片描述
8 Jenkins详细配置
8.1 新建任务
-
重新登陆
jenkins
,点New Item
如图:
在这里插入图片描述
-
输入项目名称,构建方式根据自己项目选择即可,我这里直接选第一个(创建自由风格的项目):
8.2 配置任务
8.2.1 配置构建记录保留规则
-
在
General
选项中,设置如下:
8.2.2 Git仓库配置
-
输入git仓库的地址、账号和密码:
8.2.3 配置构建后操作
-
添加构建后操作模块,
linux
下选shell
: -
配置运行脚本:
-
配置
jenkins
中展示的测试报告路径: -
配置邮件触发器:
-
与以上步骤完成后,保存即可。
8.3 配置邮件
-
jenkins
管理-系统配置-Jenkins Location
。在系统管理员邮件地址,输入对应的邮件地址: -
jenkins
管理-系统配置-Extended E-mail Notification
,填写对应的smtp
服务器相关内容,点击高级,输入对应的邮箱地址和smtp
登录的授权码,勾选ssl
:
-
配置邮件触发器:
jenkins
管理-系统配置-Default Triggers
,默认是勾选失败才发,可以配置总是发送(或根据需求勾选),那么每次运行项目时都会发送邮件。
9 构建python镜像
9.1 导出依赖包
-
构建有项目执行环境的python镜像;
-
在本地
Python
运行环境中将项目依赖包导出来到requirements.txt
文件中;
pip freeze > requirements.txt
-
我的如下:
-
adbutils==0.11.0
-
alembic==1.6.5
-
allure-pytest==2.8.12
-
allure-python-commons==2.8.12
-
altgraph==0.17.2
-
amqp==5.0.6
-
anyjson==0.3.3
-
apipkg==1.5
-
apkutils2==1.0.0
-
Appium-Python-Client==0.50
-
asgiref==3.3.1
-
atomicwrites==1.4.0
-
attrs==20.3.0
-
BeautifulReport==0.1.3
-
beautifulsoup4==4.9.3
-
billiard==3.6.4.0
-
blinker==1.4
-
cached-property==1.5.2
-
celery==5.0.5
-
certifi==2020.12.5
-
cffi==1.14.5
-
chardet==3.0.4
-
cigam==0.0.3
-
click==7.1.2
-
click-didyoumean==0.0.3
-
click-plugins==1.1.1
-
click-repl==0.2.0
-
colorama==0.4.4
-
comtypes==1.1.8
-
configparser==5.0.2
-
coreapi==2.3.3
-
coreschema==0.0.4
-
coverage==5.5
-
cryptography==3.2.1
-
cycler==0.10.0
-
DataRecorder==3.2.2
-
ddt==1.4.2
-
decorator==5.0.9
-
defusedxml==0.7.1
-
Deprecated==1.2.12
-
deprecation==2.1.0
-
diff-match-patch==20200713
-
Django==2.2.16
-
django-bootstrap==0.2.4
-
django-bootstrap3==15.0.0
-
django-bootstrap4==2.3.1
-
django-celery==3.3.1
-
django-celery-beat==2.2.0
-
django-ckeditor==6.1.0
-
django-cors-headers==3.7.0
-
django-crispy-forms==1.12.0
-
django-crontab==0.7.1
-
django-filter==2.4.0
-
django-haystack==3.0
-
django-import-export==2.5.0
-
django-js-asset==1.2.2
-
django-mdeditor==0.1.18
-
django-ranged-response==0.2.0
-
django-redis==4.12.1
-
django-rest-framework-mongoengine==3.4.1
-
django-simple-captcha==0.5.13
-
django-simpleui==2021.6.2
-
django-timezone-field==4.1.2
-
django-tinymce==3.3.0
-
djangorestframework==3.12.2
-
djangorestframework-jwt==1.11.0
-
dnspython==1.16.0
-
docopt==0.6.2
-
docutils==0.17.1
-
dogtail==0.9.10
-
dominate==2.6.0
-
DownloadKit==0.5.0
-
drf-extensions==0.7.0
-
drf-haystack==1.8.10
-
DrissionPage==3.1.1
-
easygui==0.98.2
-
elasticsearch==2.4.1
-
et-xmlfile==1.0.1
-
eventlet==0.30.2
-
execnet==1.8.0
-
facebook-wda==1.4.3
-
filelock==3.0.12
-
Flask==1.1.2
-
Flask-Bootstrap==3.3.7.0
-
Flask-Excel==0.0.7
-
Flask-Login==0.5.0
-
Flask-Mail==0.9.1
-
Flask-Migrate==2.0.0
-
Flask-Moment==1.0.1
-
Flask-Script==2.0.5
-
Flask-SQLAlchemy==2.4.4
-
FlowViewer==0.2.2
-
freetype-py==2.2.0
-
fsspec==2022.8.2
-
future==0.18.2
-
greenlet==1.1.0
-
HTMLReport==2.3.1
-
idna==2.10
-
importlib-metadata==2.1.1
-
iniconfig==1.1.1
-
itsdangerous==1.1.0
-
itypes==1.2.0
-
jdcal==1.4.1
-
Jinja2==2.11.2
-
jsonpath==0.82
-
kiwisolver==1.3.1
-
kombu==5.1.0
-
lml==0.1.0
-
loguru==0.7.0
-
logzero==1.7.0
-
lxml==4.6.3
-
Mako==1.1.4
-
Markdown==3.3.4
-
MarkupPy==1.14
-
MarkupSafe==1.1.1
-
matplotlib==3.3.3
-
mock==3.0.5
-
mongoengine==0.22.1
-
more-itertools==8.7.0
-
mpmath==1.2.1
-
mutagen==1.44.0
-
mysql-connector==2.2.9
-
mysqlclient==2.0.3
-
numpy @ file:///C:/Users/Administrator/Downloads/numpy-1.21.0-cp37-cp37m-win_amd64.whl
-
odfpy==1.4.1
-
opencv-python==4.7.0.72
-
openpyxl==3.0.5
-
packaging==20.8
-
pandas==1.1.5
-
ParamUnittest==0.2
-
pefile==2021.9.3
-
Pillow==8.3.1
-
pipreqs==0.4.11
-
pluggy==0.13.1
-
progress==1.6
-
prompt-toolkit==3.0.19
-
psutil==5.8.0
-
py==1.10.0
-
pyasn1==0.4.8
-
pycparser==2.20
-
pycryptodomex==3.9.4
-
pyelftools==0.27
-
pyexcel==0.6.6
-
pyexcel-io==0.6.4
-
pyexcel-webio==0.1.4
-
pyexcel-xlsx==0.6.0
-
pygame==2.0.1
-
Pygments==2.9.0
-
pyinstaller==4.10
-
pyinstaller-hooks-contrib==2022.2
-
PyJWT==1.7.1
-
pymongo==3.11.3
-
PyMySQL==0.10.1
-
PyOpenGL==3.1.5
-
pyOpenSSL==19.1.0
-
pyparsing==2.4.7
-
PyQt5==5.15.4
-
pyqt5-plugins==5.15.4.2.2
-
PyQt5-Qt5==5.15.2
-
PyQt5-sip==12.11.0
-
pyqt5-tools==5.15.4.3.2
-
pytest==6.2.4
-
pytest-assume==2.4.3
-
pytest-cov==2.8.1
-
pytest-forked==1.1.3
-
pytest-html==2.0.1
-
pytest-ignore-flaky==2.0.0
-
pytest-metadata==1.8.0
-
pytest-ordering==0.6
-
pytest-repeat==0.9.1
-
pytest-rerunfailures==10.3
-
pytest-xdist==1.31.0
-
python-alipay-sdk==3.0.1
-
python-crontab==2.5.1
-
python-dateutil==2.8.1
-
python-dotenv==0.21.0
-
python-editor==1.0.4
-
pythonnet==2.5.1
-
pytz==2021.1
-
pywebview==3.4
-
pywin32==300
-
pywin32-ctypes==0.2.0
-
pywinauto==0.6.8
-
PyYAML==6.0
-
QQLoginTool==0.3.0
-
qt5-applications==5.15.2.2.2
-
qt5-tools==5.15.2.1.2
-
redis==3.5.3
-
requests==2.24.0
-
requests-file==1.5.1
-
retry==0.9.2
-
rsa==4.8
-
ruamel.yaml==0.17.21
-
ruamel.yaml.clib==0.2.7
-
scipy @ file:///C:/Users/Administrator/Downloads/scipy-1.7.0-cp37-cp37m-win_amd64.whl
-
selenium==3.141.0
-
Serializer==0.2.1
-
simplejson==3.17.2
-
six==1.15.0
-
sklearn==0.0.post5
-
soupsieve==2.0.1
-
SQLAlchemy==1.3.20
-
sqlparse==0.4.1
-
sympy==1.7.1
-
tablib==3.0.0
-
texttable==1.6.3
-
tldextract==3.4.0
-
toml==0.10.2
-
tornado==6.1
-
turtle==0.0.2
-
Twisted==20.3.0
-
ua-parser==0.10.0
-
uiautomation==2.0.10
-
uiautomator2==2.16.7
-
uritemplate==3.0.1
-
urllib3==1.25.11
-
user-agents==2.2.0
-
vine==5.0.0
-
visitor==0.1.3
-
wcwidth==0.2.5
-
websocket-client==1.5.0
-
weditor==0.6.4
-
Werkzeug==1.0.1
-
whichcraft==0.6.1
-
win32-setctime==1.1.0
-
WMI==1.5.1
-
wordninja==2.0.0
-
wrapt==1.12.1
-
wxgl==0.7.2
-
wxPython==4.1.1
-
xlrd==1.2.0
-
xlrd2==1.2.6
-
XlsxWriter==3.0.2
-
xlutils==2.0.0
-
xlwings==0.21.4
-
xlwt==1.3.0
-
xmltodict==0.12.0
-
yarg==0.1.9
-
zipfile37==0.1.3
-
zipp==1.2.0
-
其实要不了这么多,看你项目需要吧,也可以进入项目根目录,使用以下命令导出项目的依赖包:
pipreqs . --encoding=utf8 --force
9.2 创建app目录
-
在宿主机(安装
docker
的机子)上新建一个目录(我的目录是在我的家目录下创建app
),将requirements.txt
文件复制进去:
9.3 创建Dockerfile
-
在
app
目录下创建Dockerfile
文件(文件名必须是Dockerfile
,没有后缀)Dockerfile
内容以及解释如下:
-
FROM python:3.7#基于python:3.7这个基础镜像镜像构建镜像
-
WORKDIR /home/noamanelson/app #切换工作空间目录
-
ADD ./requirements.txt /home/noamanelson/app #将python项目依赖包文件添加到镜像
-
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple #安装依赖包
-
CMD ["python3", "main.py"] #设置容器执行后自动执行的命令,这里start_all.py是我们自动化框架的执行入口文件
9.4 执行镜像构建命令
-
在
app
目录下执行镜像构建命令(此步骤也可以放到build.sh
,每次jenkins
构建时重新构建镜像,但是速度会慢,所以如果环境稳定的话建议提前构建好)
docker build -t python3.7:autopy .
-t:镜像名称 点(.):点表示Dockerfile文件所在的目录,我现在在app目录下,点表示当前目录
-
构建成功后会看到一个新的镜像:
10 build.sh设计
-
build.sh
内容如下,注释要另起一行写:
-
echo "运行容器python执行自动化"
-
#输出日志
-
#-w=$WORKSPACE:指定workspace
-
#--volumes-from=jenkins_save01:将jenkins容器中的workspace映射到python容器中,此时jenkins中git拉下来的代码就会被映射进去
-
docker run --rm -w=$WORKSPACE --volumes-from=jenkins python3.7:autopy
-
echo "python执行自动化执行成功"
-
将
build.sh
复制到你的项目根目录下: -
提交代码到
Git
仓库:
-
git add .
-
git commit -am'update'
-
git push
11 构建任务
-
之前我们已经创建了任务:
-
立即构建:
-
构建历史:
-
控制台输出:
-
查看测试报告会没有样式,因为被
Jenkins
禁用了CSS
样式,需要手动解决:
12 解决报告样式
在这里插入图片描述
-
写入如下代码:
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")
在这里插入图片描述
-
执行后结果为空说明是ok的;
-
重新构建可以看到有样式的测试报告:
-
上边这个方法只是临时的,jenkins重启又得设置,所以安装Groovy插件可以永久解决这个问题:
13 查看邮件
-
从图上看邮件也是ok的;
原文地址:https://blog.csdn.net/2401_89368762/article/details/144793864
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!