跳到正文

Development

为 Vagrant box 添加版本管理

了解如何借助 Vagrant Cloud 为 Vagrant box 实现规范的版本管理。这份分步指南涵盖从配置 Vagrantfile 到发布带版本号的 box 的完整流程,帮助你在团队和项目之间保持一致的开发环境。

阅读约需 4 分钟

概述

在摸索了一番 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 的改动加入了版本管理功能。你主要需要关注以下两项:

  1. config.vm.box_version

    要使用的 box 版本。该版本需要与 Vagrant Cloud 上某个“已发布(Released)”的版本相匹配

  2. 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。

  1. 在主导航栏中选择“Create Box”。

  2. 填写 box 的基本信息。

    • 在我的例子中,我将 box 命名为“precise64”。
    • 由于这个 box 将存放在我的开发 Web 服务器上,我还会把它设为私有。
    • 填写你认为必要的其他信息。
    • 点击“Create box”按钮。
  3. 下一步是定义 box 的版本。

    • Vagrant 推荐使用语义化版本,因此请为你的 box 填写一个版本号。
    • 如果愿意,可以填写一段描述。
    • 点击“Create version”按钮。
  4. 接下来,我们要为正在定义的 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”按钮。
  5. 接下来会提示你编辑该版本。如果觉得需要修改之前填写的内容,可以在此修改。这个页面上最重要的是绿色的“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。

分享