Sonic,一站式开源分布式集群云真机测试平台,致力服务于中小企业的客户端 UI 测试(代码永久免费、开源)。
个人其实 21 年年底时已经关注,但当时觉得不太稳定及后期可能会收费什么的,虽然至今还不了解 sonic 背后的团队做这个靠什么活下来。
之前一直用着 atx2 开源框架,目前看到 sonic 已经相对稳定,这里 Mark 一下,希望有助于其他人在 linux 下部署开展
官网网址见:sonic 云真机
部署模式 1:【部署服务器 +agent 部署:均在 ubuntu 上部署】,这个搜了下,暂时还没相关比较全面的部署文章。
lixuefu2@ubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 21.04
Release: 21.04
Codename: hirsute
部署模式 2:【部署服务器 +agent 部署:ubuntu+windows】,官方部署方案
这里选型部署模式 1 来部署,主要是习惯都用 linux,后面也便于扩展
部署模式 2,可参考最后的备注链接中文章部署
大致的部署图为:(这里 0324 日更文时最新为 v1.3.2-beta,此处最新更新文章 0325 日时发现已更新到 v1.3.2-release,建议直接先浏览一遍整体,然后参考后文的第五点 yml 文件部署)
1、确保服务器前后端部署正常---docker-compose up -d
2、确保agent部署正常---拉linux下对应的agent包,解压后改yml文件,再执行java命令使得手机提示要装apk即可
agent部署过程见下,以下都是必须的,所以需要逐个配置(部分简单的就跳过)
===================== 开始检查配置环境 =====================
👉 检查 ANDROID_HOME 环境变量通过 ✔
👉 检查 ADB 环境通过 ✔
👉 检查 Node 环境通过 ✔
👉 检查 npm 环境通过 ✔
👉 检查 JAVA_HOME 环境变量通过 ✔
👉 检查 Appium 环境通过 ✔
👉 检查 adbkit 环境通过 ✔
👉 检查 chromeDriver 环境通过 ✔
👉 校验 本地文件夹 通过 ✔
===================== 配置环境检查结果 =====================
部署可分为服务器前后端部署(手机后台服务及前端展示)+agent 部署(运行在手机上的代理 apk),
【前后端部署】:建议直接使用 docker-compose;
【agent 代理安装】:由于官方默认的 yml 文件是偏 windows 部署,这里为了后期部署在树莓派上,统一使用 linux 部署
1、前后端部署:docker-compose up -d
修改配置文件:lixuefu2@ubuntu:~/sonic$ vim docker-compose.yml
version: '3'
services:
sonic-mysql:
image: "mysql:5.7"
hostname: sonic-mysql
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
- MYSQL_ROOT_PASSWORD=Sonic!@#123
- MYSQL_DATABASE=sonic
volumes:
- ./mysql/data:/var/lib/mysql
ports:
- "3307:3306"
networks:
- sonic-network
sonic-server-simple:
image: "sonicorg/sonic-server-simple:v1.3.2-beta"
container_name: sonic-server-simple
environment:
- MYSQL_HOST=sonic-mysql #这里的HOST要改成sonic-mysql哦
- MYSQL_PORT=3306
- MYSQL_DATABASE=sonic
- MYSQL_USERNAME=root
- MYSQL_PASSWORD=Sonic!@#123
#在服务器部署的话,localhost改为服务器ip,port更改为sonic-server-simple暴露的port(一般不变)
- SONIC_API_HOST=localhost
- SONIC_API_PORT=8094
- SONIC_NETTY_PORT=8095
#token加密的key值
- SECRET_KEY=sonic
#身份验证token有效天数
- EXPIRE_DAY=14
#前端页面访问地址,不填默认为http://localhost:3000
- CLIENT_HOST=http://localhost:3000
#文件保留天数(指测试过程产生的文件,包括图片、录像等等)
- FILE_KEEP_DAY=60
#测试结果保留天数
- RESULT_KEEP_DAY=60
#以下均为Cron表达式
#清理文件定时任务
- FILE_CRON=0 0 12 * * ?
#清理测试结果定时任务
- RESULT_CRON=0 0 12 * * ?
#发送日报定时任务
- DAY_CRON=0 0 10 * * ?
#发送周报定时任务
- WEEK_CRON=0 0 10 ? * Mon
networks:
- sonic-network
volumes:
- files:/keepFiles/
- files:/imageFiles/
- files:/recordFiles/
- files:/packageFiles/
- files:/logs/
ports:
- "8094:8094"
- "8095:8095"
sonic-client-web:
image: "sonicorg/sonic-client-web:v1.3.2-beta"
environment:
#192.168.1.1改为你的ipv4,port更改为sonic-server-simple暴露的port(一般不变)
- SONIC_API_HOST=192.168.213.130
- SONIC_API_PORT=8094
networks:
- sonic-network
ports:
- "3000:80"
volumes:
files:
networks:
sonic-network:
driver: bridge
一键部署
docker-compose up -d
2、确保前后端部署正常,前端页面可用
lixuefu2@ubuntu:~$ sudo docker ps -a
[sudo] lixuefu2 的密码:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d5063f8357c mysql:5.7 "docker-entrypoint.s…" 5 hours ago Up 5 hours 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp sonic_sonic-mysql_1
fa9b46b8f0f7 sonicorg/sonic-client-web:v1.3.2-beta "/docker-entrypoint.…" 5 hours ago Up 5 hours 0.0.0.0:3000->80/tcp, :::3000->80/tcp sonic_sonic-client-web_1
066189ea8c8e sonicorg/sonic-server-simple:v1.3.2-beta "java -server -Xmx80…" 5 hours ago Up 4 hours 0.0.0.0:8094-8095->8094-8095/tcp, :::8094-8095->8094-8095/tcp sonic-server-simple
问题 1:过程中发现 mysql 连接报错权限相关问题,为方便,直接赋予全部权限
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64$ sudo docker logs -f sonic-server-simple
org.quartz.JobPersistenceException: Failure identifying failed instances when checking-in: Can't get stat of './sonic/QRTZ_SCHEDULER_STATE.TRG' (Errcode: 13 - Permission denied)
Caused by: java.sql.SQLException: Can't get stat of './sonic/QRTZ_SCHEDULER_STATE.TRG' (Errcode: 13 - Permission denied)
chmod 777 -R mysql
问题 2:当本地启动了另一 mysql 时,会导致 docker 中的 docker 启动不成功,目前先 stop 掉即可:
service mysql stop
service mysql status
3、agent 部署:
先下载对应 agent 压缩包:https://github.com/SonicCloudOrg/sonic-agent/releases
下载后解压
lixuefu2@ubuntu:~/sonic$ unzip sonic-agent-v1.3.2-beta-linux_x86_64 -d .
解压后目录:
lixuefu2@ubuntu:~/sonic$ cd sonic-agent-v1.3.2-beta-linux_x86_64/
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64$ pwd
/home/lixuefu2/sonic/sonic-agent-v1.3.2-beta-linux_x86_64
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64$ ls
config logs mini plugins sonic-agent-linux-x86_64.jar test-output webview
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64$ cd config/
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64/config$ ls
application-prod.yml
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64/config$ pwd
/home/lixuefu2/sonic/sonic-agent-v1.3.2-beta-linux_x86_64/config
3.1、新建 agent 信息
3.2、修改 application-prod.yml
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64/config$ vim application-prod.yml
sonic:
agent:
# 替换为部署Agent机器的ipv4
host: 192.168.213.130
# 替换为Agent服务的端口,可以自行更改
port: 7777
# 替换为前端新增Agent生成的key
key: 2fd04815-ea9f-47c0-a2b4-cdd79896e542
server:
# 这个host改成后端的host
host: 192.168.213.130
# 如果跨网段,这个port改成后端文件中心的port(一般不变)
folder-port: 8094
# 如果跨网段,这个port改成后端传输中心的port(一般不变)
transport-port: 8095
modules:
# 安卓模块配置
android:
enable: true
# 是否开启远程adb调试功能
use-adbkit: true
# iOS模块配置
ios:
# 如果不需要连接iOS设备,请将true改为false。开启的windows用户请确保本机已安装iTunes
enable: true
#替换为你自己使用的wda的bundleId,如果没有.xctrunner后缀会自动补全,建议使用公司的开发者证书
wda-bundle-id: com.facebook.WebDriverAgentRunner.xctrunner
appium:
enable: true
# 默认为0会自动寻找随机端口启动,如果需要指定appium server端口,请在这里设置
port: 0
# 在线webView调试模块配置
webview:
enable: true
# 谷歌调试端口,一般不需要修改(默认0使用随机端口,如果需要开启防火墙给外部使用,请设置固定端口如7778)
chrome-driver-debug-port: 0
# Agent机器上的chrome浏览器的driver路径,可以去http://npm.taobao.org/mirrors/chromedriver/下载
# chrome-driver-path: C:\Program Files\Google\Chrome\Application\chromedriver.exe
chrome-driver-path: /usr/bin/google-chrome
# Agent日志管理,一般不需要更改,可根据自己需要配置
logging:
file:
#日志路径
name: logs/sonic-agent.log
logback:
rollingpolicy:
clean-history-on-start: true
#保留天数
max-history: 3
pattern:
console: "%clr(%d{${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}"
3.3、安装 jdk16 及配置 JAVA_HOME
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-16-jdk
确认 jdk16 安装成功,这里一定要用 16,否则会报 jdk 相关类的处理报错问题
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64/config$ java -version
openjdk version "16.0.1" 2021-04-20
OpenJDK Runtime Environment (build 16.0.1+9-Ubuntu-1)
OpenJDK 64-Bit Server VM (build 16.0.1+9-Ubuntu-1, mixed mode, sharing)
vim /etc/profile
在 profile 的最后加入以下行
JAVA_HOME=/usr/lib/jvm/java-16-openjdk-amd64
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
source /etc/profile
3.4、配置 ANDROID_HOME
查看 adb 路径:
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64/config$ adb version
Android Debug Bridge version 1.0.41
Version 28.0.2-debian
Installed as /usr/lib/android-sdk/platform-tools/adb
vim /etc/profile
在 profile 的最后加入以下行
export ANDROID_HOME=/usr/lib/android-sdk
source /etc/profile
3.5、配置 chrome
1)先安装 Chrome
sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.list.d/
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
apt-get update
apt-get install google-chrome-stable
2)执行 google-chrome 启动谷歌浏览器
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64/config$ google-chrome -v
正在现有的浏览器会话中打开。
3)查看 chrome 路径:
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64/config$ which google-chrome
/usr/bin/google-chrome
4)修改 application-prod.yml
文件(由于官方的这个是默认对应 windowsC 盘路径下的 chrome)
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64/config$ vim application-prod.yml
3.6、以上配置完,直接运行
这里由于 chrome 的安全机制,不能使用 root 运行,直接用个人用户运行即可
java -Dfile.encoding=utf-8 -jar sonic-agent-linux-x86_64.jar
lixuefu2@ubuntu:~/sonic/sonic-agent-v1.3.2-beta-linux_x86_64$ java -Dfile.encoding=utf-8 -jar sonic-agent-linux-x86_64.jar
▄▄▄▄ ▄▄▄▄ ▄▄▄ ▄▄ ▄▄▄▄▄▄ ▄▄▄▄
▄█▀▀▀▀█ ██▀▀██ ███ ██ ▀▀██▀▀ ██▀▀▀▀█
██▄ ██ ██ ██▀█ ██ ██ ██▀
▀████▄ ██ ██ ██ ██ ██ ██ ██
▀██ ██ ██ ██ █▄██ ██ ██▄
█▄▄▄▄▄█▀ ██▄▄██ ██ ███ ▄▄██▄▄ ██▄▄▄▄█
▀▀▀▀▀ ▀▀▀▀ ▀▀ ▀▀▀ ▀▀▀▀▀▀ ▀▀▀▀
2022-03-24 19:08:29.308 - INFO 27762 --- [main] org.cloud.sonic.agent.AgentApplication : Starting AgentApplication v1.3.2-beta using Java 16.0.1 on ubuntu with PID 27762 (/home/lixuefu2/sonic/sonic-agent-v1.3.2-beta-linux_x86_64/sonic-agent-linux-x86_64.jar started by lixuefu2 in /home/lixuefu2/sonic/sonic-agent-v1.3.2-beta-linux_x86_64)
2022-03-24 19:08:29.312 - INFO 27762 --- [main] org.cloud.sonic.agent.AgentApplication : The following profiles are active: prod,linux-x86_64
2022-03-24 19:08:30.510 - INFO 27762 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 7777 (http)
2022-03-24 19:08:30.520 - INFO 27762 --- [main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-03-24 19:08:30.521 - INFO 27762 --- [main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.53]
2022-03-24 19:08:30.573 - INFO 27762 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-03-24 19:08:30.574 - INFO 27762 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1183 ms
===================== 开始检查配置环境 =====================
👉 检查 ANDROID_HOME 环境变量通过 ✔
👉 检查 ADB 环境通过 ✔
👉 检查 Node 环境通过 ✔
👉 检查 npm 环境通过 ✔
👉 检查 JAVA_HOME 环境变量通过 ✔
👉 检查 Appium 环境通过 ✔
👉 检查 adbkit 环境通过 ✔
👉 检查 chromeDriver 环境通过 ✔
👉 校验 本地文件夹 通过 ✔
===================== 配置环境检查结果 =====================
JAVA_HOME(系统PATH环境变量): /usr/lib/jvm/java-16-openjdk-amd64
java version(运行当前jar的java版本): 16.0.1
ANDROID_HOME(系统PATH环境变量): /usr/lib/android-sdk
ADB path: /usr/bin/adb
ADB version: Android Debug Bridge version 1.0.41
Version 28.0.2-debian
Installed as /usr/lib/android-sdk/platform-tools/adb
chromeDriver path: /usr/bin/google-chrome
插上手机,然后刷新,会发现手机提示安装相关的 apk
目前发现 sonic 连接手机时,两款华为机型无法获取到图像,OPPO 正常(后续全部使用 docker 部署后,版本一致对上就没有该问题)
机型:HUAWEI Mate 30E Pro 5G 全网通版、JEF-NX9
2022-03-24 19:35:10.379 -ERROR 23902 --- [Device List Monitor] o.c.s.a.b.a.AndroidDeviceBridgeTool : device offline
2022-03-24 19:35:10.379 - INFO 23902 --- [Device List Monitor] o.c.s.a.b.a.AndroidDeviceBridgeTool : 获取屏幕尺寸失败!拔插瞬间可忽略该错误...
2022-03-24 19:35:10.387 - INFO 23902 --- [Device List Monitor] o.c.s.a.b.a.AndroidDeviceStatusListener : Android设备:DBPDU20610018231 ONLINE!
2022-03-24 19:35:27.796 - INFO 23902 --- [http-nio-7777-exec-4] o.c.s.agent.websockets.TerminalWSServer : 等待安装超时!
2022-03-24 19:35:28.030 - INFO 23902 --- [http-nio-7777-exec-5] o.c.s.a.w.AndroidScreenWSServer : 等待安装超时!
2022-03-24 19:35:38.014 - INFO 23902 --- [http-nio-7777-exec-8] o.c.s.agent.websockets.TerminalWSServer : 20退出
2022-03-24 19:35:38.014 - INFO 23902 --- [http-nio-7777-exec-2] o.c.s.agent.websockets.AndroidWSServer : 关闭driver异常!
2022-03-24 19:35:38.088 - INFO 23902 --- [http-nio-7777-exec-2] o.c.s.agent.websockets.AndroidWSServer : 1e退出
2022-03-24 19:35:38.088 - INFO 23902 --- [http-nio-7777-exec-2] o.c.s.agent.websockets.AndroidWSServer : android解锁udId:DBPDU20610018231
由于更新到 v1.3.2-release 后 agent 可以使用 docker-compose 部署啦,所以这里将完整的 docker-compose.yml 文件内容共享如下,已实战可用:
version: '3'
services:
sonic-agent:
#下方为Docker Hub镜像,推荐海外用户使用,默认使用国内加速镜像
#image: "sonicorg/sonic-agent-linux:v1.3.2-release"
image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-agent-linux:v1.3.2-release"
environment:
# 替换为部署Agent机器的ipv4
- AGENT_HOST=192.168.213.130
# 替换为Agent服务的端口,可以自行更改
- AGENT_PORT=7777
# 替换为前端新增Agent生成的key
- AGENT_KEY=2fd04815-ea9f-47c0-a2b4-cdd79896e542
# 这个host改成后端的host
- SERVER_HOST=192.168.213.130
# 这个port改成后端文件中心的port(一般不变)
- SERVER_FOLDER_PORT=8094
# 这个port改成后端传输中心的port(一般不变)
- SERVER_TRANSPORT_PORT=8095
# 是否使用安卓模块
- ANDROID_ENABLE=true
# 是否开启远程adb调试功能
- USE_ADBKIT=true
# 是否使用iOS模块
- IOS_ENABLE=true
# 替换为你自己使用的wda的bundleId,如果没有.xctrunner后缀会自动补全,建议使用公司的开发者证书
- WDA_BUNDLE_ID=com.facebook.WebDriverAgentRunner.xctrunner
# 是否启用Appium
- APPIUM_ENABLE=true
# 默认为0会自动寻找随机端口启动,如果需要指定appium server端口,请在这里设置
- APPIUM_PORT=0
# 是否启用webview调试功能
- WEBVIEW_ENABLE=true
# 谷歌调试端口,一般不需要修改(默认0使用随机端口,如果需要开启防火墙给外部使用,请设置固定端口如7778)
- CHROME_DRIVER_PORT=0
network_mode: "host"
privileged: true
volumes:
- /dev/bus/usb:/dev/bus/usb
- /var/run/usbmuxd:/var/run/usbmuxd
sonic-mysql:
image: "mysql:5.7"
hostname: sonic-mysql
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
- MYSQL_ROOT_PASSWORD=Sonic!@#123
- MYSQL_DATABASE=sonic
volumes:
- ./mysql/data:/var/lib/mysql
ports:
- "3307:3306"
networks:
- sonic-network
sonic-server-simple:
image: "sonicorg/sonic-server-simple:v1.3.2-release"
container_name: sonic-server-simple
environment:
- MYSQL_HOST=sonic-mysql #这里的HOST要改成sonic-mysql哦
- MYSQL_PORT=3306
- MYSQL_DATABASE=sonic
- MYSQL_USERNAME=root
- MYSQL_PASSWORD=Sonic!@#123
#在服务器部署的话,localhost改为服务器ip,port更改为sonic-server-simple暴露的port(一般不变)
- SONIC_API_HOST=localhost
- SONIC_API_PORT=8094
- SONIC_NETTY_PORT=8095
#token加密的key值
- SECRET_KEY=sonic
#身份验证token有效天数
- EXPIRE_DAY=14
#前端页面访问地址,不填默认为http://localhost:3000
- CLIENT_HOST=http://localhost:3000
#文件保留天数(指测试过程产生的文件,包括图片、录像等等)
- FILE_KEEP_DAY=60
#测试结果保留天数
- RESULT_KEEP_DAY=60
#以下均为Cron表达式
#清理文件定时任务
- FILE_CRON=0 0 12 * * ?
#清理测试结果定时任务
- RESULT_CRON=0 0 12 * * ?
#发送日报定时任务
- DAY_CRON=0 0 10 * * ?
#发送周报定时任务
- WEEK_CRON=0 0 10 ? * Mon
networks:
- sonic-network
volumes:
- files:/keepFiles/
- files:/imageFiles/
- files:/recordFiles/
- files:/packageFiles/
- files:/logs/
ports:
- "8094:8094"
- "8095:8095"
sonic-client-web:
image: "sonicorg/sonic-client-web:v1.3.2-release"
environment:
#192.168.1.1改为你的ipv4,port更改为sonic-server-simple暴露的port(一般不变)
- SONIC_API_HOST=192.168.213.130
- SONIC_API_PORT=8094
networks:
- sonic-network
ports:
- "3000:80"
volumes:
files:
networks:
sonic-network:
driver: bridge
然后直接把之前部署容器的杀掉再重启即可
docker-compose down
docker-compose up -d
官方推荐部署网址:sonic 官方部署
《基于 Docker 方式部署 sonic 前后端(体验版)》:docker 部署云真机前后端
《Sonic 测试平台搭建 -- 设备接入》:sonic 设备接入
《ubuntu 设置环境变量》:ubuntu 设置环境变量
《Ubuntu 16.04 安装 64 位谷歌 Chrome 浏览器》:ubuntu 安装 chrome
《Ubuntu 查看 java 安装路径》:ubuntu 查看 java 安装路径