我有一些服务,每个服务都在自己的Git存储库中。
每项服务都是独立的,并且彼此独立运行。
我希望它们在同一个VM中运行。
如何使用Vagrant设置包含这些服务的共享开发环境?
(请注意,我希望避免每个repo创建一个Vagrantfile。)
答案 0 :(得分:0)
创建一个自定义cookbook / puppet清单或shell配置程序,它将检出单个git存储库并运行该服务。
可以找到Vagrant中配置程序的更多详细信息/配置选项 这里
https://www.vagrantup.com/docs/provisioning/basic_usage.html
答案 1 :(得分:0)
最简单的方法就是设置Beaker。在Puppet Forge上找到一个成熟的模块以获得指导。您需要spec/spec_helper_acceptance.rb
,spec/acceptance/nodesets/default.yml
,并且您需要从Gemfile
选择Gems的系统测试。
现在创建一个文件spec/acceptance/yourclass_spec.rb
,让它只是应用你的类来按照你想要的方式配置VM。
要解决多个git仓库中多个项目的需求,您可以在spec/spec_helper_acceptance.rb
内安装所有项目。
或者,您可以设置.fixtures.yml
和puppetlabs_spec_helper
,并在规范帮助程序中运行bundle exec rake spec_prep
。
为了解决这个问题,请克隆一些Forge模块,例如puppetlabs/apache
。
bundle install
export BEAKER_destroy=no
bundle exec rspec spec/acceptance/some_spec.rb
测试完成后,您可以登录虚拟机。
这是一个学习曲线,但这种方式意味着您有一种快速配置VM的方法,您也可以正确测试它们。
Beaker甚至可以启动多个虚拟机,以便您可以在需要时将所有服务一起运行。
答案 2 :(得分:0)
也许我想念一些东西,但听起来你可以运行一个虚拟机,只使用不同文件夹的共享文件夹和你正在使用的服务。
共享文件夹可以采用绝对路径(不仅仅是您定义Vagrantfile的当前项目中的相对文件),因此您可以混合使用
等文件夹Vagrant.configure(2) do |config|
config.vm.box = xxx
blablabla
config.vm.synced_folder "/Users/fhenri/project/service1", "/project/service1"
config.vm.synced_folder "/Users/fhenri/project/examples/service2", "/project/service2", type: "nfs"
config.vm.synced_folder "/Users/fhenri/project/ruby/service3", "/opt/rubyservice"
因此,在配置此VM时,您可以配置每项服务。当文件夹与项目源共享时,您在原始文件夹中所做的任何更改都将在VM上同步
您还可以在此单个Vagrant文件中定义多台计算机,并在每台计算机中都有一个共享文件夹
缺点:您无法真正共享此Vagrantfile,因为绝对路径主要与您自己的设置对齐(您可以使用user_variable等等但不理想)
答案 3 :(得分:0)
一种方法是使用Vagrant和Git子树从单个仓库中引用和签出外部组件。
假设我们有三个不同的repos,service-auth,service-notifier和core,每个都包含我们想要配置的组件。
我们将创建一个回购,例如dev-env,包含Vagrantfile和每个外部repo的一个子树。 Vagrant文件如下所示:
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(2) do |config|
config.vm.box = “ubuntu/trusty64”
config.vm.network :forwarded_port, host: 8080, guest: 8080 # core
config.vm.network :forwarded_port, host: 8081, guest: 8081 # service-auth
config.vm.network :forwarded_port, host: 8181, guest: 8181 # service-notifier
end
(我们假设我们的组件将侦听不同的TCP端口。)
然后,我们将使用git subtree
添加,更新和推送我们的组件。
根据您的项目特点和团队的组织,此解决方案可能适合与否。
我已经写了an article,详细说明了如何为此目的配置和使用子树。