初识Chocolatey(巧克力)
之所以能与Chocolatey相遇,是因为它能作为Puppet的Package Resource Provider去部署Windows程序。之前,使用Puppet部署Windows软件,我必须使用File Resource把安装包从Puppet master下载到本地,然后使用Package Resource去安装该软件,Package Resource依赖于File Resource。这样做,有几个坏处。第一个坏处是,安装包会始终保留在成千上万的系统上,造成存储资源浪费。第二个坏处是,已经安装了该软件的系统还要下载该安装包,造成网络资源的浪费。第三个坏处是,如果这个安装包比较大,而且不止它一个,那么编写的Puppet Module会很大而不利于分享。第四个坏处是,当软件需要升级的时候,前面的痛苦又要经历一遍。
介绍
Chocolatey是Windows系统上的软件包管理器。如果你熟悉Linux,你一定对apt或者yum不陌生,他们是Ubuntu和CentOS的包管理器,它们提供给你的便利让Windows用户羡慕已久。Chocolatey是Windows系统上的yum,它使得在Windows系统上安装、卸载和升级软件如巧克力(Chocolatey)般丝滑。
Chocolatey采用经典的C/S(客户端/服务器)架构,所以即便没有接触过apt或者yum,也能脑补出它是如何工作的。一个所谓的Chocolatey Server坐镇中央,无数个Chocolatey Client分布在各色Windows系统之上,例如Windows 10,Windows Server,Windows Container等等。
这个所谓的Chocolatey Server,称之为Chocolatey Package Repository,也是要在客户端上配置的“源”(Source)。Chocolatey客户端通过这个“源”来下载所需要的安装包,默认的源是公开的Chocoatey Community源,还可以添加其它的源,包括本地源,也可以禁止或删除任何一个源。
安装Chocolatey客户端
Chocolatey官网提供很多种方法安装Chocolatey客户端,例如CMD安装,PowerShell安装,Puppet安装,NuGet安装,离线安装等等。并且列出了常见的安装问题以及解决方案,非常贴心。一开始试水,我就拿PowerShell来安装客户端。
第一步:以管理员的身份打开PowerShell的控制台。注意:登录系统的用户是管理员,打开的PowerShell控制台不一定拥有管理员的权限,需要提升权限。
第二步:设置PowerShell的ExecutionPolicy为Bypass或者AllSigned。
Set-ExecutionPolicy Bypass -Scope Process -Force
第三步:启用TLS 1.2
[System.Net.ServicePointManager]::SecurityProtocol =[System.Net.ServicePointManager]::SecurityProtocol -bor 3072
第四步:下载并安装
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
第五步:测试
如果安装成功,在CMD或者PowerShell控制台里,运行choco -?会打印出帮助说明和版本信息。
choco -?
使用场景
当Chocolatey客户端装好之后,你一定迫不及待的想尝试一下,用它装个软件吧,比如7zip。那么我就拿7zip举个例子,演示Chocolatey是如何安装软件的。
软件查询
首先,运行choco search 7zip命令来查询与7zip相关的安装包。
还可以运行choco search 7zip -a命令来列出所有版本的7zip。
软件安装
假如 7zip 15.05是期望安装的版本,那么运行命令choco install 7zip --version 15.05。 (这里使用老一些的版本,后面可以用来演示“软件升级”的功能。)
软件升级
假如需要升级7zip到最新版本,那么运行命令choco upgrade 7zip -y。
软件卸载
假如需要卸载7zip,那么运行命令choco uninstall 7zip.install -y -f。
总结
Chocolaty包管理器使得Windows系统上的自动化更加顺滑。
- 用户无需再关心软件包的下载地址,安装细节,以及依赖关系,只需要知道软件名称。
- 提高了自动化脚本的可读性,降低了它的复杂度。例如,在CI/CD pipeline中,或者在自动化测试脚本中,安装软件的几十行代码可以用简单的一条命令代替。
- 减少了组织内部的重复工作,节约了成本。一个大的研发组织内,可能有多个生产线开发各自的代码去安装同一个软件,而且同一个安装包可能被复制到了多个已经被遗忘的文件夹中,这是人力资源的浪费,存储资源的浪费。如果有这样的包管理器,那么安装包可以在组织内无限分享,节约了开发成本和存储资源。
参考
[1] https://chocolatey.org/docs/installation how to install
[2] https://chocolatey.org/docs/how-to-setup-internal-package-repository#architecture Architecture