vagrant - 向Vagrant热部署应用程序构建

标签 vagrant virtualization deploying

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

我是Vagrant的新手,正在尝试弄清楚Vagrantfile在被推送到源代码控制时如何与该存储库的构建进行交互。

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

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

现在让我们说,如果没有Vagrant,我通常会克隆此存储库并运行gradle clean build来对代码进行单元测试,最终将其打包到正在运行的程序(可执行JAR)中。然后,gradle run启动该应用程序。

好吧,在很多GitHub仓库中,我看到Vagrantfile已提交。因此,显然,这是为了轻松启动虚拟机并在其中运行相应的应用程序。我试图弄清楚将Vagrantfile合并到我的上述仓库中的典型“流程”,以便开发人员可以:
  • 克隆仓库
  • 使用Gradle生成
  • 以某种方式,将其部署到Vagrant框
  • 测试正在运行的应用程序实例(在框内运行)
  • 使用热重新部署
  • 来调整代码}#4,#5和#6快速/快速dev-test-tweak周期
  • 重新测试

  • 看一看this Vagrantfile for a CAS server(随机选择)。我认为这就是在盒子上部署和重新启动服务器方面的神奇之处,但是我检查了Vagrant文​​档中的shell.inline,没有发现任何具体结果。

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

    最佳答案

    我将解释我将如何实现您的目标,这可能不是官方的方法,因此,凡是具有更多流浪者经验的人,都应提供可以改进的指南。我已经与Vagrant合作了大约6个月。您说您是Vagrant的新手,所以即使您已经掌握了某些部分,我也会尽可能地完善,但是对其他用户可能有用。

    tl; dr;如果您已经熟悉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|
    

    置备是在首次运行Vagrant框时对其进行设置的过程。除非强制执行,否则新虚拟机的配置仅运行一次。请参阅Basic Usage Vagrant Docs的配置部分。具体来说,这是在配置时执行一堆shell命令。
    shell.inline = "command;
                    command;"
    

    Shell内联命令会将这些命令(用分号分隔)发送到框。这是为了自动执行命令,就像您自己在SSH session 中键入命令一样。 Vagrant Docs on Shell Provisioning具有一些更高级的用法,您可以在其中定义要执行的实际文件。
    注意:您的Shell脚本不应尝试执行尚未安装的工具。 (例如,在Python尚不可用的情况下运行Python脚本)。
    config.vm.provision "puppet" do |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文​​件。我将使样本保持简单以使其通用。

    创建Vagrantfile

    您很可能希望在已经符合您的要求的Vagrant框上构建,但是就目前而言,我们不要这样做。但是,您可以在Vagrant Cloud上找到许多已经创建的框。我将向您展示如何使用Flask运行(非常)简单的Python应用程序。
  • 从可用的Vagrant框中选择您喜欢的发行版。我将使用ubuntu/trusty64,因为我每天都在使用它。所有命令应易于转换为其他发行版。
  • 为您的项目创建一个新目录,并在其中打开一个shell /控制台窗口。
  • 使用控制台初始化Vagrant框vagrant init ubuntu/trusty64。这将为您创建一个基础Vagrantfile。
  • 打开您的Vagrantfile并取消注释config.vm.network "forwarded_port", guest: 5000, host: 8080。我们希望端口8080带我们到客户机上的端口5000。提示:对于您的项目,明智的选择一个最有可能尚未使用的端口,以避免与其他应用程序冲突。 8080可能是错误的选择,而8089则更好。
  • 让我们添加一些脚本以在配置上执行。由于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所在的目录)中的所有文件和目录。
  • 我们现在拥有运行应用程序所需的所有工具。我创建了一个非常简单的Flask应用程序作为示例。从this Gist将其下载到您的项目目录,并将其命名为app.py
  • 现在,我们将能够运行您项目目录中的Python应用程序。我喜欢将安装部分和运行部分分开。因此,添加另一个启动应用程序的部分。
    注意:&使应用程序派生到后台,以便vagrant up可以完成。您可能会想用您的应用做比这更花哨的事情。
    config.vm.provision :shell do |shell|
      shell.inline = "/vagrant/app.py &"
    end
    
  • 最后,我们可以开始一切,让Vagrant发挥其魔力。在控制台的项目目录中(Vagrant文​​件所在的位置)。运行vagrant up
  • 关键时刻。打开浏览器(在主机上)并浏览到http://127.0.0.1:8080/。您应该看到Hello Vagrant Provisioned World!

  • 这将照顾您的应用程序的配置。您可以使用Vagrantfile自动提交项目代码。

    现在进入您的初始步骤,以及如何适应。

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

    我正在列出您与Vagrant集成的步骤。
  • 克隆仓库
    此步骤保持不变,除了回购中包含的Vagrantfile(为项目所需的任何必需的库和工具进行配置)之外。
  • 在项目目录中运行vagrant up。这将自动创建并配置该框,并与该框共享您的项目。
  • 您可以在Vagrant设置步骤中构建项目,但是如果您正在积极开发应用程序,则可能不希望这样做。
  • 测试正在运行的应用程序实例(在框内运行)-只需在该框中SSH,输入`/ vagrant'目录并运行您的应用程序即可。
  • 使用热重新部署来调整代码}#4,#5和#6快速/快速dev-test-tweak周期
    由于您的项目是在主机和来宾之间实时共享的。您只需停止该应用程序(如果正在运行),然后在来宾上再次运行该应用程序即可。无需复制。
  • 重新测试

  • 这将为您提供快速的开发周期,同时保持环境不变。新开发人员只需克隆和vagrant up即可继续进行该项目,而无需担心环境和其他问题。

    持续集成是一个巨大的话题。您仍然可以将实践应用于仓库等。但是在开发过程中,我将跳过CI部署过程。我在CI部署中使用了JenkinsCapistrano,但是对于开发而言,它的负担太重了。在生产环境中,我不会使用Vagrant,因为它已经对虚拟机进行了双重虚拟化(除非您运行裸机)。为了进行生产,我将使用DockerFig

    我希望这说明了如何将Vagrant集成到您的项目流程中,如果需要澄清,请发表评论。我相信该示例应该措辞完美,因为这是使用Vagrant的目标。

    关于vagrant - 向Vagrant热部署应用程序构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28117530/

    相关文章:

    django - "yum install django"会覆盖现有的 django 版本吗

    virtualization - 虚拟化环境中的英特尔 SGX

    windows - 从 Mac OSX 将 Qt 项目部署到 Windows

    java - 在 tomcat 7 上部署一个处于 openshift 中的 java-ee 应用程序

    macos - 权限错误通过 osx 上的 vagrant 通过 Chef 通过 Homebrew 软件安装 ruby

    macos - 将本地编辑器与 Vagrant 一起使用

    .net - Powershell Get-SCVirtualDiskDrive 生成​​公共(public)语言规范 (CLR) 错误

    ruby-on-rails -/usr/bin/env : ruby. exe: 没有那个文件或目录

    laravel - 使用带有 vagrant + homestead 的 virtualbox 在虚拟机上缓慢文件上传

    VMWare - 虚拟操作系统静态 IP 地址