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

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

目录:

  • 一、什么是CI流程,为什么要使用CI流程
    • 1.1 持续集成 (Continuous Integration)
    • 1.2 持续集成工作
    • 1.3 为什么测试要学持续集成的技术
  • 二、docker技术
    • 2.1 docker概述
    • 2.2 静态IP设置 -- centos虚拟机放置IP修改
    • 2.3 docker的相关操作
    • 2.4 docker进程相关操作
    • 2.5 docker操作镜像命令
    • 2.6 拓展
  • 三、jenkins技术
    • 3.1 jenkins环境搭建
    • 3.2 使用Jenkins实现自动化测试 -- 自由风格
  • 四、git技术
    • 4.1 Git与SVN对比
    • 4.2 Git工作流程
    • 4.3 Git常用命令
    • 4.4 gitlab容器搭建
    • 4.5 git本机客户端
    • 4.6 Git实现持续集成
  • 五.常见问题
    • 5.1 时间不同步问题

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

一、什么是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=staticNETMASK=255.255.255.0GATEWAY=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 推送到dockerhubdocker 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/容器idvi 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)可读可写可执行  wrxchmod 777 /var/jenkins_node# 6- 创建与启动守护式容器---注意容器中的端口使用8080docker 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_nodemkdir /var/jenkins_node/python3# 2.使用wget工具在线拉取python3.9.9版本tgz文件cd /var/jenkins_node/python3wget 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 makeapt-get -y install make*apt-get -y install zlib*apt-get -y install openssl libssl-devapt-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/python3ln -s /opt/python3/bin/pip3 /usr/bin/pip# 5- 检查更新环境python --versionpip --version# 6- 重启容器exitdocker restart 容器id

4)更换apt-get为阿里源

如果使用apt工具安装依赖环境比较慢的话,可以考虑修改下载源

# 宿主机:# 在宿主机内创建文件,方便后续直接mv,因为宿主机中没有vim,安装的话也需要很久的时间cd /var/jenkins_nodevim sources.list# 输入:deb https://mirrors.aliyun.com/debian  stable main contrib non-freedeb 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/bashcat /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/bashpython3

查看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/bashcd /var/jenkins_homels

新建工程

打开jenkins,点击新建任务

选择自由风格(其他风格也建议自行了解),输入任务名称,点击确定即可。

配置选项

在完成系统设置后,还需要给需要构建的项目进行邮件配置。

选择配置构建后操作模块

进入系统配置页面后,点击上方的构建后操作选项,配置步骤如下

添加邮件内容模板

配置位置:

配置内容:

            ${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志                                            本邮件由系统自动发出,无需回复!
                       各位同事,大家好,以下为${PROJECT_NAME}项目构建信息:
                                    测试结果:
                                                                                     
构建结果 - ${BUILD_STATUS}
       

用例总数:${total},       成功:${passed},    失败:${failed},          错误:${error},    跳过:${skipped}

       

成功率:${successful_rate},运行时长:${total_time}

       

               构建信息               
                   
                           
  • 项目名称:${PROJECT_NAME}
  •                        
  • 构建编号:第${BUILD_NUMBER}次构建
  •                        
  • 构建状态:${BUILD_STATUS}
  •                     
  • 测试报告:点击这里
  •                         
  • 构建日志:点击这里
  •                        
  • 构建URL :点击这里
  •                        
  • 工作目录:点击这里
  •                        
  • 项目URL :点击这里
  •      
  • 触发构建:${CAUSE}
  •                                     
     

最近提交(#commit message from Gitlab)


    ${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="
  • %d [%a] %m
  • "}
详细提交: 点击这里
             
      

Tirggers新增always,可以选择add增加你要发送的人员列表。

项目收件人列表即前边填写的Project Recipient List

最后保存,然后构建,构建成功后邮箱收到邮件。

Jenkins 实现构建

配置pytest命令,生成allure报告。

1- 构建--增加构建步骤--执行sh命令(根据需要进行选择)

#!/bin/bash#!untitled5为项目路径cd ./untitled5/test_case#!${WORKSPACE}表示全局变量,会跟随不同的项目名称而变动。pytest -sq --alluredir=${WORKSPACE}/allure-resultsexit 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 #查看容器iddocker 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 "xxx@qq.com" #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/bashrm -rf allure-resultscd ./untitled5/test_casepytest -sq --alluredir=${WORKSPACE}/allure-resultsexit 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')

VR资源云