lobot 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/.gitignore +7 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +9 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +78 -0
  6. data/Rakefile +2 -0
  7. data/features/ci.feature +18 -0
  8. data/features/config/secrets.yml.example +6 -0
  9. data/features/step_definitions/ci_steps.rb +98 -0
  10. data/features/support/env.rb +3 -0
  11. data/lib/generators/lobot/USAGE +8 -0
  12. data/lib/generators/lobot/install_generator.rb +24 -0
  13. data/lib/generators/lobot/templates/Capfile +6 -0
  14. data/lib/generators/lobot/templates/bootstrap_server.sh +57 -0
  15. data/lib/generators/lobot/templates/capistrano-ci.rb +68 -0
  16. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/attributes/nginx.rb +2 -0
  17. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/libraries/ci_config.rb +2 -0
  18. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/recipes/default.rb +7 -0
  19. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/recipes/git_config.rb +11 -0
  20. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/recipes/id_rsa.rb +14 -0
  21. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/recipes/jenkins.rb +45 -0
  22. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/recipes/xvfb.rb +24 -0
  23. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_ci/templates/default/jenkins-job-config.xml.erb +62 -0
  24. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/libraries/marker.rb +42 -0
  25. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/recipes/daemontools.rb +15 -0
  26. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/recipes/imagemagick.rb +37 -0
  27. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/recipes/libxml_prereqs.rb +14 -0
  28. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/recipes/mysql_5_1.rb +90 -0
  29. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/recipes/mysql_5_5.rb +86 -0
  30. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/recipes/nginx.rb +65 -0
  31. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/recipes/postgres.rb +80 -0
  32. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/recipes/sqlite.rb +20 -0
  33. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/recipes/swap.rb +17 -0
  34. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/templates/default/nginx-conf.erb +42 -0
  35. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/templates/default/nginx-htaccess.erb +3 -0
  36. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/templates/default/nginx-mime-types.erb +75 -0
  37. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/templates/default/nginx-run-script.erb +2 -0
  38. data/lib/generators/lobot/templates/chef/cookbooks/pivotal_server/templates/default/postgres-run-script.erb +2 -0
  39. data/lib/generators/lobot/templates/ci.rake +111 -0
  40. data/lib/generators/lobot/templates/ci.yml +24 -0
  41. data/lib/generators/lobot/templates/deploy-ci.rb +5 -0
  42. data/lib/generators/lobot/templates/soloistrc +11 -0
  43. data/lib/lobot.rb +8 -0
  44. data/lib/lobot/version.rb +3 -0
  45. data/lobot.gemspec +27 -0
  46. data/spec/install_spec.rb +68 -0
  47. data/spec/spec_helper.rb +11 -0
  48. metadata +161 -0
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ features/config/secrets.yml
6
+ .idea
7
+ spec/tmp
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use ruby-1.9.2-p180@lobot
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "rspec"
4
+ gem "generator_spec"
5
+ gem "rails"
6
+ gem "cucumber"
7
+
8
+ # Specify your gem's dependencies in lobot.gemspec
9
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2011 Pivotal Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,78 @@
1
+ Lobot: Your Chief Administrative Aide on Cloud City
2
+ ============================
3
+
4
+ ![Lobot](http://i.imgur.com/QAkd7.jpg)
5
+ ###A "one click" solution for deploying CI to EC2
6
+
7
+ Lando Calrissian relies on Lobot to keep Cloud City afloat, and now you can rely on Lobot to keep your continuous integration server running in the cloud. Lobot is a gem that will help you spin-up, bootstrap, and install Jenkins for CI for your Rails app on Amazon EC2.
8
+
9
+ # What do I get?
10
+
11
+ * rake tasks for starting a CI instance
12
+ * capistrano tasks for bootstrapping and deploying to an EC2 instance
13
+ * chef recipes for configuring a Centos server to run Jenkins and build Rails projects.
14
+
15
+ all you'll need to do is:
16
+
17
+ rails g lobot:install
18
+ edit config/ci.yml
19
+ rake ci:server_start && cap ci bootstrap && cap ci chef
20
+
21
+ ## Install
22
+
23
+ Add lobot to your Gemfile
24
+
25
+ gem "lobot"
26
+
27
+ ## Generate
28
+ Lobot is a Rails 3 generator. Rails 2 can be made to work, but you will need to copy the template files into your project.
29
+
30
+ rails g lobot:install
31
+
32
+ ## Setup
33
+
34
+ Edit config/ci.yml
35
+
36
+ ---
37
+ app_name: # a short name for your application
38
+ app_user: # the user created to run your CI process
39
+ git_location: # The location of your remote git repository which Jenkins will poll and pull from on changes.
40
+ basic_auth:
41
+ - username: # The username you will use to access the Jenkins web interface
42
+ password: # The password you will use to access the Jenkins web interface
43
+ credentials:
44
+ aws_access_key_id: # The Access Key for your Amazon AWS account
45
+ aws_secret_access_key: The Secret Access Key for your Amazon AWS account
46
+ provider: AWS # leave this one alone
47
+ server:
48
+ name: run 'rake ci:server_start to populate'
49
+ instance_id: run 'rake ci:server_start to populate'
50
+ build_command: ./cruise_build.sh
51
+ ec2_server_access:
52
+ key_pair_name: myapp_ci
53
+ id_rsa_path: ~/.ssh/id_rsa
54
+ id_rsa_for_github_access: |-
55
+ -----BEGIN RSA PRIVATE KEY-----
56
+ SSH KEY WITH ACCESS TO GITHUB GOES HERE
57
+ -----END RSA PRIVATE KEY-----
58
+
59
+ For security, you can add ci.yml to your .gitignore file and store a ci.yml.example without authentication credentials in your repository
60
+
61
+ ## Dependencies
62
+
63
+ * fog
64
+ * capistrano
65
+ * capistrano-ext
66
+ * rvm (the gem - it configures capistrano to use RVM on the server)
67
+
68
+ # Tests
69
+
70
+ Lobot is tested using rspec, generator_spec and cucumber. Cucumber provides a full integration test which can generate a rails application, push it to github, start a server and bring up CI for the generated project. You'll need a git repository(which should not have any code you care about) and an AWS account to run the spec. It costs about $0.50 and takes about half an hour. It does not clean up after itself, so be sure to terminate the server when you're done, or it will cost substantially more than $0.50. Use the secrets.yml.example to create a secrets.yml file with your accounts.
71
+
72
+ # Contributing
73
+
74
+ Lobot is in its infancy and we welcome pull requests. Pull requests should have test coverage for quick consideration.
75
+
76
+ # License
77
+
78
+ Lobot is MIT Licensed and © Pivotal Labs. See LICENSE.txt for details.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,18 @@
1
+ Feature: CI
2
+
3
+ Background:
4
+ Given the temp directory is clean
5
+ Given I am in the temp directory
6
+
7
+ Scenario: Install CI on Amazon AWS using new Rails template
8
+ When I create a new Rails project using a Rails template
9
+ And I vendor Lobot
10
+ And I put Lobot in the Gemfile
11
+ And I run bundle install
12
+ And I run the Lobot generator
13
+ And I enter my info into the ci.yml file
14
+ And I push to git
15
+ And I run the server setup
16
+ And I bootstrap
17
+ And I deploy
18
+ Then CI is green
@@ -0,0 +1,6 @@
1
+ ---
2
+ aws_access_key_id:
3
+ aws_secret_access_key:
4
+ id_rsa: |-
5
+ -----BEGIN RSA PRIVATE KEY-----
6
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,98 @@
1
+
2
+ def system!(str)
3
+ raise "Command Failed: #{str}" unless system(str)
4
+ end
5
+
6
+ Given /^the temp directory is clean$/ do
7
+ system!("rm -rf /tmp/lobot-test")
8
+ system!("mkdir -p /tmp/lobot-test")
9
+ end
10
+
11
+ Given /^I am in the temp directory$/ do
12
+ Dir.chdir('/tmp/lobot-test')
13
+ end
14
+
15
+ When /^I create a new Rails project using a Rails template$/ do
16
+ system!("echo -e '\nyes\nno\nno\nno\nno\nno\nno' | rails new testapp -m https://github.com/pivotal/guiderails/raw/master/main.rb")
17
+ end
18
+
19
+ When /^I vendor Lobot$/ do
20
+ lobot_dir = File.expand_path('../../', File.dirname(__FILE__))
21
+ system! "cd #{lobot_dir} && rake build"
22
+ system! "mkdir -p testapp/vendor/cache/"
23
+ system! "cp #{lobot_dir}/pkg/lobot-#{Lobot::VERSION}.gem testapp/vendor/cache/"
24
+ end
25
+
26
+ When /^I put Lobot in the Gemfile$/ do
27
+ lobot_path = File.expand_path('../../', File.dirname(__FILE__))
28
+ system!(%{echo "gem 'lobot'" >> testapp/Gemfile})
29
+ end
30
+
31
+ When /^I run bundle install$/ do
32
+ system("cd testapp && gem uninstall lobot")
33
+ system!("cd testapp && bundle install")
34
+ system!('cd testapp && bundle exec gem list | grep lobot')
35
+ end
36
+
37
+ When /^I run the Lobot generator$/ do
38
+ system!('cd testapp && rails generate lobot:install')
39
+ system!('ls testapp | grep -s soloistrc')
40
+ end
41
+
42
+ When /^I enter my info into the ci\.yml file$/ do
43
+ secrets = YAML.load_file(File.expand_path('../config/secrets.yml', File.dirname(__FILE__)))
44
+
45
+ ci_conf_location = 'testapp/config/ci.yml'
46
+ ci_yml = YAML.load_file(ci_conf_location)
47
+ ci_yml.merge!(
48
+ 'app_name' => 'testapp',
49
+ 'app_user' => 'testapp-user',
50
+ 'git_location' => 'git@github.com:pivotalprivate/ci-smoke.git',
51
+ 'basic_auth' => [{ 'username' => 'testapp', 'password' => 'testpass' }],
52
+ 'credentials' => { 'aws_access_key_id' => secrets['aws_access_key_id'], 'aws_secret_access_key' => secrets['aws_secret_access_key'], 'provider' => 'AWS' },
53
+ 'ec2_server_access' => {'key_pair_name' => 'lobot_cucumber_key_pair', 'id_rsa_path' => '~/.ssh/id_rsa'},
54
+ 'id_rsa_for_github_access' => secrets['id_rsa_for_github_access']
55
+ )
56
+ # ci_yml['server']['name] = '' # This can be used to merge in a server which is already running if you want to skip the setup steps while iterating on a test
57
+ File.open(ci_conf_location, "w") do |f|
58
+ YAML.dump(ci_yml, f)
59
+ end
60
+ end
61
+
62
+ When /^I push to git$/ do
63
+ system! "echo 'config/ci.yml' >> testapp/.gitignore"
64
+ system! "cd testapp && git add ."
65
+ system! "cd testapp && git commit -m'initial commit'"
66
+ system "cd testapp && git remote rm origin"
67
+ system! "cd testapp && git remote add origin git@github.com:pivotalprivate/ci-smoke.git"
68
+ system! "cd testapp && git push --force -u origin master"
69
+ end
70
+
71
+ When /^I run the server setup$/ do
72
+ system! "cd testapp && rake ci:server_start"
73
+ end
74
+
75
+ When /^I bootstrap$/ do
76
+ server_is_available = false
77
+ iterations = 0
78
+ until server_is_available
79
+ server_is_available = system("cd testapp && cap ci check_for_server_availability")
80
+ puts "Sleeping for 3 seconds"
81
+ sleep 3
82
+ iterations += 1
83
+ raise "server is not available" if iterations > 10
84
+ end
85
+ system! "cd testapp && cap ci bootstrap"
86
+ end
87
+
88
+ When /^I deploy$/ do
89
+ system! "cd testapp && cap ci chef"
90
+ end
91
+
92
+ Then /^CI is green$/ do
93
+ Timeout::timeout(300) do
94
+ until system("cd testapp && rake ci:status")
95
+ sleep 5
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,3 @@
1
+ require "rubygems"
2
+
3
+ require File.expand_path('../../lib/lobot', File.dirname(__FILE__))
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate install Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,24 @@
1
+ module Lobot
2
+ class InstallGenerator < Rails::Generators::Base
3
+ source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
4
+
5
+ def create_ci_files
6
+ template 'ci.yml', 'config/ci.yml'
7
+ template 'ci.rake', 'lib/tasks/ci.rake'
8
+ template 'bootstrap_server.sh', 'script/bootstrap_server.sh'
9
+ template 'deploy-ci.rb', 'config/deploy/ci.rb'
10
+ template 'capistrano-ci.rb', 'config/capistrano/ci.rb'
11
+ template 'soloistrc', 'soloistrc'
12
+ end
13
+
14
+ def add_load_path_to_capfile
15
+ template 'Capfile', 'Capfile' unless File.exists?("#{destination_root}/Capfile")
16
+ prepend_to_file 'Capfile', "load 'config/capistrano/ci'\n"
17
+ end
18
+
19
+ def create_chef_cookbooks
20
+ directory 'chef', 'chef'
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,6 @@
1
+ # Lobot provides the default Capfile for you in case you want to use more cap later
2
+
3
+ # load 'deploy' if respond_to?(:namespace) # cap2 differentiator
4
+ # Dir['vendor/gems/*/recipes/*.rb','vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }
5
+ #
6
+ # load 'config/deploy' # remove this line to skip loading any of the default tasks
@@ -0,0 +1,57 @@
1
+ #!/bin/bash -e
2
+
3
+ env | grep -q "APP_USER=" || echo "Please set APP_USER environment variable"
4
+
5
+ # perl -e 'print crypt("password", "salt"),"\n"'
6
+ getent passwd $APP_USER >/dev/null 2>&1 || useradd $APP_USER -p DEADBEEFSCRYPTEDPASSWORD #sa3tHJ3/KuYvI would be password
7
+
8
+ # copy root's authorized keys to APP_USER
9
+ mkdir -p /home/$APP_USER/.ssh
10
+ touch /home/$APP_USER/.ssh/authorized_keys
11
+ chmod 700 /home/$APP_USER/.ssh
12
+ chmod 600 /home/$APP_USER/.ssh/authorized_keys
13
+ chown -R $APP_USER /home/$APP_USER/.ssh
14
+
15
+ authorized_keys_string=`cat /root/.ssh/authorized_keys`
16
+ grep -sq "$authorized_keys_string" /home/$APP_USER/.ssh/authorized_keys || cat /root/.ssh/authorized_keys >> /home/$APP_USER/.ssh/authorized_keys
17
+
18
+
19
+ ## enable ssh password auth
20
+ perl -p -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
21
+ /etc/init.d/sshd reload
22
+
23
+ # install epel
24
+ rpm -q epel-release-5-4.noarch || rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
25
+
26
+ # install git
27
+ yum -y install git
28
+
29
+ # rvm prereqs
30
+ yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libffi-devel openssl-devel iconv-devel java
31
+
32
+ # passwordless sudo
33
+ sudo_string='ALL ALL = (ALL) NOPASSWD: ALL'
34
+ grep "$sudo_string" /etc/sudoers || echo "$sudo_string" >> /etc/sudoers
35
+
36
+ cat <<'BOOTSTRAP_AS_USER' > /home/$APP_USER/bootstrap_as_user.sh
37
+ set -e
38
+
39
+ export APP_USER=$1
40
+
41
+ mkdir -p /home/$APP_USER/rvm/src
42
+ curl -Lskf http://github.com/wayneeseguin/rvm/tarball/156d0b42feba4922ad04 | tar xvz -C/home/$APP_USER/rvm/src --strip 1
43
+ cd "/home/$APP_USER/rvm/src" && ./install
44
+
45
+ rvm_include_string='[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"'
46
+ grep "$rvm_include_string" ~/.bashrc || echo "$rvm_include_string" >> ~/.bashrc
47
+
48
+ cat <<'RVMRC_CONTENTS' > ~/.rvmrc
49
+ rvm_install_on_use_flag=1
50
+ rvm_trust_rvmrcs_flag=1
51
+ rvm_gemset_create_on_use_flag=1
52
+ RVMRC_CONTENTS
53
+ BOOTSTRAP_AS_USER
54
+
55
+ chmod a+x /home/$APP_USER/bootstrap_as_user.sh
56
+ su - $APP_USER /home/$APP_USER/bootstrap_as_user.sh $APP_USER
57
+ rm /home/$APP_USER/bootstrap_as_user.sh
@@ -0,0 +1,68 @@
1
+ require 'capistrano/ext/multistage'
2
+ require "rvm/capistrano" # Use the gem, don't unshift RVM onto the load path, that's crazy.
3
+
4
+ task :ci_setup do
5
+ ci_conf_location ||= File.expand_path('../../../config/ci.yml', __FILE__)
6
+ ci_conf ||= YAML.load_file(ci_conf_location)
7
+
8
+ raise "rvm_ruby_string not set - are you using RVM" unless ENV['rvm_ruby_string']
9
+ set :rvm_ruby_string, ENV['rvm_ruby_string']
10
+ set :rvm_type, :user
11
+ set :app_name, ci_conf['app_name']
12
+ set(:app_dir) { "/var/#{stage}/#{app_name}" }
13
+ set :user, ci_conf['app_user']
14
+ ssh_options[:keys] = [ci_conf['ec2_server_access']['id_rsa_path']]
15
+ default_run_options[:pty] = true
16
+ end
17
+
18
+ desc "check for server availability - run this task in a loop to see if the slice is ready to connect to"
19
+ task :check_for_server_availability do
20
+ ci_setup
21
+ set :user, "root"
22
+ run "echo Server is available"
23
+ end
24
+
25
+ desc "bootstrap"
26
+ task :bootstrap do
27
+ ci_setup
28
+ app_user = user
29
+ set :user, "root"
30
+ set :default_shell, "/bin/bash"
31
+ upload "script/bootstrap_server.sh", "/root/bootstrap_server.sh"
32
+ run "chmod a+x /root/bootstrap_server.sh"
33
+ run "APP_USER=#{app_user} /root/bootstrap_server.sh"
34
+ end
35
+
36
+ desc "setup and run chef"
37
+ task :chef do
38
+ ci_setup
39
+ install_base_gems
40
+ upload_cookbooks
41
+ run_soloist
42
+ end
43
+
44
+ desc "Install gems that are needed for a chef run"
45
+ task :install_base_gems do
46
+ ci_setup
47
+ p rvm_ruby_string
48
+ run "gem list | grep soloist || gem install soloist --no-rdoc --no-ri"
49
+ run "gem list | grep bundler || gem install bundler --no-rdoc --no-ri"
50
+ end
51
+
52
+ desc "Upload cookbooks"
53
+ task :upload_cookbooks do
54
+ ci_setup
55
+ run "sudo mkdir -p #{app_dir}"
56
+ run "sudo chown -R #{user} #{app_dir}"
57
+ run "rm #{app_dir}/soloistrc || true"
58
+ run "rm -r #{app_dir}/chef || true"
59
+ upload("soloistrc", "#{app_dir}/soloistrc")
60
+ upload("config/ci.yml", "#{app_dir}/ci.yml")
61
+ upload("chef/", "#{app_dir}/chef/", :via => :scp, :recursive => true)
62
+ end
63
+
64
+ desc "Run soloist"
65
+ task :run_soloist do
66
+ ci_setup
67
+ run "cd #{app_dir} && PATH=/usr/sbin:$PATH APP_NAME=#{fetch(:app_name)} APP_DIR=#{fetch(:app_dir)} LOG_LEVEL=debug soloist"
68
+ end
@@ -0,0 +1,2 @@
1
+ node["nginx_settings"] ||= {}
2
+ node["nginx_settings"]["basic_auth_users"] = CI_CONFIG['basic_auth']
@@ -0,0 +1,2 @@
1
+ ci_conf_location = File.expand_path('../../../../../ci.yml', __FILE__)
2
+ ::CI_CONFIG = YAML.load_file(ci_conf_location)
@@ -0,0 +1,7 @@
1
+ include_recipe "pivotal_server::imagemagick"
2
+ include_recipe "pivotal_server::postgres"
3
+ include_recipe "pivotal_server::sqlite"
4
+ include_recipe "pivotal_server::libxml_prereqs"
5
+ include_recipe "pivotal_server::nginx"
6
+ include_recipe "pivotal_ci::id_rsa"
7
+ include_recipe "pivotal_ci::jenkins"