热部署应用程序构建到Vagrant

时间:2015-01-23 19:43:57

标签: 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,我通常会克隆这个repo并运行gradle clean build来对代码运行单元测试,最终将其打包成一个正在运行的程序(可执行的JAR)。然后gradle run启动应用。

好吧,在很多GitHub回购中,我看到Vagrantfile已经提交了。所以显然这是为了简化虚拟机并在其中运行相应的应用程序。我试图找出将Vagrantfile合并到我的仓库中的典型“流程”,以便开发人员可以:

  1. 克隆回购
  2. 使用Gradle构建
  3. 不知何故,部署到Vagrant框
  4. 测试正在运行的应用实例(在框内运行)
  5. 使用热重新部署调整代码}#4,#5和#6快速/快速开发 - 测试 - 调整周期
  6. 重新测试
  7. 看看this Vagrantfile for a CAS server(随机选择)。我认为这就是魔术发生的地方,就在盒子上部署和重启服务器而言,但是我检查了shell.inline的Vagrant文​​档并且没有具体的内容出现。

    所以我问:如何将我的Vagrantfile与我的构建“集成”,以便构建生成已部署的正在运行的应用程序?此外,我的run / deploy-test-code-redeploy周期与Vagrant框(我称之为“热部署”)的内容是什么样的?

1 个答案:

答案 0 :(得分:3)

我将解释如何实现您的目标,这可能不是正式的方式,所以任何有更多流浪体验的人都应该提供有关可以改进的地方的指示。我现在和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|

配置是第一次运行时设置Vagrant框的过程。除非强制,否则供应仅对新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文​​件了。我将保持样本简单,使其通用。

创建Vagrantfile

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

  1. 从可用的Vagrant框中选择您喜欢的发行版。我将使用ubuntu/trusty64,因为我每天都会使用它。所有命令都应该很容易翻译成其他发行版。
  2. 为项目创建一个新目录,并在其中打开一个shell / console窗口。
  3. 使用控制台,初始化您的Vagrant框vagrant init ubuntu/trusty64。这将为您创建一个基本的Vagrant文​​件。
  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应用程序作为示例。从this Gist将其下载到您的项目目录,并将其命名为app.py

  7. 现在我们可以运行位于项目目录中的Python应用程序了。我喜欢分开安装部分和运行部分。所以添加另一个启动应用程序的部分。 注意:&amp;使应用程序分叉到后台,以便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!
  10. 负责配置您的应用。从Vagrantfile自动,您可以使用项目代码提交。

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

    集成到您的开发工作流程

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

    1. 克隆回购 此步骤保持不变,但您的仓库中包含的Vagrantfile除外,其中包含项目所需的任何所需库和工具的配置。
    2. 在项目目录中运行vagrant up。这将自动创建和配置框并与框共享您的项目。
    3. 您可以在Vagrant配置步骤中构建项目,但如果您正在积极开发应用程序,则可能不希望这样做。
    4. 测试正在运行的应用程序实例(在框内运行) - 只需在框中输入SSH,输入`/ vagrant&#39;目录并运行您的应用程序。
    5. 使用热重新调配来调整代码}#4,#5和#6快速/快速开发 - 测试 - 调整周期 由于您的项目在主持人和访客之间实时共享。你可以简单地停止应用程序(如果正在运行)并再次在访客上运行应用程序。无需复制。
    6. 重新测试
    7. 这将为您提供快速开发周期,同时保持环境相同。新开发人员可以简单地克隆并vagrant up来开始项目,而不必担心环境等等。

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

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