Bootstrap

保姆教程--使用Docker、jenkins、git技术搭建完整的CI流程

目录:

公众号“自动化测试研习社”。

一、什么是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相比有什么区别呢?

  1. 最核心的区别就是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')

;