请注意:,尽管我在这个问题中提到了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
合并到我的上述仓库中的典型“流程”,以便开发人员可以:看一看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应用程序。
ubuntu/trusty64
,因为我每天都在使用它。所有命令应易于转换为其他发行版。 vagrant init ubuntu/trusty64
。这将为您创建一个基础Vagrantfile。 config.vm.network "forwarded_port", guest: 5000, host: 8080
。我们希望端口8080带我们到客户机上的端口5000。提示:对于您的项目,明智的选择一个最有可能尚未使用的端口,以避免与其他应用程序冲突。 8080可能是错误的选择,而8089则更好。 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所在的目录)中的所有文件和目录。 app.py
注意:&使应用程序派生到后台,以便
vagrant up
可以完成。您可能会想用您的应用做比这更花哨的事情。config.vm.provision :shell do |shell|
shell.inline = "/vagrant/app.py &"
end
vagrant up
。 Hello Vagrant Provisioned World!
。 这将照顾您的应用程序的配置。您可以使用Vagrantfile自动提交项目代码。
现在进入您的初始步骤,以及如何适应。
集成到您的开发工作流程中
我正在列出您与Vagrant集成的步骤。
此步骤保持不变,除了回购中包含的Vagrantfile(为项目所需的任何必需的库和工具进行配置)之外。
vagrant up
。这将自动创建并配置该框,并与该框共享您的项目。 由于您的项目是在主机和来宾之间实时共享的。您只需停止该应用程序(如果正在运行),然后在来宾上再次运行该应用程序即可。无需复制。
这将为您提供快速的开发周期,同时保持环境不变。新开发人员只需克隆和
vagrant up
即可继续进行该项目,而无需担心环境和其他问题。持续集成是一个巨大的话题。您仍然可以将实践应用于仓库等。但是在开发过程中,我将跳过CI部署过程。我在CI部署中使用了Jenkins和Capistrano,但是对于开发而言,它的负担太重了。在生产环境中,我不会使用Vagrant,因为它已经对虚拟机进行了双重虚拟化(除非您运行裸机)。为了进行生产,我将使用Docker和Fig。
我希望这说明了如何将Vagrant集成到您的项目流程中,如果需要澄清,请发表评论。我相信该示例应该措辞完美,因为这是使用Vagrant的目标。
关于vagrant - 向Vagrant热部署应用程序构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28117530/