ZAgent的使用

2022-03-01 15:50:25
先知
567
最后编辑:先知 于 2022-05-26 08:34:04
分享链接

ZAgent 是禅道开源的软件自动化 测试调度平台,它借助虚拟化技术,为用户提供了一个分布式、集中管理的的测试环境,从而提高测试执行效率,减少测试资产的投入。
随着敏捷、 DevOps CI/CD 等研发过程和实践的广泛应用,软件测试、特别是自动化测试,面临着更大的机遇和挑战。自动化测试,作为流水线的构建、部署、验证、发布过程中的一个不可忽视的环节,其能否高效运行,同测试环境的有效管理是密不可分的。借助 ZAgent ,我们可自动化地、按需创建、用后即焚地管理和使用测试环境。

一、 部署KVM宿主机环境

这里使用 Ubuntu20.04 桌面版来作为宿主机,搭建虚拟化环境。

 

1. 首先,验证主机是支持虚拟化,有输出表明支持

                  root@pve:~# egrep -o "(vmx|svm)" /proc/cpuinfo 
vmx
vmx
vmx


2.  安装虚拟化软件

sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients libvirt-dev qemu virt-manager bridge-utils
sudo service libvirtd restart


老的 Ubuntu 系统,请用以下命令替换。注意 libvirt-daemon-system libvirt-clients 换成 libvirt-bin

sudo apt-get install qemu-kvm libvirt-bin qemu virt-manager bridge-utils
sudo service libvirt-bin restart


3. 下载系统和驱动

·    这里 下载微软 Win10 官方光盘镜像;

·    这里 下载虚机 I/O 设备驱动,我选择的是稳定版 virtio-win-0.1.185.iso

 

4. 打开虚拟机管理工具

在图形界面中打开终端,输入 virt-manager ,启动虚拟机管理工具;  


图中显示的 QEMU/KVM 表明,已成功连接到本地服务;

如果状态为断开,请双击尝试连接,若显示不能连接到 libvirtd 服务,可重启机器修复;

·  您也可以通过点击菜单 文件 -> 添加连接 ,来连接和管理远程宿主机上的虚拟机,格式形如 qemu+ssh://user@192.168.0.56:22/system?socket=/var/run/libvirt/libvirt-sock

 

5. 新建虚拟机

·  点击菜单 文件 -> 新建虚拟机 ,打开虚拟机创建向导;  


·  选择前面下载的 Win10 镜像文件作为本地安装介质;

 

·  网络设置页面,选择 主机设备 也就是宿主机的网卡,这样虚拟机会作为局域网中的一台电脑而存在;  


·  按向导完成其他设置,并保存。

 

6. 设置虚拟机

·  双击打开虚拟机窗口,点击 查看 -> 详情 ,进入虚拟机属性页面;

·  点击引导选项卡,设置系统从光盘启动;  


·  点击左下角 添加硬件 ,增加一个光盘,指向下载的 virtio 驱动;  


 

7. 安装虚拟机

·  启动后,自动从光盘安装系统;

· Windows 安装向导中,选择加载驱动程序;  


·  选择 virtio 驱动 CDROM 里, NetKVM 目录下对应系统的文件;  


·  完成后续的安装步骤。

 

8. 结束安装

·  安装完成后,再次打开虚拟机窗口;  


·  进入 CDROM 选项卡,删除安装光盘;

·  启动虚拟机,更新系统,并安装测试相关软件;

·  完成后续的安装步骤。

二、安装KVM虚拟机

首先,我们来了解一下 KVM 虚拟机有关的几个概念和工具。

· kvm :基于内核的虚拟机(引擎)

· qemu :用于模拟虚拟机 IO 设备

· qemu-img :虚拟机磁盘管理工具

· libvirt :虚拟化服务的 API 接口

· virsh :基于 libvirt 实现的命令行工具

· qemu-manager :图形化管理工具


新建 KVM 虚拟机时,可以指定另一磁盘文件作为  BackingFile BackingFile 是一个只读的虚拟磁盘基础映像,可以在多个虚拟机间进行共享。基于 BackingFile 创建和运行虚拟机时,只会在自己的磁盘文件中增量地写入文件,从而提高效率、节省磁盘和维护成本。

虚拟机快照保存了虚拟机在某个指定时间点的状态,当我们在自动化测试过程中遭遇问题或错误时,可以利用快照保存、并恢复到执行中的某个时间点。借助 BackingFile 机制,虚拟机支持形如以下的多层依赖的快照链( <-- 表示依赖的方向)。

base image <-- vm01 <-- snap 1 <-- snap 2 <-- vm02(active)


可使用以下命令,将处于快照链中的某个虚机,导出形成一个独立的磁盘映像文件,其不再依赖其它映像。

qemu-img convert -O qcow2 vm02.qcow2 vm-templ.img


假设我们在用户的工作目录中,建立了以下目录。

kvm          根目录
   iso       存放光盘镜像
   base      存放基础磁盘镜像BackingFile
   share     存放共享磁盘镜像,用户存储测试工具、驱动等
   image     存放测试机的磁盘镜像
   xml       存放导出的虚拟机XML配置文件


1. 下面用一个例子,给大家介绍下快速创建测试虚拟机的方法。

 

·  按照上面 的步骤,创建一个 Win10 虚拟机;

·  在虚拟机中,安装好 Chrome 浏览器和测试相关软件;

·  使用以下命令,新建一个用于保存工具的共享磁盘;

qemu-img create -f qcow2 -o cluster_size=2M kvm/share/tools.qcow2 10G 


·  挂载共享磁盘到虚拟机 , 复制工具和文件到该共享磁盘;

·  移除该虚拟机,注意在确认对话框中,请选择 不删除相关磁盘文件

·  移动虚机主磁盘文件到基础镜像目录,如 kvm/base/windows/win10

·  执行以下命令,以上述基础镜像作为 BackingFile ,创建新的虚拟机磁盘;

qemu-img create -f qcow2 -o cluster_size=2M,backing_file=kvm/base/windows/win10/pro-x64-zh_cn.qcow2 kvm/image/test-win10-pro-x64-zh_cn-01.qcow2 50G


·  打开 qemu-manager ,新建测试虚拟机,挂在新创建的虚拟机磁盘和共享磁盘。

 

2. 除了使用图形界面的 qemu-manager 外,这里也提供一种命令行的方法,可用于代码中。

 

·  导出虚拟机 XML 配置文件;

virsh dumpxml test-win10-pro-x64-zh_cn > kvm/xml/test-win10-pro-x64-zh_cn.xml


·  修改 XML 配置文件中的以下字段:

name

uuid

vcpu

memory currentMemory

mac address

1 disk source file

 

·  在第 1 disk Element 中,加入以下 BackingFile 有关的内容:

<backingStore type="file" index="2">
   <format type="qcow2"/>
   <source file="/home/aaron/kvm/base/windows/win10/pro-x64-zh_cn.qcow2"/>
<backingStore/>


·  如需要用页面 VNC 访问虚拟机桌面,找到 XML graphics 元素,修改成以下内容;

<graphics type="vnc" port="-1" autoport="yes" listen="0.0.0.0" passwd="P2ssw0rd">
  <listen type="address" address="0.0.0.0"/>
</graphics>


·  使用以下命令定义虚拟机;

virsh define kvm /xml/test-win10-pro-x64-zh_cn.xml


·  使用以下命令启动虚拟机;

virsh start test-win10-pro-x64-zh_cn

 

·  使用以下命令获取虚拟机的 VNC 端口编号,在 VNC 软件中使用 ”5900+ 该数字 的端口,访问虚拟机远程桌面;

virsh vncdisplay test-win10-pro-x64-zh_cn 

 

2.  最后,我们介绍推荐的第三种方法,在代码中使用 libvirt* 接口来管理虚拟机。禅道基于 GO 语言的实现,请见 这里  

 

虚拟机有关常用命令:

# 查看虚拟机信息qemu-img info --backing-chain kvm/image/test-win10-pro-x64-zh_cn-01.qcow2
# 修改虚拟机磁盘大小qemu-img resize x64-pro-zh_cn.qcow2 +10G
# 查看虚拟机里列表virsh list --all
# 查看虚拟机VNC端口virsh vncdisplay win10-test
# 导出虚拟机XML配置文件virsh dumpxml win10-test > win10-test.xml
# 创建虚拟机磁盘镜像qemu-img create -f qcow2 -o cluster_size=2M,backing_file=base.qcow2 win10-test.qcow2 40G
# 转换虚拟机镜像qemu-img convert -O qcow2 vm02.qcow2 vm-templ.img # 定义、取消定义,启动、停止虚拟机virsh define win10-test.xmlvirsh start win10-testvirsh destroy win10-testvirsh undefine win10-test

三、 部署远程桌面代理

在宿主机上,完成以下步骤。

 

1.  执行以下命令,克隆代理项目的代码到 kvm 目录下;

git clone https://github.com/novnc/websockify.git ~/kvm/websockify


2.  websockify 同级目录,新建 token 文件夹;


3.  token 文件夹中,新建如下格式的配置文件;

vm01: 192.168.1.215:5904
    vm01:用于访问虚拟机的token;
    192.168.1.215:宿主机的IP地址;
    5901:虚拟机的VNC端口号。


注:由于 QEMU/KVM 虚拟机的 VNC 服务端口是自增的,在 ZAgent 启动宿主机代理时,我们使用代码来自动创建 10 token 文件,完成端口 5901-5910 token 的映射,并使用一个 Map 缓存起来。当宿主机代理收到创建虚拟机的请求时,可根据 VNC 的端口返回其对应的 token 。具体代码实现可参考 这里

 

4. kvm 下使用 virt-manager ,修改虚拟机远程桌面的类型为 VNC Server ,地址( Address )为所有接口( All interface ),端口为自动( Auto );



5.  执行以下命令,启动 websockify 服务。 6080 为代理端口, ../token/ 为端口转发配置文件所在的目录;

~/kvm/websockify/run --token-plugin TokenFile --token-source ~/kvm/token/ 6080

四、 部署noVNC服务

1. 执行以下命令,获取远程桌面项目的代码;

https://github.com/novnc/noVNC.git


2.  将项目中的文件拷贝到 Web 服务器中,或使用以下步骤安装一个静态服务器;

  • 这里下载并安装 node.js 环境;
  • 执行 npm install -g light-server 安装服务器;
  • 执行 light-server -s noVNC 启动 noVNC 服务,默认端口为 4000

五、 访问远程桌面

1. 在工作电脑上,用浏览器打开 http://< 宿主机 IP 地址 >:4000/vnc.html

 

2. 填入以下信息:

主机:宿主机 IP 地址;

端口: websockify 代理的端口号;

路径: websockify?token=vm01 ,其中 vm01 为上述 token 配置文件中的第一列。

 

3.  点击网页中的连接按钮,打开虚拟机 vm01 的远程桌面;

 

4.  另外,您也可使用简化版的 vnc_lite.html 页面来访问桌面。

http://<宿主机IP地址>:4000/vnc_lite.html?host=192.168.1.215&port=6080&path=websockify/?token=vm01

六、 部署ZAgent应用服务

1. 这里下载 ZAgent 应用,程序分为 3 个部分,分别为:

  • 服务端程序 zagent-server
  • 宿主机代理 zagent-host
  • 虚拟机代理 zagent-vm


2.  复制 zagent-server 到服务器,执行;

./zagent-server


3.  复制 zagent-host 到宿主机,执行;

./zagent-host -t host -s http://服务器IP:服务器端口 -i 本机IP -p 本机端口


4.  启动前面安装的 Win10 虚拟机,在用户根目录下创建 kvm 文件夹,得到形如 c:\Users\aaron\kvm 的目录;

 

5.  复制 zagent-vm 文件到 c:\Users\aaron\kvm\agent 目录;

 

6.  复制以下内容,保存为 c:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\zagent.bat Windows StartUp 目录下的 zagent-vm 代理程序,在系统启动时会被自动运行。

@echo on
:start
 
ping /n 3 114.114.114.114 | findstr "TTL=" && goto next || goto start
:next
cmd /k "cd /d c:\Users\aaron\kvm\agent && zagent-vm -t vm -s 服务器IP:服务器端口"
pause

以上批处理文件通过 ping 114.114.114.114 命令,等待虚拟机网络就绪,然后运行 zagent-vm 程序。

 

7.  对于 Linux 的虚拟机,请使用以下 Shell 脚本启动 ZAgent 虚拟机代理。

#!/bin/sh
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
serverAdr="114.114.114.114"
ping -c 1 $serverAdr > /dev/null 2>&1
while [ $? -ne 0 ]; do
  echo -e "\e[1A\e[K $(date): Connecting - ${serverAdr}"
  sleep 1
  ping -c 1 $serverAdr > /dev/null 2>&1
done
echo "$(date): Connected - ${serverAdr}";
cd /home/aaron/dev/project/zagent
git fetch --all && git reset --hard origin/main && git pull
go get all
# nohup go run cmd/agent-vm/main.go -t vm > zagent.log 2>&1
go run cmd/agent-vm/main.go -t vm




发表评论
评论通过审核后显示。