require 'json' require "erb" include ERB::Util configuration = JSON.parse(File.read('./vagrant-configuration.json')) server = { :hostname => configuration['machine_name'], :box => configuration['box_name'], :box_version => configuration['box_version'], :disk_size => configuration['disk_size'], :ram => 12000, :cpu => 5 } brew_formulas = [ 'autoconf', 'automake', 'bison', 'libtool', 'mono', 'pkg-config', 'yasm' ] brew_cask_formulas = [ 'powershell', 'gfortran' ] azure_agent_url = 'https://vstsagentpackage.azureedge.net/agent/2.171.1/vsts-agent-osx-x64-2.171.1.tar.gz' devops_url = configuration['devops_url'] agent_pool = configuration['agent_pool'] pat = configuration['pat'] archives = configuration['archives'] archives_username = archives['username'] archives_urn = archives['urn'] archives_path = archives['path'] Vagrant.configure('2') do |config| # give them extra time to boot up config.vm.boot_timeout = 600 config.vm.box = server[:box] config.vm.box_version = server[:box_version] config.vm.hostname = server[:hostname] config.vm.synced_folder '.', '/vagrant', disabled: true diskname = "#{server[:hostname]}-data.vmdk" # I don't like this, but as far as I can tell, it's the only way # to do this. When vagrant finishes the `disk` feature, switch # over to that -- Nicole Mazzuca if (not File.exists? diskname) then system "VBoxManage createmedium --filename #{diskname} --size #{1024 * server[:disk_size]}" end config.vm.provider 'virtualbox' do |vb| vb.memory = server[:ram] vb.cpus = server[:cpu] vb.customize ['modifyvm', :id, '--ioapic', 'on'] vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', '1', '--device', '0', '--type', 'hdd', '--medium', "#{diskname}" ] end config.vm.provision 'shell', run: 'once', name: 'Format and mount the data filesystem', inline: 'diskutil partitionDisk /dev/disk0 1 GPT jhfs+ data 0', privileged: true config.vm.provision 'shell', run: 'once', name: 'Link the data filesystem to the home directory', inline: "ln -s /Volumes/data ~/Data", privileged: false config.vm.provision 'shell', run: 'once', name: 'Download azure agent', inline: "curl -s -o ~/Downloads/azure-agent.tar.gz #{azure_agent_url}", privileged: false config.vm.provision 'shell', run: 'once', name: 'Unpack azure agent', inline: 'mkdir myagent; cd myagent; tar xf ~/Downloads/azure-agent.tar.gz', privileged: false config.vm.provision 'shell', run: 'once', name: 'Install brew applications', inline: "brew install #{brew_formulas.join(' ')} && brew cask install #{brew_cask_formulas.join(' ')}", privileged: false config.vm.provision 'shell', run: 'once', name: 'Create archives mountpoint', inline: 'mkdir ~/Data/archives', privileged: false config.vm.provision "shell", run: 'once', name: 'Mount archives directory', inline: "sshfs #{archives_username}@#{archives_urn}:#{archives_path} ~/Data/archives", privileged: false config.vm.provision 'shell', run: 'once', name: 'Add VM to azure agent pool', inline: "cd ~/myagent;\ ./config.sh --unattended \ --url #{devops_url} \ --work ~/Data/work \ --auth pat --token #{pat} \ --pool #{agent_pool} \ --agent `hostname` \ --replace \ --acceptTeeEula", privileged: false # Start listening for jobs config.vm.provision 'shell', run: 'always', name: 'Start running azure pipelines', inline: 'cd /Users/vagrant/myagent;\ nohup ./run.sh&', privileged: false end