原文作者:medium.com/@gaojiji
发布时间:2019年06月22日-5分钟阅读
容器化方便服务部署和环境隔离。Docker是一个很流行的,适用于Linux。Docker也有Mac版本,但它只提供Linux容器环境,不提供macOS,不能用于iOS项目建设。Docker for mac只是在mac上运行一个Linux虚拟机,然后在里面使用docker)。
简单来说,容器化只是一个一次性的轻量级虚拟机(VM)。传统的mac上的虚拟机,比如Parallel Desktop,并不是为这个设计的。然后Anka来找我。Anka来自Veertu,起源于基于原生框架的macOS的轻量级虚拟机。Anka的官方定位是 "iOS CI和Devops的macOS云"。这和我想要的略有不同,一个类似docker的工具,我可以创建系统镜像,运行一次性实例。(对于docker,我也是个初学者)
这个官方文件不是很清楚。这里简单介绍一下。
安卡简介
安卡建设
你会接触到的第一个工具是Anka Build。它提供了创建、运行、管理虚拟机的核心虚拟机功能和命令行工具,就像docker的'docker'命令一样。
你可以用这个命令创建你的第一个虚拟机。(在此之前,你应该在App Store下载系统安装程序)
anka create - ram-size 4G - cpu-count 2 - disk-size 60G - app /Applications/Install macOS/Mojave.app VM_NAME
然后,在名为VM_NAME的虚拟机中运行命令。
anka run VM_NAME whoami
这个命令将打印anka
,即虚拟机的默认用户。这是最像docker的部分。第一次运行anka run
对某个虚拟机来说,启动需要一段时间,因为下面只是一个普通的虚拟机,启动需要时间。这个虚拟机会一直在后台运行,所以后面的时候运行命令会即时执行。你可以使用启动/停止/暂停
来手动操作虚拟机实例。
安卡运行会自动将当前路径挂载到虚拟机中,所以输入数据非常方便。你可以指定-n
来禁用它)。
由于它只是一个普通的虚拟机,你可以使用anka view VM_NAME
来打开虚拟机的GUI桌面。
安卡注册表
安卡注册中心就像git的git服务器一样,你可以把你的虚拟机推送到服务器上,别人可以拉。在做这个事情之前,你应该先准备好服务器。由于anka是一个新工具,你应该创建自己的anka注册表服务器。一般来说,你应该有一台服务器机器,然后运行anka服务器的docker镜像即可。详细的步骤在doc这里列出,你应该仔细按照它来做。(Anka Registry和Anka Controller是两个东西,但由脚本一起安装)。
就像git repo add
一样添加注册表服务器。
anka registry add MY_SERVER XX.XXX.XXX.XXX
现在你在本地机器上有了虚拟机,然后用anka push VM_NAME
推送到服务器上。
但是等等! 提交步骤在哪里?似乎anka没有独立的方法来创建镜像,或者说提交。提交是在推送的同时完成的。
anka registry push VM_NAME [tag] -d [description]
如果VM_NAME是分支,那么标签/描述就是提交的标题/描述。你可以使用anka注册表列表
来列出远程虚拟机,但它只显示虚拟机名称和最新的标签。历史记录是隐藏的。在Anka Controller部分,你可以通过网页查看服务器上的历史记录)。
如果你推送了暂停状态的虚拟机,它也会保存状态。这意味着,当从服务器上拉下虚拟机时,你会得到一个暂停状态的虚拟机。这个状态可以在几秒钟内启动,这可以加快第一次anka run
的速度。这个官方称为INSTANT BOOT。
就像git一样,anka会做增量推送和拉动。如果你打开虚拟机,做了一些修改,比如安装了Xcode,然后停止虚拟机,就可以把这个状态推送为这个虚拟机的另一个版本。在这背后,anka似乎将一个镜像视为对另一个镜像的修改,并保存在单独的文件中(~/Library/Application Support/Veertu/Anka
)。即使如此,由于只是传统的虚拟机,上传的大小还是太大。裸系统大概15GB,Xcode额外10多GB,暂停状态可能需要上百MB。考虑到只拉一次,可以接受,但不讨喜。
安卡控制器
安卡还有一个部分:安卡控制器。它是anka云的主管。它接受来自RESTful API的命令,将镜像从Registry部署到Node(读取机),并通过输入脚本运行VM。它还提供了一个现成的Jenkins插件来快速集成。Anka控制器还提供了一个仪表盘网页。这个url描述了详细的功能。
获取一次性环境
anka工具没有提供明确的指导来创建一个一次性环境,比如为docker镜像运行一个实例。我们处理的都是关于传统的虚拟机(除了anka run
)。对于用户来说,没有镜像的概念。它有类似git的管理,但没有git重置。
最后,我找到了'anka clone'命令,它可以满足我们的要求,用一种不那么直接的方式。
首先,准备好你的虚拟机,并推送到注册表,它可以作为一个镜像。然后把虚拟机拉到真正的机器上,它将在上面运行。用anka clone VM_NAME new_name
克隆它,由于它只是一个影子,所以会立即完成。用anka run new_name
运行你的工作,然后在完成后删除新的VM。
性能测试
我在我的黑客机上用xcodebuild编译了'ComponentKit'pod(9900K(8核16线程)32G内存)。
VM:8核16线程16G内存:79秒67秒70秒,平均72秒。
本地人:53秒54秒54秒,平均54秒。
同时运行2个构建。对于虚拟机,同时启动2个虚拟机即可。
VM:8核8线程16G RAM:130s 127s 128s,avg 128
原生:117秒99秒84秒87秒,平均96秒。
这两个测试的结果都是VM慢了33%。
讨论
结果似乎令人沮丧。除了稳定性之外,我们对iOS CI一直面临的问题就是构建速度慢。我们在一两年前就买了昂贵但当之无愧的Mac Pro用于编译,因为没有更好的机器。每项工作需要几十分钟是很正常的事情,工程师有时候只能等着继续工作。33%的速度慢的有点让人无法接受。 还有其他问题。循序渐进的方式是我需要的:在一台真机上只运行一次虚拟机。固定的虚拟机配置可能会限制性能,比如在8核cpu的机器上给虚拟机设置2核cpu。虽然你可以在运行命令前修改虚拟机与主机的环境这样。
anka modify VM_NAME set cpu 8
anka modify VM_NAME set ram 16G
但它要求虚拟机停止,那么你就失去了即时启动。其他的小问题也是存在的,比如当不安全关闭时,虚拟机就会损坏。 另外,anka的价格有点贵。官网没有提到商业授权的价格。但有人在微博说,每cpu核每年要几百元。甚至比主机硬件还要贵。 总之,anka试图为macOS环境提供类似dock的管理。它满足了我们的基本需求,但由于传统的VM技术背景,并没有很好的完成它。由于性能的损失和高昂的价格,我可能会放弃这个解决方案。
通过www.DeepL.com/Translator(免费版)翻译