forked from travis-ci/travis-cookbooks
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Vagrantfile
128 lines (100 loc) · 4.16 KB
/
Vagrantfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# -*- mode: ruby -*-
# vi: set ft=ruby :
require 'yaml'
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Enable Vagrant plugins like vagrant-cachier and vagrant-vbguest
if Vagrant.has_plugin?("vagrant-cachier")
config.cache.scope = :box
end
# if Vagrant.has_plugin?("vagrant-vbguest")
# config.vbguest.auto_update = true
# end
# VM tuning hints:
# - A big VM (RAM > 1024M) is recommended to speed up compilation/install time
# - A small VM (RAM < 1024M) is usually enough to verify a little set of isolated cookbooks
config.vm.provider "virtualbox" do |vb|
vb.memory = 2048
vb.cpus = 4
end
config.vm.provider "vmware_fusion" do |v|
v.vmx["memsize"] = 2048
v.vmx["numvcpus"] = 2
end
# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false
# The Travis CI Linux worker is currently based on Ubuntu 12.04 64bit
# Pending: Refer to a basebox with Linux Kernel pinned on version 2.6
config.vm.define :precise64, primary: true do |ubuntu|
ubuntu.vm.box = "ubuntu/precise64"
end
# Work in Progress: Support of Ubuntu 14.04 64bit (not supported yet)
# Pull requests are welcome on https:/travis-ci/travis-cookbooks/tree/ha-feature-trusty branch
config.vm.define :trusty64, autostart: false do |ubuntu|
ubuntu.vm.box = "ubuntu/trusty64"
end
# Work in Progress: Support of Windows 8 (not supported yet)
config.vm.define :win8, autostart: false do |win|
win.vm.box = "win8"
win.vm.communicator = "winrm"
win.vm.guest = :windows
# Port forward WinRM and RDP
win.vm.network :forwarded_port, guest: 3389, host: 3389
win.vm.network :forwarded_port, guest: 5985, host: 5985, id: "winrm", auto_correct: true
win.vm.provider "virtualbox" do |v|
v.gui = true # not necessary, but I like spying on Windows while I'm getting things figured out
end
end
%w(precise trusty).each do |rel|
template_config config, rel, 'vm_templates'
end
end
# configure VM based on templates
def template_config(config, release, templates_dir)
templates = Dir.glob(File.join(templates_dir, "**/*.yml")).map { |path| TravisImageTemplate.new path }
template_groups = templates.group_by { |template| template.name }
template_groups.keys.delete_if { |k| k == 'standard' }.each do |template_name|
this_template_group = template_groups[template_name]
base = this_template_group.select {|t| t.path =~ /\bcommon\b/}.first
addition = this_template_group.select {|t| t.path =~ /\bstandard\b/}.first
config.vm.define "#{template_name}-#{release}", autostart: false do |worker|
worker.vm.box = "travis-#{release}"
worker.ssh.username = 'travis'
worker.ssh.password = 'travis'
worker.vm.provision "chef_solo" do |chef|
chef.log_level = :info
chef.cookbooks_path = "ci_environment"
chef.merge(base)
if addition
chef.json = base.json.deep_merge(addition.json).merge({'system_info' => {'cookbooks_sha' => `cd ../travis-cookbooks; git show-ref refs/heads/master -s`.chomp}})
Array((base.data['recipes'] || []).concat(addition.data['recipes'])).each { |recipe| chef.add_recipe recipe }
else
chef.json = base.json.merge({'system_info' => {'cookbooks_sha' => `cd ../travis-cookbooks; git show-ref refs/heads/master -s`.chomp}})
Array(base.data['recipes'] || []).each { |recipe| chef.add_recipe recipe }
end
end
end
end
end
# Wrapper for template data in travis-images
class TravisImageTemplate
# #run_list and #json are necessary for an instance
# of this class to be passed via #merge
attr_reader :path, :name, :data, :run_list
def initialize(path)
@path = path
path =~ /([^\/]+)\.yml$/
@name = $1
@data = YAML.load File.read(path)
@run_list = []
end
def json
data['json'] || {}
end
def to_s
"name: #{name}\npath: #{path}\njson: #{json}\nrecipes: #{data['recipes']}"
end
end