3

请注意:虽然我在这个问题中提到了 Gradle/Groovy,但这完全是关于 Vagrant 的使用,并且可以很容易地应用于任何其他语言/构建系统。

我是Vagrant的新手,我试图弄清楚Vagrantfile当被推送到源代码控制时,s 如何与该 repo 的构建进行交互。

假设我有以下由 Gradle 构建的 repo:

src/
    main/
        groovy/
            <lots of groovy source>
    test/
        groovy/
            <lots of groovy test source>
build.gradle
settings.gradle

现在假设,如果没有 Vagrant,我通常会克隆这个 repo 并运行gradle clean build以对代码运行单元测试,并最终将其打包成一个正在运行的程序(可执行 JAR)。然后gradle run启动应用程序。

好吧,在很多 GitHub 存储库中,我看到了Vagrantfiles 已提交。所以很明显,这是为了让启动 VM 并在其中运行相应的应用程序变得容易。我试图弄清楚将 aVagrantfile合并到我上面的仓库中的典型“流程”,以便开发人员可以:

  1. 克隆仓库
  2. 使用 Gradle 构建
  3. 不知何故,部署到 Vagrant 盒子
  4. 测试正在运行的应用实例(在盒子内运行)
  5. 调整代码 } #4、#5 和 #6 使用热重新部署的快速/快速开发测试调整周期
  6. 重新测试

看看这个VagrantfileCAS 服务器(随机选择)。我认为这就是魔法发生的地方,就在盒子上部署和重新启动服务器而言,但我检查了 Vagrant 文档shell.inline并没有发现任何具体内容。

所以我问:我如何将Vagrantfile我的构建与我的构建“集成”,以便构建生成一个已部署的、正在运行的应用程序?此外,我的运行/部署-测试-代码-重新部署周期在 Vagrant 盒子中是什么样的(我称之为“热部署”)?

4

1 回答 1

3

我将解释我将如何实现您想要做的事情,这可能不是官方的方式,所以任何有更多 Vagrant 经验的人都应该提供有关可以改进的地方的指示。我已经和 Vagrant 一起工作了大约 6 个月。你说你是 Vagrant 的新手,所以我会尽可能完整,即使你可能已经掌握了一些部分,但可能对其他用户有用。

tl;博士; 如果您已经熟悉 Vagrantfile 的工作原理,请跳至创建 Vagrantfile 部分

让我们从Vagrantfile的示例开始。

config.vm.box = "puppetlabs/centos-6.5-64-puppet"

这告诉 Vagrant 拉开构建其他一切的盒子。你可以在Vagrant Cloud上找到很多官方和社区贡献的盒子。这个来自 puppetlabs,基于已安装 Puppet 的 CentOS 6.5 64 位。

config.vm.network "forwarded_port", guest: 8080, host: 8088

这告诉 Vagrant 将主机上的 8088 端口转发到 Vagrant 盒子上的 8080。因此,在您的主机上访问http://127.0.0.1:8088将访问来宾上的 8080 端口。

config.vm.provision :shell do |shell|

Provisioning 是第一次运行 Vagrant box 时设置它的过程。除非强制,否则配置只会为新 VM 运行一次。请参阅Basic Usage Vagrant Docs的配置部分。这个特别是在配置时执行一堆 shell 命令。

shell.inline = "command;
                command;"

Shell inline 将这些以分号分隔的命令发送到盒子。这是为了自动执行命令,就像您自己在 SSH 会话中键入它们一样。Vagrant Docs on Shell Provisioning有一些更高级的用途,您可以在其中定义要执行的实际文件。注意:您的 shell 脚本不应尝试执行尚未安装的工具。(例如,在 Python 尚不可用的情况下运行 Python 脚本)。

config.vm.provision "puppet" do |puppet|

我不能对 Puppet 部分发表太多评论,因为我不是 Puppet 用户(可能还不是)。这是设置一些 Puppet 值。

shell.inline = "cd /vagrant && mvn clean package;
                  sudo cp target/cas.war /srv/tomcat/cas/webapps/;
                  sudo /sbin/service tomcat-cas restart"

这也是执行 shell 命令。基本上是更改目录,清理,将 cas.war 复制到 webapps 目录,然后重新启动服务。稍后将详细介绍/vagrant共享文件夹。现在我们已经足够开始构建我们自己的 Vagrant 文件了。我将保持示例简单以使其通用。

创建 Vagrant 文件

您很可能希望在已经满足您的要求的 Vagrant 盒子上进行构建,但现在,我们不要这样做。但是,您可以在Vagrant Cloud上找到很多已经创建的盒子。我将向您展示如何使用 Flask 运行(非常)简单的 Python 应用程序。

  1. 从可用的 Vagrant 框中选择您最喜欢的发行版。我打算ubuntu/trusty64使用它,因为我每天都在使用它。所有命令都应该很容易翻译到其他发行版。
  2. 为您的项目创建一个新目录并在其中打开一个 shell / 控制台窗口。
  3. 使用控制台,初始化你的 Vagrant box vagrant init ubuntu/trusty64。这将创建一个基本的 Vagrantfile 供您使用。
  4. 打开你的 Vagrantfile 并取消注释config.vm.network "forwarded_port", guest: 5000, host: 8080。我们希望端口 8080 将我​​们带到客户机上的端口 5000。提示:对于您的项目,明智的做法是选择一个很可能尚未使用的端口,以避免与其他应用程序发生冲突。8080可能是不好的选择,8089会更好。
  5. 让我们添加一些脚本以在配置时执行。由于 Python 随 Ubuntu(以及我知道的大多数其他软件)一起提供,我们不需要安装 Python,但我们确实需要 pip(Python 包管理器)和 Flask。

    config.vm.provision :shell do |shell|
        shell.inline = "cd /vagrant;
            sudo apt-get -y install python-pip;
            sudo pip install Flask;"
    end
    

    这会将目录更改为 Vagrant 共享。使用 Ubuntu 的包管理器安装 pip,然后使用 pip 安装 Flask。-y 标志是自动安装 apt-get 而不提示是/否问题。您可能需要运行Vagrant up --provision几次才能让所有命令 100% 正确。

    关于 Vagrant 共享的注意事项:Vagrant 共享是在主机和来宾计算机之间同步的目录,可在/vagrant. 它包括项目目录(Vagrantfile 所在的位置)中的所有文件和目录。

  6. 我们现在拥有运行应用程序所需的所有工具。我创建了一个非常简单的 Flask 应用程序作为示例。从此Gist将其下载到您的项目目录并命名app.py

  7. 现在我们将能够运行位于项目目录中的 Python 应用程序。我喜欢将安装部分和运行部分分开。所以添加另一个启动应用程序的部分。注意: & 使应用程序分叉到后台,以便vagrant up可以完成。你可能想用你的应用做一些比这更花哨的事情。

    config.vm.provision :shell do |shell|
      shell.inline = "/vagrant/app.py &"
    end
    
  8. 最后我们可以开始一切,让 Vagrant 发挥它的魔力。在您的控制台中,在您的项目目录中(您的 Vagrant 文件所在的位置)。运行vagrant up

  9. 关键时刻。打开浏览器(在主机上)并浏览到http://127.0.0.1:8080/。你应该看到Hello Vagrant Provisioned World!

这负责您的应用程序的配置。自动,从 Vagrantfile,你可以用你的项目代码提交。

现在开始你的初始步骤,以及它是如何适应的。

集成到您的开发工作流程中

我列出了与 Vagrant 集成的步骤。

  1. 克隆 repo 此步骤保持不变,除了您的 repo 中包含的 Vagrantfile 以及为您的项目所需的任何所需库和工具的配置。
  2. vagrant up在项目目录中运行。这将自动创建和配置 box 并与 box 共享您的项目。
  3. 您可以在 Vagrant 配置步骤中构建项目,但如果您正在积极开发应用程序,您可能不想这样做。
  4. 测试正在运行的应用程序实例(在盒子内运行) - 只需 SSH 进入盒子,进入 `/vagrant' 目录并运行你的应用程序。
  5. 调整代码 } #4、#5 和 #6 快速/快速的开发测试调整周期利用热重新部署因为您的项目在主机和来宾之间实时共享。您可以简单地停止应用程序(如果正在运行)并在来宾上再次运行该应用程序。无需复制。
  6. 重新测试

这将为您提供快速的开发周期,同时保持环境不变。新开发人员可以简单地克隆并vagrant up开始项目,而不必担心环境等等。

持续集成是一个广阔的话题。您仍然可以将这些实践应用于您的存储库等。但是我会在开发时跳过 CI 部署过程。我在 CI 部署中使用JenkinsCapistrano,但它对于开发来说太重了。在生产中我不会使用 Vagrant,因为它已经对你的虚拟机进行了双重虚拟化(除非你运行裸机)。对于生产,我将使用DockerFig

我希望这能解释如何将 Vagrant 集成到您的项目流程中,如果有任何需要澄清的地方,请发表评论。我相信样本应该用词完美,因为这是使用 Vagrant 的目标。

于 2015-02-02T20:45:45.903 回答