为 Vagrant box 添加版本管理
了解如何借助 Vagrant Cloud 为 Vagrant box 实现规范的版本管理。这份分步指南涵盖从配置 Vagrantfile 到发布带版本号的 box 的完整流程,帮助你在团队和项目之间保持一致的开发环境。
概述
在摸索了一番 Vagrant 的版本管理功能后,我决定写这篇教程,供第一次尝试的朋友参考。关于这项功能及其用法的文档少而零散。如果你有任何改进建议,欢迎告诉我。
Vagrant
Vagrant 是一款用于构建完整开发环境的工具。凭借易用的工作流和对自动化的专注,Vagrant 缩短了开发环境的搭建时间,提高了开发环境与生产环境的一致性,让“在我的机器上能跑”这种借口成为历史。
Vagrant Cloud
Vagrant Cloud 是一个用于分享、发现和创建 Vagrant 环境的平台。目前 Vagrant Cloud 尚处于 beta 阶段。
使用自定义 box 或现有 box
要跟着本教程操作,建议先准备好一个 box。你可以使用现有的 box,也可以创建自定义 box。无论是新建还是使用现有的 box,都不需要为实现版本管理而对 box 做任何特殊处理。
在本教程中,我将使用一个之前用 Packer 为 Ubuntu 创建的 box。所用模板的示例可以在我的 GitHub 项目 skoblenick/packer-examples 中找到。
在 Vagrantfile 中添加版本
Vagrant 1.5.0 及以上版本对 Vagrant API 的改动加入了版本管理功能。你主要需要关注以下两项:
config.vm.box_version
要使用的 box 版本。该版本需要与 Vagrant Cloud 上某个“已发布(Released)”的版本相匹配
config.vm.box_check_update
如果设为 true,Vagrant 会在每次执行 vagrant up 时检查所配置 box 的更新
你的 Vagrantfile 中会有类似下面的内容:
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.require_version ">= 1.5.2"
Vagrant.configure("2") do |config|
config.vm.box = "skoblenick/precise64"
config.vm.box_version = "1.0.0"
config.vm.box_check_update = true
config.vm.provider "vmware_fusion" do |v, override|
v.gui = false
end
end
此时运行 Vagrant 会失败。Vagrant 将找不到“skoblenick/precise64”,因此你会收到 404 Not Found 错误。
Box 命名空间
在 Vagrant 1.5.0 之前,box 通常通过本地文件路径或指向托管 box 的 HTTP URL 来引用。
Vagrant 1.5.0 引入了命名空间,其格式类似于“<vagrantcloud_user>/<box_name>”。你可以把它看作一个别名,Vagrant 会通过查询 Vagrant Cloud 将其解析为 HTTP URL。这并不意味着你的 box 必须存储在 Vagrant Cloud 上。在大多数情况下,Vagrant Cloud 上存储的只是定义该 box 的元数据。
在 vagrantcloud.com 上创建账号
你需要在 Vagrant Cloud 上创建一个账号。注册流程非常简单,这里就不逐步介绍了。账号创建并验证后,登录即可。
在 Vagrant Cloud 上定义 box
由于 Vagrant Cloud 尚处于 beta 阶段,这里介绍的步骤将来可能会有变化。以下步骤将创建一个新的 box。
在主导航栏中选择“Create Box”。
填写 box 的基本信息。
- 在我的例子中,我将 box 命名为“precise64”。
- 由于这个 box 将存放在我的开发 Web 服务器上,我还会把它设为私有。
- 填写你认为必要的其他信息。
- 点击“Create box”按钮。
下一步是定义 box 的版本。
- Vagrant 推荐使用语义化版本,因此请为你的 box 填写一个版本号。
- 如果愿意,可以填写一段描述。
- 点击“Create version”按钮。
接下来,我们要为正在定义的 box 添加所支持的 provider
- 点击“Create new provider”按钮。
- 输入 provider 的名称。我使用的是 VMware Fusion,因此输入“vmware_desktop”。
- 点击“URL”按钮。
点击 URL 按钮后,会显示一个用于填写 box URL 的输入框,以及一个用于添加 provider 的按钮。 - 输入 box 的 URL。在我的例子中,我输入的是
http://localhost/boxes/precise64-1.0.0_vmware.box。 - 点击“Create provider”按钮。
接下来会提示你编辑该版本。如果觉得需要修改之前填写的内容,可以在此修改。这个页面上最重要的是绿色的“Release now”按钮。
- 点击“Release now”按钮。这不会将 box 公开,但会将其状态设为 active,从而让我们添加为协作者的用户可以开始使用这个 box。作为 box 的创建者,我们不需要把自己添加为协作者。
在下载 box 之前,别忘了我把 box 设成了私有。在这种设置下,还需要多做一步:必须让 Vagrant 知道使用哪个用户登录 Vagrant Cloud。
vagrant login
如果创建的是公开 box,则不需要这一步。但如果你像上面那样创建了私有 box,就需要在将要运行 Vagrant 的终端中执行以下命令。
username$ vagrant login
In a moment we'll ask for your username and password to Vagrant Cloud.
After authenticating, we will store an access token locally. Your
login details will be transmitted over a secure connection, and are
never stored on disk locally.
If you don't have a Vagrant Cloud account, sign up at vagrantcloud.com
Username or Email: user@example.com
Password (will be hidden):
You're now logged in!
vagrant up
最后,我们可以在终端中运行 vagrant up,box 将被下载、克隆并启动。或者,也可以只通过 vagrant box add skoblenick/precise64 添加该 box。