基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程

1 Jenkins是什么?
  • 学习官网:Jenkins官网,Jenkins中文官网;

  • Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件;

  • Java语言编写的,可在TomcatDocker等流行的容器中运行,也可独立运行。

通俗的讲,比如把编译、打包、上传、部署到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. # 我们的环境是:

  2. 1、Linux服务器一台(我的是Ubuntu),在虚拟机中的,哈哈

  3. 2、在服务器上正确安装docker

  4. 3、拉取jenkins镜像:jenkins/jenkins:lts

  5. 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
复制代码
  1. docker run

  2. -dit

  3. --name=jenkins

  4. -p 8080:8080

  5. -u=root

  6. -v /var/run/docker.sock:/var/run/docker.sock

  7. -v /usr/bin/docker:/usr/bin/docker

  8. jenkins/jenkins:lts

  • 参数说明:
复制代码
  1. 参数说明

  2. -i:表示运行容器

  3. -t:表示容器启动后会进入其命令行

  4. -d:守护式方式创建容器在后台运行

  5. --name:容器名称

  6. -p 8080:8080:端口映射,宿主机端口:jenkins容器端口

  7. -u=root:指定容器用户为root用户

  8. -v /var/run/docker.sock:/var/run/docker.sock:将docker.sock映射到jenkins容器中

  9. docker.sock文件是docker client与docker daemon通讯的文件

  10. -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

  • 我的如下:

复制代码
复制代码
  1. adbutils==0.11.0

  2. alembic==1.6.5

  3. allure-pytest==2.8.12

  4. allure-python-commons==2.8.12

  5. altgraph==0.17.2

  6. amqp==5.0.6

  7. anyjson==0.3.3

  8. apipkg==1.5

  9. apkutils2==1.0.0

  10. Appium-Python-Client==0.50

  11. asgiref==3.3.1

  12. atomicwrites==1.4.0

  13. attrs==20.3.0

  14. BeautifulReport==0.1.3

  15. beautifulsoup4==4.9.3

  16. billiard==3.6.4.0

  17. blinker==1.4

  18. cached-property==1.5.2

  19. celery==5.0.5

  20. certifi==2020.12.5

  21. cffi==1.14.5

  22. chardet==3.0.4

  23. cigam==0.0.3

  24. click==7.1.2

  25. click-didyoumean==0.0.3

  26. click-plugins==1.1.1

  27. click-repl==0.2.0

  28. colorama==0.4.4

  29. comtypes==1.1.8

  30. configparser==5.0.2

  31. coreapi==2.3.3

  32. coreschema==0.0.4

  33. coverage==5.5

  34. cryptography==3.2.1

  35. cycler==0.10.0

  36. DataRecorder==3.2.2

  37. ddt==1.4.2

  38. decorator==5.0.9

  39. defusedxml==0.7.1

  40. Deprecated==1.2.12

  41. deprecation==2.1.0

  42. diff-match-patch==20200713

  43. Django==2.2.16

  44. django-bootstrap==0.2.4

  45. django-bootstrap3==15.0.0

  46. django-bootstrap4==2.3.1

  47. django-celery==3.3.1

  48. django-celery-beat==2.2.0

  49. django-ckeditor==6.1.0

  50. django-cors-headers==3.7.0

  51. django-crispy-forms==1.12.0

  52. django-crontab==0.7.1

  53. django-filter==2.4.0

  54. django-haystack==3.0

  55. django-import-export==2.5.0

  56. django-js-asset==1.2.2

  57. django-mdeditor==0.1.18

  58. django-ranged-response==0.2.0

  59. django-redis==4.12.1

  60. django-rest-framework-mongoengine==3.4.1

  61. django-simple-captcha==0.5.13

  62. django-simpleui==2021.6.2

  63. django-timezone-field==4.1.2

  64. django-tinymce==3.3.0

  65. djangorestframework==3.12.2

  66. djangorestframework-jwt==1.11.0

  67. dnspython==1.16.0

  68. docopt==0.6.2

  69. docutils==0.17.1

  70. dogtail==0.9.10

  71. dominate==2.6.0

  72. DownloadKit==0.5.0

  73. drf-extensions==0.7.0

  74. drf-haystack==1.8.10

  75. DrissionPage==3.1.1

  76. easygui==0.98.2

  77. elasticsearch==2.4.1

  78. et-xmlfile==1.0.1

  79. eventlet==0.30.2

  80. execnet==1.8.0

  81. facebook-wda==1.4.3

  82. filelock==3.0.12

  83. Flask==1.1.2

  84. Flask-Bootstrap==3.3.7.0

  85. Flask-Excel==0.0.7

  86. Flask-Login==0.5.0

  87. Flask-Mail==0.9.1

  88. Flask-Migrate==2.0.0

  89. Flask-Moment==1.0.1

  90. Flask-Script==2.0.5

  91. Flask-SQLAlchemy==2.4.4

  92. FlowViewer==0.2.2

  93. freetype-py==2.2.0

  94. fsspec==2022.8.2

  95. future==0.18.2

  96. greenlet==1.1.0

  97. HTMLReport==2.3.1

  98. idna==2.10

  99. importlib-metadata==2.1.1

  100. iniconfig==1.1.1

  101. itsdangerous==1.1.0

  102. itypes==1.2.0

  103. jdcal==1.4.1

  104. Jinja2==2.11.2

  105. jsonpath==0.82

  106. kiwisolver==1.3.1

  107. kombu==5.1.0

  108. lml==0.1.0

  109. loguru==0.7.0

  110. logzero==1.7.0

  111. lxml==4.6.3

  112. Mako==1.1.4

  113. Markdown==3.3.4

  114. MarkupPy==1.14

  115. MarkupSafe==1.1.1

  116. matplotlib==3.3.3

  117. mock==3.0.5

  118. mongoengine==0.22.1

  119. more-itertools==8.7.0

  120. mpmath==1.2.1

  121. mutagen==1.44.0

  122. mysql-connector==2.2.9

  123. mysqlclient==2.0.3

  124. numpy @ file:///C:/Users/Administrator/Downloads/numpy-1.21.0-cp37-cp37m-win_amd64.whl

  125. odfpy==1.4.1

  126. opencv-python==4.7.0.72

  127. openpyxl==3.0.5

  128. packaging==20.8

  129. pandas==1.1.5

  130. ParamUnittest==0.2

  131. pefile==2021.9.3

  132. Pillow==8.3.1

  133. pipreqs==0.4.11

  134. pluggy==0.13.1

  135. progress==1.6

  136. prompt-toolkit==3.0.19

  137. psutil==5.8.0

  138. py==1.10.0

  139. pyasn1==0.4.8

  140. pycparser==2.20

  141. pycryptodomex==3.9.4

  142. pyelftools==0.27

  143. pyexcel==0.6.6

  144. pyexcel-io==0.6.4

  145. pyexcel-webio==0.1.4

  146. pyexcel-xlsx==0.6.0

  147. pygame==2.0.1

  148. Pygments==2.9.0

  149. pyinstaller==4.10

  150. pyinstaller-hooks-contrib==2022.2

  151. PyJWT==1.7.1

  152. pymongo==3.11.3

  153. PyMySQL==0.10.1

  154. PyOpenGL==3.1.5

  155. pyOpenSSL==19.1.0

  156. pyparsing==2.4.7

  157. PyQt5==5.15.4

  158. pyqt5-plugins==5.15.4.2.2

  159. PyQt5-Qt5==5.15.2

  160. PyQt5-sip==12.11.0

  161. pyqt5-tools==5.15.4.3.2

  162. pytest==6.2.4

  163. pytest-assume==2.4.3

  164. pytest-cov==2.8.1

  165. pytest-forked==1.1.3

  166. pytest-html==2.0.1

  167. pytest-ignore-flaky==2.0.0

  168. pytest-metadata==1.8.0

  169. pytest-ordering==0.6

  170. pytest-repeat==0.9.1

  171. pytest-rerunfailures==10.3

  172. pytest-xdist==1.31.0

  173. python-alipay-sdk==3.0.1

  174. python-crontab==2.5.1

  175. python-dateutil==2.8.1

  176. python-dotenv==0.21.0

  177. python-editor==1.0.4

  178. pythonnet==2.5.1

  179. pytz==2021.1

  180. pywebview==3.4

  181. pywin32==300

  182. pywin32-ctypes==0.2.0

  183. pywinauto==0.6.8

  184. PyYAML==6.0

  185. QQLoginTool==0.3.0

  186. qt5-applications==5.15.2.2.2

  187. qt5-tools==5.15.2.1.2

  188. redis==3.5.3

  189. requests==2.24.0

  190. requests-file==1.5.1

  191. retry==0.9.2

  192. rsa==4.8

  193. ruamel.yaml==0.17.21

  194. ruamel.yaml.clib==0.2.7

  195. scipy @ file:///C:/Users/Administrator/Downloads/scipy-1.7.0-cp37-cp37m-win_amd64.whl

  196. selenium==3.141.0

  197. Serializer==0.2.1

  198. simplejson==3.17.2

  199. six==1.15.0

  200. sklearn==0.0.post5

  201. soupsieve==2.0.1

  202. SQLAlchemy==1.3.20

  203. sqlparse==0.4.1

  204. sympy==1.7.1

  205. tablib==3.0.0

  206. texttable==1.6.3

  207. tldextract==3.4.0

  208. toml==0.10.2

  209. tornado==6.1

  210. turtle==0.0.2

  211. Twisted==20.3.0

  212. ua-parser==0.10.0

  213. uiautomation==2.0.10

  214. uiautomator2==2.16.7

  215. uritemplate==3.0.1

  216. urllib3==1.25.11

  217. user-agents==2.2.0

  218. vine==5.0.0

  219. visitor==0.1.3

  220. wcwidth==0.2.5

  221. websocket-client==1.5.0

  222. weditor==0.6.4

  223. Werkzeug==1.0.1

  224. whichcraft==0.6.1

  225. win32-setctime==1.1.0

  226. WMI==1.5.1

  227. wordninja==2.0.0

  228. wrapt==1.12.1

  229. wxgl==0.7.2

  230. wxPython==4.1.1

  231. xlrd==1.2.0

  232. xlrd2==1.2.6

  233. XlsxWriter==3.0.2

  234. xlutils==2.0.0

  235. xlwings==0.21.4

  236. xlwt==1.3.0

  237. xmltodict==0.12.0

  238. yarg==0.1.9

  239. zipfile37==0.1.3

  240. zipp==1.2.0

  • 其实要不了这么多,看你项目需要吧,也可以进入项目根目录,使用以下命令导出项目的依赖包:

    pipreqs . --encoding=utf8 --force

9.2 创建app目录
  • 在宿主机(安装docker的机子)上新建一个目录(我的目录是在我的家目录下创建app),将requirements.txt文件复制进去:

9.3 创建Dockerfile
  • app目录下创建Dockerfile文件(文件名必须是Dockerfile,没有后缀)Dockerfile内容以及解释如下:
复制代码
  1. FROM python:3.7#基于python:3.7这个基础镜像镜像构建镜像

  2. WORKDIR /home/noamanelson/app #切换工作空间目录

  3. ADD ./requirements.txt /home/noamanelson/app #将python项目依赖包文件添加到镜像

  4. RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple #安装依赖包

  5. 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内容如下,注释要另起一行写:
复制代码
  1. echo "运行容器python执行自动化"

  2. #输出日志

  3. #-w=$WORKSPACE:指定workspace

  4. #--volumes-from=jenkins_save01:将jenkins容器中的workspace映射到python容器中,此时jenkins中git拉下来的代码就会被映射进去

  5. docker run --rm -w=$WORKSPACE --volumes-from=jenkins python3.7:autopy

  6. echo "python执行自动化执行成功"

  • build.sh复制到你的项目根目录下:

  • 提交代码到Git仓库:

复制代码
  1. git add .

  2. git commit -am'update'

  3. git push

11 构建任务
  • 之前我们已经创建了任务:

  • 立即构建:

  • 构建历史:

  • 控制台输出:

  • 查看测试报告会没有样式,因为被Jenkins禁用了CSS样式,需要手动解决:

12 解决报告样式

在这里插入图片描述

  • 写入如下代码:

    System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")

在这里插入图片描述

  • 执行后结果为空说明是ok的;

  • 重新构建可以看到有样式的测试报告:

  • 上边这个方法只是临时的,jenkins重启又得设置,所以安装Groovy插件可以永久解决这个问题:

13 查看邮件
  • 从图上看邮件也是ok的;
相关推荐
去伪存真13 分钟前
不用动脑,手把手跟着我做,就能掌握Gitlab+Jenkins提交代码自动构部署
前端·jenkins
逢生博客15 分钟前
使用 Python 项目管理工具 uv 快速创建 MCP 服务(Cherry Studio、Trae 添加 MCP 服务)
python·sqlite·uv·deepseek·trae·cherry studio·mcp服务
堕落似梦21 分钟前
Pydantic增强SQLALchemy序列化(FastAPI直接输出SQLALchemy查询集)
python
foo1st1 小时前
Tomcat Web应用(Ubuntu 18.04.6 LTS)部署笔记
ubuntu·tomcat
坐吃山猪1 小时前
Python-Agent调用多个Server-FastAPI版本
开发语言·python·fastapi
Bruce-li__2 小时前
使用Django REST Framework快速开发API接口
python·django·sqlite
小兜全糖(xdqt)2 小时前
python 脚本引用django中的数据库model
python·django
Arenaschi2 小时前
SQLite 是什么?
开发语言·网络·python·网络协议·tcp/ip
纪元A梦2 小时前
华为OD机试真题——推荐多样性(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
java·javascript·c++·python·华为od·go·华为od机试题
仙人掌_lz2 小时前
人工智能与机器学习:Python从零实现性回归模型
人工智能·python·机器学习·线性回归