目录:
公众号“自动化测试研习社”。
一、什么是CI流程,为什么要使用CI流程
1.1 持续集成 (Continuous Integration)
1- 持续集成是在源代码变更后自动检测、拉取、构建和(在大多数情况下)进行单元测试的过程。
2- 持续集成的目标是快速确保开发人员新提交的变更是好的,并且适合在代码库中进一步使用。
1.2 持续集成工作
让一个自动化过程监测一个或多个源代码仓库是否有变更。当变更被推送到仓库时,它会监测到更改、下载副本、构建并运行任何相关的单元测试。
1.3 为什么测试要学持续集成的技术
1- 因为在接口自动化脚本的制作过程中,需要跟开发密切联络,在回归测试过程中,当开发修改好接口问题后,只要开发触发代码上传git的指令,那么git就会通过webhook通知jenkins,jenkins通过webhook获取到对应的git代码,并自动执行代码进行回归和发送回归结果报告。
2- 当开发新增或者修改接口后,接口自动化代码也跟随开发的调整和修改,修改完毕后上传到git内,也可以通知jenkins并自动执行代码并生成报告。
3- 可以设置定时执行代码,在每天固定的时间点内去执行代码,并生成对应的邮件报告。
二、docker技术
目标:操作一个tomcat镜像,实现容器化,宿主机挂载执行war包
2.1 docker概述
2.1.1 docker与传统的vm对比
- 占用内存
-
使用VMware部署环境,最少几个G甚至几十G
-
而docker基本上mb的程度,最大也就是几个G
-
- 运行速度
-
使用VMware部署环境最快也要几十秒甚至要几分钟
-
而docker基本上几秒或者几十毫秒就可以启动容器,部署完环境
-
2.1.2 docker组成
-
镜像:相当于python里面的类的概念,一般不直接使用
-
容器:是通过镜像创建的,相当于实例的概念,是动态,可以访问的
-
仓库:存放镜像的地方
-
docker宿主机:docker安装在哪一个机器,那个机器就是宿主机
2.2 静态IP设置 -- centos虚拟机放置IP修改
1)查看虚拟机的ip
vi /etc/sysconfig/network-scripts/ifcfg-ens33
2)进入ip配置文件设置
vi /etc/sysconfig/network-scripts/ifcfg-ens33
3)修改静态ip、NETMASK、GATEWAY
BOOTPROTO=static
NETMASK=255.255.255.0
GATEWAY=192.168.154.2
NETMASK GATEWAY具体设置什么,根据自己VM虚拟机的设置来
点击编辑,选择虚拟网络编辑器
4)复制一下到文件最后,保存退出:wq
DEVICE=ens33
ONBOOT=yes
# ZONE=public
IPADDR=192.168.154.132
NETMASK=255.255.255.0
GATEWAY=192.168.154.2
DNS1=8.8.8.8
设置后如下图
5)重启网卡服务
systemctl restart network
6)使用xshell工具进行连接
注意:宿主机xshell连接超时
有时候虚拟机使用xshell连接时,一直连接不上,在cmd内ping虚拟机的ip也一直提示超时。这个时候可能是因为虚拟机和宿主机的网段不同导致的。因为虚拟机是网络连接方式设置的是net模式网络连接,需要连接宿主机的网络vmnet8。但是两者属于不同网段,比如虚拟机是192.168.152,但是vmnet8是192.168.其他网段。 所以导致一直超时无法转发。
解决方法:将vmnet8的网段修改为和虚拟机同样的网段,就可以实现连接。
进一步查看windows cmd下,查看本机ip,使用ipconfig发现确实vmnet8的网卡信息不一致,接下来控制面板>>>网络>>>更改vmnet8>>>ipv4,设置改成:
重新查看windows上的ip信息,发现vmnet8的网卡信息已经调整,再次ping虚拟机ip可以正常连接,问题解决。
2.3 docker的相关操作
2.3.1 docker的卸载与安装
--安装--
1)Docker要求CentOS系统的内核版本高于 3.10 ,通过 uname -r 命令查看你当前的内核版本是否支持安装docker
2)更新yum包
sudo yum update
3)安装需要的软件包,yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4)设置yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5)查看所有仓库中所有docker版本
yum list docker-ce --showduplicates | sort -r
6)选择特定版本安装docker
sudo yum install docker-ce-20.10.12.ce
7)启动、设置开启开机启动
sudo systemctl start docker # 启动
sudo systemctl enable docker # 开启开机启动
8)验证安装是否成功
docker version
有client和server两部分表示docker安装启动都成功了
9)查看docker启动状态
systemctl status docker
有如下输出则代表启动成功
--卸载--
1)查询docker安装过的包
yum list installed | grep docker
2)删除安装包
yum remove docker-ce.x86_64 ddocker-ce-cli.x86_64 -y
3)删除镜像/容器等
rm -rf /var/lib/docker
docker加速
默认情况下,docker下载镜像是从官网下载,下载速度特别特别的慢。使用阿里云加速器可以提升获取docker官方镜像的速度。
1)在指定目录创建文件(如已存在请忽略此步)
vi /etc/docker/daemon.json
2)修改文件内容
{
"registry-mirrors": ["https://v2c6fjn8.mirror.aliyuncs.com"]
}
3)重启docker服务
systemctl restart docker
2.4 docker进程相关操作
1- 查看docker 版本
docker -v
2- 查看docker 命令
docker --help
3- 查看docker 服务端与客户端版本详情
docker version
4-查看资源
docker stats
5- 启动docker进程
systemctl start docker
6- 关闭docker
systemctl stop docker
7- 重启docker
systemctl restart docker
8- 查看docker运行状态
systemctl status docker
9- 关闭防火墙
systemctl stop firewalld #disable
2.5 docker操作镜像命令
#需求:使用docker搭建一个tomcat/mysql/redis
#操作流程:
- 获取对应的镜像--docker pull tomcat
- 第一个使用官方的仓库地址
- 自己的镜像仓库
- 使用镜像创建容器
- 运行容器
#1- 查看镜像---本地的
docker images
#2- 搜索镜像--首先本地 --默认的地址
docker search tomcat
#3- 找到所有的镜像--拉取 pull
docker pull tomcat #直接下载最新版本
docker pull tomcat:7#指定版本下载
docker images # 查看Tomcat镜像是否拉取成功
docker rmi 镜像id #删除镜像
#4- 本地有了镜像--可以创建容器
#根据tomcat镜像,创建一个myTomcat容器
docker create --name=myTomcat tomcat #只是创建,没有运行
#5- 查看容器
docker ps #查看在运行的容器
docker ps -a #查看所有的容器
#容器很多,筛选出你需要看的容器
docker ps |grep tomcat
#6- 运行容器
docker start myTomcat #start 后面可以跟 容器的id(前2-3位) 或者 name
#7- 停止容器
docker stop myTomcat #start 后面可以跟 容器的id(前2-3位) 或者 name
#8- 删除没有运行的容器
docker rm 容器id或者名字
#9- 删除在运行的容器
docker rm -f 容器id或者名字
#10- 删除所有的容器
#先停止所有的容器
docker stop $(docker ps -a -q)
#删除
docker rm -f $(docker ps -a -q)
#删除所有镜像
docker rmi $(docker images -q)、
#11- 查看docvker run 命令---创建并且启动容器
docker run --help
docker run 后面的参数
-i #运行容器
-t #容器启动后,进入命令行
-v #目录映射--挂载 ‘-v 宿主机的路径:容器路径’ 挂载的目的是,数据同步和如果容器挂掉了,重新部署。之前的数据还在
-d #守护进程--后台运行
-p #端口映射 ‘-p 宿主机的端口:容器的端口’
-e #环境变量
#如果容器里有tomcat ,你本机的windows想访问:
#docker tomcat 端口号是8080,需要在虚拟机映射一个端口 9099
#windows才可以访问 http://虚拟机的ip:9099
--restart always #当docker重启时,容器也会自动启动
#12- 启动并且作为守护进程,完整命令↓↓↓
docker run -di --name=myTomcat -p 9999:8080 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps --restart always tomcat
#把war包放到宿主机的挂载目录里 ,直接刷新浏览器就出现项目的页面
http://虚拟机ip:9999
#13- 启动容器时关联其他容器 --link mysql独立的容器(给下账号密码。默认是root)
docker run -di --name=tomcat2 -p 9999:8080 --link mysql --link redis --link rabbitmq
#14- 进入容器
docker exec -it myTomcat2 /bin/bash
#15- 退出容器
exit
2.6 拓展
2.6.1 镜像备份
镜像打包成文件,并将其变成镜像
1)把tomcat镜像打包成文件
格式为 docker save -o 要生成的文件名 镜像名称
docker save -o tomcat.tar tomcat
2)把tomcat.tar放到其他电脑,其他人变成镜像使用
格式为 docker load -i 文件路径
docker load -i tomcat.tar
3)查看是否生成了镜像
docker images
容器打包成镜像文件,并将其变成镜像
在工作中,有时候需要将容器生成镜像文件或者将镜像生成文件供其他人使用,那么就需要掌握生成镜像文件的方法
1)查看本地容器,获取到要导出的容器id
sudo docker ps -a
2)将容器打包成tar文件
# 1、把colmap容器打包成镜像文件
# sudo docker export 容器id > 要生成的文件名(后缀名+tar)
sudo docker export 1ee > colmap.tar
# 2、把colmap.tar放到其他电脑,其他人变成镜像使用
# 格式为 docker load -i 文件路径
sudo docker load -i colmap.tar
# 3、查看是否生成了镜像
docker images
容器直接打包生成镜像
容器直接打包生成镜像,并存放在本地使用, docker images 可以直接查询到
使用docker commit命令去生成,可以通过 docker commit -h
帮助指令进行查看
# 前提要保证,镜像已经生成了容器。
# 如:已有demo容器,提交一个名为demo1的容器镜像
# 1、容器生成镜像
docker commit -m "commit_information" -p demo ${username}/demo1:V1
"""
"commit_information":提交信息,可自定义输入
demo:已有的容器
${username}:docker账号名
demo1:镜像名称
V1:自定义输入,镜像的tag
"""
# 2、使用 docker images 命令查看已经生成的镜像
# 3、可以将生成的镜像推送到 dockerhub 内,并通过 docker search 进行查看
# 3.1 推送到dockerhub
docker push ${username}/demo1:V1
# 3.2 进入dockerhub进行搜索,也可以docker search加镜像的关键字进行搜索, 查看镜像是否已生成
# 3.3 服务器创建容器时,需要加tag,如:
docker run -id --name=demo1 --restart always demo1:V1
2.6.2 轻量级图形页面管理之portainer -- GUI模式管理docker
1)查看portainer镜像
docker search portainer
2)选择喜欢的portainer风格镜像,下载
docker pull portainer/portainer
3)启动dockerui容器
docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
4)浏览器访问 http://你虚拟机的ip:9000, 设置一个密码即可,点击创建用户 密码要8位以上
5)我们搭建的是单机版,进入页面直接选择Local ,点击连接
2.6.3 docker logs命令
查看日志后使用 ctrl+c
退出日志查看模式
docker logs [options] 容器id
获取容器的日志
-
–details:显示提供给日志的额外细节
-
–follow或-f:按日志输出
-
–since:从某个时间开始显示,例如2022-02-02T22:22:22
-
–tail:从日志末尾多少行开始显示
-
–timestamps或-t:显示时间戳
-
–until:打印某个时间以前的日志,例如2022-02-02T22:22:22
# 1、例如打印容器`mytest`应用后10行的内容
docker logs -f --tail 10 a4dac74d48f7
# 2、通过docker logs命令可以查看容器的日志。
# 100为容器id
docker logs -f -t --tail 100 datacenter
"""
命令格式:
$ docker logs [OPTIONS] CONTAINER
Options:
--details 显示更多的信息
-f, --follow 跟踪实时日志
--since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳
--until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
"""
# 3、查看指定时间后的日志,只显示最后100行:
$ docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
# 4、查看最近30分钟的日志:
# CONTAINER_ID 为 容器id
$ docker logs --since 30m CONTAINER_ID
# 5、查看某时间之后的日志:
# CONTAINER_ID 为 容器id
$ docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID
# 6、查看某时间段日志:
# CONTAINER_ID 为 容器id
$ docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID
2.6.4 查看容器的挂载目录和修改已存在docker容器的端口映射
1) 查看容器的挂载目录
# 查看的结果最前方为宿主机的挂载目录地址 最后方为容器的挂载目录地址
docker inspect -f"{{.Mounts}}" 容器id
2)修改已存在的docker容器的映射端口
-
停止容器
docker stop 容器id
-
停止docker服务
systemctl stop docker
-
修改这个容器的hostconfig.json文件中的端口
cd /var/lib/docker/容器id vi hostconfig.json #修改如下,前面数字为容器端口,后面是宿主机端口 "PortBindings":{"8888/tcp":[{"HostIp":"","HostPort":"9999"}]}
三、jenkins技术
目标:Jenkins容器化搭建,结合Pytest自动化执行生成Allure报告,发送邮件:Jenkins容器化搭建,结合Pytest自动化执行生成Allure报告,发送邮件
流程:
- 搭建jenkins环境
-
镜像:官方镜像 比较干净
docker pull jenkins
-
生成容器
- 容器操作
-
容器里安装python
-
容器里安装pytest
-
-
3.1 jenkins环境搭建
3.1.1 Jenkins环境搭建与启动
1)在dockerhub内拉取jenkins镜像生成容器,并访问
# 1- 搜索 docker search jenkins---最新版本的
docker search jenkins
# 2- 拉取 jenkins 镜像(需要打包python3+pytest)
docker pull jenkins/jenkins
# 3- 查看镜像是否拉取成功
docker images |grep jenkins
# 4- 在宿主机的一个目录下创建一个目录,用于挂载目录
mkdir -p /var/jenkins_node
# 5- 给一个权限--chmod 777 (0111)可读可写可执行 wrx
chmod 777 /var/jenkins_node
# 6- 创建与启动守护式容器---注意容器中的端口使用8080
docker run -id --name=myjenkins -p 8080:8080 -v /var/jenkins_node:/var/jenkins_home --restart always jenkins/jenkins
# 也可以不拉取jenkins的镜像,直接使用线程的阿里云内配置好python和pytest的镜像。
# 在创建容器的时候,直接可以拉取镜像
docker run -id --name=myjenkins -p 8080:8080 -v /var/jenkins_node:/var/jenkins_home --restart always registry.cn-hangzhou.aliyuncs.com/sqqdcl/jenkins
# 7- 查看容器是否启动
docker ps -a
# 8- 使用ifconfig命令查看宿主机ip,并进行浏览器访问
http://宿主机ip:8080/
3.1.2 安装Jenkins 自动化CI流程依赖环境
Jenkins安装python
因为需要在Jenkins内启用python并运行脚本代码,所以Jenkins内需要配置python
1)下载最新的python安装包。本方案采取wget方式进行下载
①可以在官网下载最新版本的tgz文件,然后使用Xftp工具复制进挂载目录内。官网为 https://www.python.org/ftp/python/
②使用wget工具直接生成一个下载任务,在线下载。
2)宿主机操作
# 1.在宿主机挂载目录内新建一个python3的文件夹,我的挂载目录地址为 /var/jenkins_node
mkdir /var/jenkins_node/python3
# 2.使用wget工具在线拉取python3.9.9版本tgz文件
cd /var/jenkins_node/python3
wget https://www.python.org/ftp/python/3.9.9/Python-3.9.9.tgz
# 注意,如果提示找不到wget命令,请使用yum进行安装wget及依赖文件
yum -y install wget
# 完毕后在重新进行拉取,直到拉取完成
# 3.解压python3的压缩包,比如下载3.9.9版本
tar -zxvf Python-3.9.9.tgz
3)容器内操作
# 1.进入容器配置依赖数据
docker exec -uroot -it myjenkins /bin/bash
# 更新apt-get,过程较慢,耐心等待即可
# 不要百度去修改镜像源,不然会出现各种难以解决的报错
apt-get update
# 安装依赖,较慢,耐心等待即可
apt-get -y install gcc automake autoconf libtool make
apt-get -y install make*
apt-get -y install zlib*
apt-get -y install openssl libssl-dev
apt-get install sudo
# 2.配置安装目录
# 注意!!!:将jenkins_home内的python路径移动到opt内。因为jenkins_home内都是初始化配置操作,将容器打包成镜像后jenkins_home配置都会重置,为了防止重置后python3文件夹被清除,需要将python3文件夹移动到其他路径下进行配置。
mv /var/jenkins_home/python3 /opt/
cd /opt/python3/Python-3.9.9 # 3.9.9文件夹内
./configure --prefix=/opt/python3 --with-ssl
# 3.编译,执行安装,需要几分钟的等待时间
make && make install
# 4.创建软连接
ln -s /opt/python3/bin/python3.9 /usr/bin/python3
ln -s /opt/python3/bin/pip3 /usr/bin/pip
# 5- 检查更新环境
python --version
pip --version
# 6- 重启容器
exit
docker restart 容器id
4)更换apt-get为阿里源
如果使用apt工具安装依赖环境比较慢的话,可以考虑修改下载源
# 宿主机:
# 在宿主机内创建文件,方便后续直接mv,因为宿主机中没有vim,安装的话也需要很久的时间
cd /var/jenkins_node
vim sources.list
# 输入:
deb https://mirrors.aliyun.com/debian stable main contrib non-free
deb https://mirrors.aliyun.com/debian stable-updates main contrib non-free
#进入容器:
# apt-get原文件备份
mv /etc/apt/sources.list /etc/apt/sources.list.bak
# 将宿主机中同步到jenkins容器内的sources.list同步到原有的目录下
mv /var/jenkins_home/sources.list /etc/apt/sources.list
# 使阿里源生效
apt-get update
Jenkins安装pytest
python装好了,pytest就很简单了,直接pip即可
pip3 install pytest
Jenkins安装依赖环境
还是使用pip3 install方法安装
windows系统用到的库,依次去安装即可。
3.1.3 Jenkins插件下载
1)登录jenkins
# 访问
http://宿主机ip:端口号/
# 1- 获取管理员密码
# 在容器内在 /var/jenkins_home/secrets/initialAdminPassword 获取
docker exec -uroot -it 525 /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword
# 或者宿主机内在 /var/jenkins_node/secrets/initialAdminPassword 获取
cat /var/jenkins_node/secrets/initialAdminPassword
安装推荐插件,中间可能有的插件安装失败,不用管它。
如果安装的过程中有报错的内容,可能是在安装的过程中因为安装的插件太多排队的因素导致出错。点击重试就可以正常安装错误的插件
如果还是有失败的,可以先不管,直接点继续,之后使用离线方式去安装。
点完继续会让创建用户名和密码,然后保存并完成就好。
进入插件管理,下载并安装需要的插件,完成后重启jenkin服务。
2)安装插件gitlab,gitlab hook,allure
-
1、搜索gitlab,allure,选择直接安装。
-
2、注意:当插件安装失败时,可能的两种场景 -- 第一种插件下载地址源未生效,第二种版本太低
-
(1) 可能是因为default.json中插件下载地址https://updates.jenkins.io,升级站点设置未生效。
#需要操作一个步骤 #进入 Manage Jenkins -》 Manage Plugin -> Advanced 最下面有 Update Site 设置为 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
-
可能是Jenkins版本太低的问题(在系统管理的右下角可以查看版本 ),需要下载Jenkins的war包并替换掉旧的war包并重启
# 查看Jenkins版本 # 容器内: cat /var/jenkins_home/config.xml|grep version # 宿主机: cat 挂载目录/config.xml | grep version
推荐清华镜像源下载最新版本的 war 包文件,也可以在jenkins内下载最新版本。保存到指定位置,假设保存路径为
宿主机目录挂载路径/jokerwon/Downloads/jenkins.war(打的war包)
我的路径是/var/jenkins_node/jokerwon/Downloads/jenkins.war
。-
(1) 将 war 包拷贝到 docker 容器
使用 docker cp 命令将 war 包从宿主机拷贝到 docker 容器中,记得备份原始 war 包。假设容器名称为 myjenkins ,通常 docker 版的 Jenkins 容器的 war 包存放位置为 /usr/share/jenkins 下。
# 先进入容器备份旧版本 war 包 docker exec -uroot -it 525(容器id) /bin/bash # 查看war包 cd /usr/share/jenkins/ ls # 备份旧war包 mv /usr/share/jenkins/jenkins.war /usr/share/jenkins/jenkins.war.bak # 回到宿主机 shell 环境 exit # 替换成新版本的 war 包 # 在宿主机的挂载目录下新建文件夹 mkdir -p /var/jenkins_node/jokerwon/Downloads/ # 使用Xftp工具将下载好的war包复制到对应的挂载目录下 # 将挂载目录下的新war包复制到jenkins容器内的war包目录下 docker cp /var/jenkins_node/jokerwon/Downloads/jenkins.war jenkins(容器名称):/usr/share/jenkins/jenkins.war
-
(2) 重启 Jenkins 服务
docker restart jenkins(容器名)
-
进入jenkins内重新安装插件,查看是否可以安装成功
安装gitlab插件,可以安装成功
-
-
3)jenkins全局工具设置
重新进入jenkins,配置JDK丶git丶allure路径,直接按给的填写即可
-
1、JAVA_HOME路径
路径 /usr/local/openjdk-8
-
2、allure路径
路径 /opt/allure-2.13.5
-
保存
3.1.4 jenkins邮件功能测试
安装email-ext插件
需要准备:
1- 邮件发送邮箱账号
2- 授权码(注意,不是邮箱密码)所有第三方操作邮件都需要这个授权码
3- 对应的邮箱请百度获取授权码的方法
离线安装Jenkins-email插件,步骤如下(建议删除jenkins之前自动下载的email插件,实测会有发送失败的问题)
建议不要下载最新版本,我本人是下载的2.85版本,下载下来是一个hpi文件
然后进入jenkins-系统管理-插件管理里进行配置,步骤如下
等待完成即可
重启jenkins进行邮件配置
1.插件下好后,重启jenkins
docker restart 容器id
2.配置邮件
配置管理员邮箱地址,发送人邮箱
这些配置好之后就可以进行测试邮件通没通了
通过会输出如下字样
最后不要忘了点保存。
3.1.5 环境验证
python环境验证
进入容器,输入pyhton3
docker exec -it -uroot 容器id /bin/bash
python3
查看python环境的安装库
pip3 list
pytest环境验证
### 进入docker里加pytest软连接
#管理员进入容器
docker exec -uroot -it 容器id /bin/bash
#加pytest软连接
ln -s /opt/python3/bin/pytest /usr/bin/pytest
#软连接是linux中一个常用命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接。
#具体用法是:ln -s 源文件 目标文件。
#当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在其它的 目录下用ln命令链接(link)就可以,不必重复的占用磁盘空间。
3.2 使用Jenkins实现自动化测试 -- 自由风格
#目前方案没有gitlab,首先保证Jenkins跑通,后在配置gitlab
#把项目的自动化脚本文件夹放到--宿主机与容器挂载的目录下
#或使用xftp工具,放到--宿主机与容器挂载的目录下,容器下查看下
docker exec -uroot -it 525 /bin/bash
cd /var/jenkins_home
ls
新建工程
打开jenkins,点击新建任务
选择自由风格(其他风格也建议自行了解),输入任务名称,点击确定即可。
配置选项
在完成系统设置后,还需要给需要构建的项目进行邮件配置。
选择配置构建后操作模块
进入系统配置页面后,点击上方的构建后操作选项,配置步骤如下
添加邮件内容模板
配置位置:
配置内容:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
本邮件由系统自动发出,无需回复!<br/>
各位同事,大家好,以下为<b>${PROJECT_NAME}</b>项目构建信息:</br>
<td><font color="0B610B"><b>构建结果 - ${BUILD_STATUS}</b></font></td>
</tr>
<tr>
测试结果:</br><td>
<p><font color="#000080">用例总数:${total}</font>,
<font color="#00FA9A">成功:${passed}</font>,
<font color="#FF0000">失败:${failed}</font>,
<font color="#A0522D">错误:${error}</font>,
<font color="#FFA500">跳过:${skipped}</font></p>
<p><font color="#FF00FF">成功率:${successful_rate},运行时长:${total_time}</font></p>
</td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li>项目名称:${PROJECT_NAME}</li>
<li>构建编号:第${BUILD_NUMBER}次构建</li>
<li>构建状态:${BUILD_STATUS}</li>
<li>测试报告:<a href="${BUILD_URL}allure">点击这里</a></li>
<li>构建日志:<a href="${BUILD_URL}console">点击这里</a></li>
<li>构建URL :<a href="${BUILD_URL}">点击这里</a></li>
<li>工作目录:<a href="${PROJECT_URL}ws">点击这里</a></li>
<li>项目URL :<a href="${PROJECT_URL}">点击这里</a></li>
<li>触发构建:${CAUSE}</li>
</ul>
<h4><font color="#0B610B">最近提交(#commit message from Gitlab)</font></h4>
<hr size="2" width="100%" />
<ul>
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
</ul>
详细提交: <a href="${PROJECT_URL}changes">点击这里</a><br/>
</td>
</tr>
</table>
</body>
</html>
Tirggers新增always,可以选择add增加你要发送的人员列表。
项目收件人列表即前边填写的Project Recipient List
最后保存,然后构建,构建成功后邮箱收到邮件。
Jenkins 实现构建
配置pytest命令,生成allure报告。
1- 构建--增加构建步骤--执行sh命令(根据需要进行选择)
#!/bin/bash
#!untitled5为项目路径
cd ./untitled5/test_case
#!${WORKSPACE}表示全局变量,会跟随不同的项目名称而变动。
pytest -sq --alluredir=${WORKSPACE}/allure-results
exit 0
${WORKSPACE}表示全局变量,会跟随不同的项目名称而变动。
2- 构建后操作--选择Allure Report
保存。
注意:构建时报错,日志没有权限写入。
直接将日志的目录加到最大的权限
chmod -R 777 /var/jenkins_home/untitled5/
四、git技术
目标:jenkins关联git,实现持续集成
4.1 Git与SVN对比
Git比SVN相比有什么区别呢?
-
最核心的区别就是Git是分布式的, SVN是集中式的。SVN必须有一个服务器版本库就放在一个中央服务器。所有开发人员都是与服务器进行交互的。(一般的开发流程就是干活时候从中央服务器得到最新的版本,然后干活,干完后需药把自己做的工作推送到中央服务器。)
Git不需要有中心服务器,我们每台电脑拥有的东西都是一样的。我们使用Git并且有个中心服务器,仅仅是为了方便交换大家的修改,但是这个服务器的地位和我们每个人的PC是一样的。我们可以把它当做一个开发者的pc就可以就是为了大家代码容易交流不关机用的。没有它大家一样可以工作,只不过“交换”修改不方便而已。(所以git的开发流程是工作的时候不需要联网了,因为版本库就在你的电脑上。比如你在自己的电脑上修改了文件A,你同事也在她的电脑上修改了文件A,这时,你们之间只需要把自己的修改推送给对方。就可以看到了对方的修改了。)
Git更倾向于分布式开发,每台计算机上都有一个完整的本地版本库。和服务器上的一模一样。
去中心化有什么好处呢?
1- 操作处理速度快。 在Git中的绝大多数操作都是访问的本地文件和资源,不必联网就可以看到所有的历史版本记录,所以,处理起来速度也是飞快的。而SVN必须联网从中心服务器上下载下来数据才可以看到。
2- 不依赖网络。 SVN断开网络就没有commit代码。但是Git可以先Commit到本地仓库。使用SVN在没有网络的情况下,当然可以继续本地开发,但是不能commit代码,长时间不commit代码会丢失大量的开发进程的历史记录。有个比喻:不能commit代码就像word中不能save一样危险。所以我们在使用git开发过程中,commit一定要频繁,速度很快,又能记录你的改动。如果一天commit一次,那么中间的修改,就再找不回来了。
3- 安全性更高。 因为每个人的电脑都有完整的版本库,所以某一个电脑坏掉了不要紧,随便从其他人哪里复制一个就可以了。而SVN集中式版本控制的中央服务器要是出了问题,所有人都没法干活了。
4.2 Git工作流程
- 1.克隆远程仓库到本地。
-
默认状态下本地没有本地仓库,需要clone下来后生成本地仓库。
-
-
2.在本地仓库中checkout代码--进行编写
-
3.在提交前到本地仓库前--需要到暂存区 index stage
-
4.提交到本地仓库--commit
-
5.推送到远程仓库里--push
4.3 Git常用命令
图片失真,原图可后台回复‘git命令’获取。
4.4 gitlab容器搭建
#由于是docker镜像运行, 所以我们需要把gitlab的配置, 数据, 日志存到容器外面, 即将其挂载到宿主机。先准备三个目录:
cd /srv #切到srv目录
mkdir gitlab#创建gitlab文件夹
cd gitlab
mkdir config logs data
docker run -di -p 443:443 -p 9001:80 -p 8022:22 --hostname 虚拟机的Ip --name mygitlab --restart always -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data:/var/opt/gitlab -v /etc/localtime:/etc/localtime:ro --privileged=true gitlab/gitlab-ce:13.9.2-ce.0
进入gitlab
上面步骤操作完成后,输入‘宿主机ip:9001’就可以进入gitlab界面。
这块需要注意几点
-
gitlab容器运行时占用内存很大,2个多G,我的云服务器就运行不了
-
记得在防火墙里开放端口
默认用户是root,刚进入时要修改密码不少于八个字符。
进入登录界面,输入用户名root和刚修改的密码点击登录即可。
访问时提示502
解决方式:
docker ps #查看容器id
docker exec 容器id gitlab-ctl reconfigure #容器里启动服务
systemctl stop firewalld #关闭防火墙
4.5 git本机客户端
git安装流程
官网下载git客户端:https://git-scm.com/downloads
点击download,选择自己对应的系统
安装git客户端
一直下一步即可,只需要注意不要装在C盘。
装完会有这两个工具
-
Git GUI:Git提供的图形界面工具--不常用
-
Git Bash:Git提供的命令行工具--常用
git内的操作 -- 判断git是否安装成功
#1- 新建一个文件夹--作为本地仓库 zp
#2- 在这个文件夹里--右键--点击 git bash here 打开命令行终端
#3- 查看Git客户端版本
git --version
#4- 环境配置---选配
git config --global user.name "zp"
git config --global user.name.email "[email protected]"
#5- 克隆远程仓库(会验证身份,填自己的Gitlab用户名/密码即可)
# ip地址后面设置创建git容器时设置的端口
git clone gitlab容器地址:端口/zpzp(项目名).git
# 访问路径
cd zpzp
# 创建文件
touch hello.txt
# 将文件推送到暂存区
git add hello.txt
# 查看文件是否存在暂存区
git status
# 将文件推送到本地仓库
git commit -m "add hello.txt"
# 将文件推送到远程仓库
git push -u origin master
4.6 Git实现持续集成
pycharm关联git,代码每一次更新提交到git仓库,git都会通知jenkins,jenkins通过webhook触发git命令获取到git仓库内的最新代码,将代码关联到jenkins的目录挂载路径下,在自动执行构建。构建后会发送结果到关联负责人的邮箱内进行查看
4.6.1 gitlab新建工程
4.6.2 Pycharm配置Git环境
然后输入gitlab的登录账号和密码
把项目代码复制到git工程路径下,并使用pycharm打开
设置git客户端和pycharm相关联
默认会显示地址,如果地址不对可以进行替换,替换后点击ok
尝试pycharm提交代码到git
点击commit,选择要提交的文件,选择提交到本地仓库并push到远程仓库
点击push
查看gitlab,发现代码已经提交成功
4.6.3 jenkins关联gitlab
-
Jenkins关联gitlab需要注意的点
-
1、保证jenkins和gitlab这两个服务都是可以畅通连接的
-
2、jenkins内配置gitlab相关联的插件
-
3、在jenkins全局配置内配置git相关的docker容器路径
-
4、jenkins版本选择git
-
5、gitlab只要有设置好的事件触发,会webHook通过一个url post方法通知jenkins
-
6、jenkins收到触发信息,他需要执行构建操作---最新的代码会自动从gitlab会获取,执行构建
-
在jenkins内配置gitlab所需要关联的插件
在插件管理里安装如下插件
在全局环境内配置git
在工程内进行配置
添加凭据
构建触发器
修改构建配置
#!/bin/bash
rm -rf allure-results
cd ./untitled5/test_case
pytest -sq --alluredir=${WORKSPACE}/allure-results
exit 0
4.6.4 gitlab关联jenkins
gitlab允许外部所有请求
完毕后点击Save changes
点击project回到工程
配置webhooks
4.6.5 验证
删除掉之前jenkins尝试构建的项目代码。并使用pycharm进行提交运行
五.常见问题
5.1 时间不同步问题
linux内的时间和宿主机不同步,还有jenkins内的时间不同步
linux和宿主机时间不同步
宿主机linux查看时间
[root@localhost etc]# date
时区是对的,只是时间不对
安装ntp
yum install ntp #安装ntp服务
同步阿里时间
docker cp /etc/localtime 容器id或名称:/etc/localtime
#抛异常
Error response from daemon: Error processing tar file(exit status 1):invalid symlink"/usr/share/zoneinfo/UCT" -> "../usr/share/zoneinfo/Asia/Shanghai”
#解决办法
docker cp /usr/share/zoneinfo/Asis/shanghai 容器id:/etc/localtime
#重启容器
docker restart 容器id
ntpdate ntpl.aliyun.com
注意事项:
-
可能网络会断开,需要重新reboot下linux
-
虚拟机的ip可能会改变
jenkins时间不同步
解决:打开jenkins的【系统管理】---> 【脚本命令行】,在命令框中输入一下命令【时间时区设为 亚洲上海】:
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')