boxci 0.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.ruby-version +1 -0
  4. data/CHANGELOG.md +146 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +118 -0
  8. data/Rakefile +13 -0
  9. data/bin/boxci +6 -0
  10. data/boxci.gemspec +28 -0
  11. data/lib/boxci/builder.rb +29 -0
  12. data/lib/boxci/cli.rb +70 -0
  13. data/lib/boxci/config_permutation.rb +15 -0
  14. data/lib/boxci/config_permutation_component.rb +11 -0
  15. data/lib/boxci/config_permutation_component_factory.rb +7 -0
  16. data/lib/boxci/config_permutation_components/rbenv.rb +13 -0
  17. data/lib/boxci/dependency_checker.rb +55 -0
  18. data/lib/boxci/global_config.rb +26 -0
  19. data/lib/boxci/initializer.rb +41 -0
  20. data/lib/boxci/language.rb +35 -0
  21. data/lib/boxci/language_factory.rb +7 -0
  22. data/lib/boxci/languages/ruby.rb +31 -0
  23. data/lib/boxci/project_config.rb +96 -0
  24. data/lib/boxci/provider.rb +35 -0
  25. data/lib/boxci/provider_config.rb +23 -0
  26. data/lib/boxci/provider_factory.rb +7 -0
  27. data/lib/boxci/providers/aws.rb +27 -0
  28. data/lib/boxci/providers/openstack.rb +27 -0
  29. data/lib/boxci/providers/virtualbox.rb +24 -0
  30. data/lib/boxci/templates/Vagrantfile +41 -0
  31. data/lib/boxci/templates/boxci/global_config.yml.tt +1 -0
  32. data/lib/boxci/templates/dot_boxci.yml.tt +11 -0
  33. data/lib/boxci/templates/languages/ruby/main.pp +27 -0
  34. data/lib/boxci/templates/providers/aws/Vagrantfile.erb +45 -0
  35. data/lib/boxci/templates/providers/aws.yml.tt +5 -0
  36. data/lib/boxci/templates/providers/openstack/Vagrantfile.erb +37 -0
  37. data/lib/boxci/templates/providers/openstack.yml.tt +16 -0
  38. data/lib/boxci/templates/providers/virtualbox/Vagrantfile.erb +47 -0
  39. data/lib/boxci/templates/providers/virtualbox.yml.tt +2 -0
  40. data/lib/boxci/templates/puppet/manifests/.empty_directory +0 -0
  41. data/lib/boxci/templates/puppet/modules/.empty_directory +0 -0
  42. data/lib/boxci/test_runner.rb +134 -0
  43. data/lib/boxci/tester.rb +287 -0
  44. data/lib/boxci/version.rb +3 -0
  45. data/lib/boxci.rb +71 -0
  46. data/spec/lib/boxci/builder_spec.rb +86 -0
  47. data/spec/lib/boxci/config_permutation_component_factory_spec.rb +17 -0
  48. data/spec/lib/boxci/config_permutation_component_spec.rb +19 -0
  49. data/spec/lib/boxci/config_permutation_components/rbenv_spec.rb +12 -0
  50. data/spec/lib/boxci/config_permutation_spec.rb +27 -0
  51. data/spec/lib/boxci/dependency_checker_spec.rb +215 -0
  52. data/spec/lib/boxci/global_config_spec.rb +34 -0
  53. data/spec/lib/boxci/initializer_spec.rb +117 -0
  54. data/spec/lib/boxci/language_factory_spec.rb +17 -0
  55. data/spec/lib/boxci/language_spec.rb +31 -0
  56. data/spec/lib/boxci/project_config_spec.rb +218 -0
  57. data/spec/lib/boxci/provider_config_spec.rb +39 -0
  58. data/spec/lib/boxci/provider_factory_spec.rb +17 -0
  59. data/spec/lib/boxci/provider_spec.rb +30 -0
  60. data/spec/lib/boxci/tester_spec.rb +15 -0
  61. data/spec/lib/boxci_spec.rb +176 -0
  62. data/spec/spec_helper.rb +11 -0
  63. metadata +213 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a475fe47696c8556909205cd4298df0c1daff83f
4
+ data.tar.gz: c13165f012d2e9baeace5c45c4fc6ff8d4432df5
5
+ SHA512:
6
+ metadata.gz: d95af11773c6c3c0f56a663d976b8b708e62f17fcf31f408ddc6058e9274aaa3031e6a7bcdbcf614eaa85a2f6fb0372518e5afd54bb177b982bb47d53efc37fb
7
+ data.tar.gz: a3ed46d45eb0bfa6f2d6d1bad7716611bd5bc3d520bd893f23174d2395a4c74d0449f2b026ceda0544058a0af0edc192bf65bba88d9b7914d76046efd2bc5b65
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
19
+ .vagrant
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.0
data/CHANGELOG.md ADDED
@@ -0,0 +1,146 @@
1
+ # ChangeLog
2
+
3
+ The following are lists of the notable changes included with each release.
4
+ This is intended to help keep people informed about notable changes between
5
+ versions as well as provide a rough history.
6
+
7
+ #### Next Release
8
+
9
+ #### v0.0.30
10
+
11
+ - Renamed project from `shanty` to `boxci`
12
+ - Moved all `TODO.txt` items to GitHub Issues
13
+ - Corrected author emails in the gemspec
14
+
15
+ #### v0.0.29
16
+
17
+ - Made Initializer not inherit from Thor
18
+ - Made Bulder not inherit from Thor
19
+ - Made Tester not inherit from Thor
20
+
21
+ #### v0.0.28
22
+
23
+ - Remove vagrant debugging from test subcommand cleanup
24
+
25
+ #### v0.0.27
26
+
27
+ - Included stderr on test subcomand cleanup logging
28
+
29
+ #### v0.0.26
30
+
31
+ - Added logging to the test subcommand cleanup
32
+
33
+ #### v0.0.25
34
+
35
+ - Moved workspace cleanup dir rm out of workspace folder block
36
+
37
+ #### v0.0.24
38
+
39
+ - Hid output of cleanup commands
40
+
41
+ #### v0.0.23
42
+
43
+ - Set SIGPIPE handler to `SIG_IGN`
44
+
45
+ #### v0.0.22
46
+
47
+ - Cleaned up hackish logging a bit
48
+
49
+ #### v0.0.21
50
+
51
+ - Switched rescue exception handling to StandardError
52
+
53
+ #### v0.0.20
54
+
55
+ - Added better exception logging
56
+
57
+ #### v0.0.19
58
+
59
+ - Added Errno::EPIPE swallowing in SIGTERM handler
60
+
61
+ #### v0.0.18
62
+
63
+ - Added rescue handler for cleanup in SIGTERM handler
64
+
65
+ #### v0.0.17
66
+
67
+ - Added Errno::EPIPE exception swallowing
68
+
69
+ #### v0.0.16
70
+
71
+ - Added Tester globalish exception logging
72
+
73
+ #### v0.0.15
74
+
75
+ - Fix few issues with the hack logging from `v0.0.14`
76
+
77
+ #### v0.0.14
78
+
79
+ - Added hack logging to verify signal handling
80
+
81
+ #### v0.0.13
82
+
83
+ - Added SIGPIPE swallowing to handle CI servers that kill stdout & stderr on
84
+ build stop.
85
+
86
+ #### v0.0.12
87
+
88
+ - Remove top level exception handler
89
+
90
+ #### v0.0.11
91
+
92
+ - Wrapped test subcommand with unhandled exception handler
93
+
94
+ #### v0.0.10
95
+
96
+ - Added `--version` option to shanty
97
+
98
+ #### v0.0.9
99
+
100
+ - Added SIGTINT handler to run cleanup in test subcommand
101
+ - Added SIGTERM handler to run cleanup in test subcommand
102
+
103
+ #### v0.0.8
104
+
105
+ - Reworked init subcommand's provider option to match test subcommand
106
+ - Made it default to empty global config if not found
107
+ - Remove all the puts debugging added in v0.0.5 for Bamboo
108
+ - Add rake version constraint to gemspec
109
+
110
+ #### v0.0.7
111
+
112
+ - Made exceptino handler re-raise so thor exits when an exception happens
113
+
114
+ #### v0.0.6
115
+
116
+ - Added exception reporting around the initial config load in tester
117
+
118
+ #### v0.0.5
119
+
120
+ - Added puts around everything to see what was happening in Bamboo
121
+
122
+ #### v0.0.4
123
+
124
+ - Replaced test subcommand with puts to verify in Bamboo
125
+
126
+ #### v0.0.3
127
+
128
+ - Added thor exit on failure
129
+
130
+ #### v0.0.2
131
+
132
+ - Fixed bug where openstack node names had underscores
133
+ - Added artifact gathering and downloading
134
+ - Added `box_size` option to the `.shanty.yml`
135
+ - Fixed multiple script hook calls bug
136
+ - Made vagrant destroy forced so it doesn't prompt the user
137
+ - Fixed cd'ing issue before untar of code
138
+ - Bubble up exit code from test suite
139
+ - Added new test runner generator
140
+ - Added basic config permutations handling for rbenv
141
+ - Made virtualbox the default provider
142
+ - Added virtualbox support so can test things locally
143
+
144
+ #### v0.0.1
145
+
146
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in shanty.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 ReachLocal, Inc.
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # boxci: standardizing virtual development & ci environments
2
+
3
+ Boxci makes creating a virtualized development & continuous integration
4
+ environments as easy as possible.
5
+
6
+ It does this by focusing on implementing standards around the use of
7
+ [Vagrant](http://www.vagrantup.com/) for managing your development
8
+ and continuous integration environment. This means that it helps you
9
+ configure and setup [Vagrant](http://www.vagrantup.com/), generate a well
10
+ structured initial puppet manifest, and handles spinning up your puppet
11
+ managed continuous integration environment up in the cloud and running your
12
+ automated test suites.
13
+
14
+ ## Installation
15
+
16
+ Install it by running the following:
17
+
18
+ $ gem install boxci
19
+
20
+ ## Set up your project
21
+
22
+ Setting a new or existing project up with Boxci is done with the following
23
+ steps.
24
+
25
+ 1. Setup initial `boxci` configs & skeletons
26
+ 2. Update the generated configs
27
+ 3. Build your base `boxci` puppet manifest
28
+ 4. Iterate on your `boxci` puppet manifest
29
+ 5. Run your test suite using `boxci`
30
+
31
+ ### Setup initial boxci configs & skeletons
32
+
33
+ To *boxcify* your project you need to run the `boxci init <language>` command.
34
+ This command will create an initial `.boxci.yml` config for you in the current
35
+ working directory. Therefore, you should run this command from the root of
36
+ your project. It will also handle creating your user level `boxci`
37
+ configurations in the `~/.boxci` direcotry. An example of this can be seen as
38
+ follows:
39
+
40
+ $ boxci init ruby
41
+
42
+ *Note:* The above will create user level configs using the default provider
43
+ `virtualbox`. If you want to use `boxci` always with a cloud provider simply
44
+ rerun the `init` command specifying one of the supported providers. The
45
+ following is an example:
46
+
47
+ $ boxci init -p openstack ruby
48
+
49
+ This will go through and setup the proper directory stucture and create the
50
+ config files just as before. However, when it identifies conflicts with the
51
+ existing files it will prompt you and ask you if you want to overwrite, diff
52
+ the files, not overwrite, etc.
53
+
54
+ This means that you can rerun the command over and over again and not worry
55
+ about it overwriting your configs unless you tell it too. This is also useful
56
+ in the scenarios where a new version of `boxci` has come out and added config
57
+ options because then you can rerun it and choose to diff them to see what was
58
+ added.
59
+
60
+ ### Update the generated configs
61
+
62
+ Now that the initial configs and skeleton have been generated. We need to go
63
+ through the configs and update them.
64
+
65
+ ### Build your base Boxci
66
+
67
+ ### Iterate on your Boxci
68
+
69
+ ### Run your Test Suite using Boxci
70
+
71
+ To run your automated test suite in the cloud or locally in a `boxci` managed
72
+ virtual machine simply run the following from the project's root directory.
73
+
74
+ $ boxci test
75
+
76
+ To see more output on what is happening, pass the "-v" flag for verbose:
77
+
78
+ $ boxci test -v
79
+
80
+ For details on other options you can set for test runs run the following
81
+ command:
82
+
83
+ $ boxci help test
84
+
85
+ ## Get Help
86
+
87
+ `boxci` provides a useful help system within the command line tool. You can
88
+ see these messages by using the help command as follows:
89
+
90
+ $ boxci help
91
+
92
+ The above shows you the top level `boxci help` including a break down of it's
93
+ subcommands. You can get detailed help on each subcommand by running the
94
+ following:
95
+
96
+ $ boxci help SUBCOMMAND
97
+
98
+ For example if you wanted the detailed help on `init` you would run the
99
+ following:
100
+
101
+ $ boxci help init
102
+
103
+ ## Config Breakdown
104
+
105
+ ### .boxci.yml
106
+
107
+ After initializing, you need to configure the `.boxci.yml` in the root of your
108
+ project.
109
+
110
+ See the generated `.boxci.yml` file for help with configuration.
111
+
112
+ ## Contributing
113
+
114
+ 1. Fork it ( http://github.com/reachlocal/boxci/fork )
115
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
116
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
117
+ 4. Push to the branch (`git push origin my-new-feature`)
118
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ # Add a simple console for debugging.
4
+ #
5
+ # Start it with:
6
+ # bundle exec rake console
7
+ task :console do
8
+ require 'irb'
9
+ require 'irb/completion'
10
+ require 'shanty'
11
+ ARGV.clear
12
+ IRB.start
13
+ end
data/bin/boxci ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift ::File.expand_path(::File.dirname(__FILE__) + '/../lib')
3
+
4
+ require "boxci"
5
+
6
+ Boxci::CLI.start
data/boxci.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'boxci/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "boxci"
8
+ spec.version = Boxci::VERSION
9
+ spec.authors = ["Andrew De Ponte", "Brian Miller", "Russell Cloak"]
10
+ spec.email = ["cyphactor@gmail.com", "brimil01@gmail.com", "russcloak@gmail.cm"]
11
+ spec.summary = %q{Tool simplifying Vagrant based development & continuous integration environments.}
12
+ spec.description = %q{Boxci is focused on defining standards and building tooling around using Vagrant for development & continuous integration environments to make using them as easy as possible.}
13
+ spec.homepage = "http://github.com/reachlocal/boxci"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "thor", "~> 0.18"
22
+ spec.add_runtime_dependency "net-ssh", "~> 2.7"
23
+ spec.add_runtime_dependency "net-scp", "~> 1.1"
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.5"
26
+ spec.add_development_dependency "rspec", "~> 2.14"
27
+ spec.add_development_dependency "rake", "~> 10.1"
28
+ end
@@ -0,0 +1,29 @@
1
+ require "thor"
2
+
3
+ module Boxci
4
+ class Builder
5
+ include Thor::Base
6
+ include Thor::Actions
7
+
8
+ source_root(File.dirname(__FILE__))
9
+
10
+ def build
11
+ generate_project_vagrantfile
12
+ generate_starter_puppet_manifest
13
+ end
14
+
15
+ def generate_project_vagrantfile
16
+ dependency_checker = Boxci::DependencyChecker.new
17
+ dependency_checker.verify_boxci_config
18
+
19
+ @project_config = Boxci.project_config
20
+ template "templates/Vagrantfile", File.join(Boxci.project_path, "Vagrantfile")
21
+ end
22
+
23
+ def generate_starter_puppet_manifest
24
+ directory "templates/puppet", File.join(Boxci.project_path, "puppet")
25
+ language = Boxci::LanguageFactory.build(Boxci.project_config.language)
26
+ language.generate_starter_puppet_manifest
27
+ end
28
+ end
29
+ end
data/lib/boxci/cli.rb ADDED
@@ -0,0 +1,70 @@
1
+ module Boxci
2
+ class CLI < Thor
3
+ include Thor::Actions
4
+
5
+ DEFAULT_PROVIDER='virtualbox'
6
+ DEFAULT_REVISION='HEAD'
7
+
8
+ desc "init [-p PROVIDER] LANGUAGE", "Initializes boxci in the present working directory"
9
+ long_desc <<-LONGDESC
10
+ `boxci init [-p PROVIDER] LANGUAGE` will create a .boxci directory in
11
+ your user's home directory, create a provider specific config (ex:
12
+ ~/.boxci/providers/virtualbox.yml), set the default provider in
13
+ (~/.boxci/global_config.yml), and create a project config (.boxci.yml)
14
+ in the current working directory.
15
+
16
+ LANGUAGE is required, it is the language of your project, see supported
17
+ languages below.
18
+
19
+ --provider (-p) is optional. If omitted, it will use your configured
20
+ default provider (#{Boxci.default_provider}). If you don't have a
21
+ default provider configured it will default to '#{DEFAULT_PROVIDER}'.
22
+
23
+ Supported Languages: #{Boxci::Language.supported_languages.join(", ")}
24
+ \005Supported Providers: #{Boxci::Provider.supported_providers.join(", ")}
25
+ LONGDESC
26
+ option :provider, :type => :string, :aliases => "-p", :default => Boxci.default_provider
27
+ def init(language)
28
+ initializer = Boxci::Initializer.new
29
+ initializer.init(language, options['provider'])
30
+ end
31
+
32
+ desc "build", "Generates Vagrantfile & starter Puppet manifest"
33
+ long_desc <<-LONGDESC
34
+ `boxci build` will interpret your project config (.boxci.yml) and create
35
+ a starting Vagrantfile and puppet setup in the current working directory.
36
+ LONGDESC
37
+ def build
38
+ builder = Boxci::Builder.new
39
+ builder.build
40
+ end
41
+
42
+ desc "test [-v] [-p PROVIDER] [REVISION]", "Spins up the boxci, runs the tests, then destroys the boxci"
43
+ long_desc <<-LONGDESC
44
+ `boxci test [-v] [-p PROVIDER] [REVISION]` will spin up a new VM using
45
+ the PROVIDER and run the given test steps against the REVISION.
46
+
47
+ --verbose (or -v) is optional. If added, there will be much more output
48
+ a lot of debugging information, as well as explain exactly which commands
49
+ are being run.
50
+
51
+ --provider (-p) is optional. If omitted, it will use your configured
52
+ default provider (#{Boxci.default_provider}). If you don't have a
53
+ default provider configured it will default to '#{DEFAULT_PROVIDER}'.
54
+
55
+ REVISION is optional, and if omitted will default to '#{DEFAULT_REVISION}'.
56
+ LONGDESC
57
+ option :verbose, :type => :boolean, :aliases => "-v"
58
+ option :provider, :type => :string, :aliases => "-p", :default => Boxci.default_provider
59
+ def test(revision=DEFAULT_REVISION)
60
+ tester = Boxci::Tester.new
61
+ tester.test(options.merge({"revision" => revision}))
62
+ end
63
+
64
+ map "--version" => :version
65
+ desc "--version", "Output the version of boxci being executed"
66
+ def version
67
+ puts "v#{Boxci::VERSION}"
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,15 @@
1
+ module Boxci
2
+ class ConfigPermutation
3
+ def initialize(components)
4
+ @components = components
5
+ end
6
+
7
+ def switch_to_script
8
+ component_scripts = []
9
+ @components.each do |component|
10
+ component_scripts << component.switch_to_script
11
+ end
12
+ return component_scripts.join("\n")
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module Boxci
2
+ class ConfigPermutationComponent
3
+ def initialize(val)
4
+ @val = val
5
+ end
6
+
7
+ def switch_to_script
8
+ raise Boxci::PureVirtualMethod, "'switch_to_script' must be implemented by Boxci::ConfigPermutationComponent classes."
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module Boxci
2
+ module ConfigPermutationComponentFactory
3
+ def self.build(key, val)
4
+ Boxci::ConfigPermutationComponents.const_get(key.capitalize).new(val)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ module Boxci
2
+ module ConfigPermutationComponents
3
+ class Rbenv < Boxci::ConfigPermutationComponent
4
+ def switch_to_script
5
+ <<SCRIPT
6
+ echo "Switching to ruby #{@val}"
7
+ rbenv local #{@val}
8
+ echo "Swithed to ruby `ruby --version`"
9
+ SCRIPT
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,55 @@
1
+ module Boxci
2
+ class DependencyChecker < Thor
3
+ include Thor::Actions
4
+
5
+ no_commands do
6
+ def verify_all
7
+ begin
8
+ self.verify_vagrant
9
+ self.verify_cloud_provider_config
10
+ self.verify_repo_puppet_directory
11
+ self.verify_vagrantfile
12
+ # List other dependencies here
13
+ rescue Boxci::MissingDependency => e
14
+ puts e.message
15
+ exit
16
+ end
17
+ end
18
+
19
+ def verify_vagrant
20
+ if !system("which vagrant > /dev/null")
21
+ raise Boxci::MissingDependency, "It looks like you don't have Vagrant installed. Please install it now with: \"brew install vagrant\""
22
+ end
23
+ end
24
+
25
+ def verify_cloud_provider_config
26
+ if !File.exists?(File.join(File.expand_path(ENV["HOME"]), ".boxci", "cloud_provider_config.yml"))
27
+ raise Boxci::MissingDependency, "It looks like you don't have the Cloud Provider Config setup. Generate an example with: \"boxci generate cloud_provider_config\""
28
+ end
29
+ end
30
+
31
+ def verify_repo_puppet_directory
32
+ puppet_directory = File.join(Boxci.project_path, "puppet")
33
+ error_message = "It looks like you don't have Puppet files setup for your repository. You can generate example files by running: \"boxci init\""
34
+
35
+ if !File.directory?(puppet_directory)
36
+ raise Boxci::MissingDependency, error_message
37
+ end
38
+ end
39
+
40
+ def verify_vagrantfile
41
+ vagrant_file = File.join(Boxci.project_path, "Vagrantfile")
42
+ if !File.exists?(vagrant_file)
43
+ raise Boxci::MissingDependency, "It looks like you don't have a Vagrantfile setup for your repository. You can generate an example file by running: \"boxci generate vagrantfile\" "
44
+ end
45
+ end
46
+
47
+ def verify_boxci_config
48
+ config_file = File.join(Boxci.project_path, ".boxci.yml")
49
+ if !File.exists?(config_file)
50
+ raise Boxci::MissingDependency, "It looks like you're missing the Boxci configuration file. You can generate an example file by running: \"boxci init\" "
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,26 @@
1
+ module Boxci
2
+ class GlobalConfig
3
+ def initialize
4
+ @global_config = {}
5
+ end
6
+
7
+ def load
8
+ @global_config.merge!(read_global_config_hash)
9
+ end
10
+
11
+ def default_provider
12
+ @global_config['default_provider']
13
+ end
14
+
15
+ private
16
+
17
+ def read_global_config_hash
18
+ global_config_path = File.join(ENV['HOME'], '/.boxci/global_config.yml')
19
+ if File.exist?(global_config_path)
20
+ global_config = YAML::load_file(global_config_path)
21
+ else
22
+ global_config = {}
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,41 @@
1
+ require "thor"
2
+
3
+ module Boxci
4
+ class Initializer
5
+ include Thor::Base
6
+ include Thor::Actions
7
+ source_root(File.dirname(__FILE__))
8
+
9
+ def init(language, provider)
10
+ create_provider_config(provider)
11
+ set_default_provider(provider)
12
+ create_project_config(language)
13
+ end
14
+
15
+ def create_provider_config(provider)
16
+ template "templates/providers/#{provider}.yml.tt", "~/.boxci/providers/#{provider}.yml"
17
+ end
18
+
19
+ # TODO: Change this name to create_global_config
20
+ def set_default_provider(provider)
21
+ @provider = provider
22
+ template "templates/boxci/global_config.yml.tt", "~/.boxci/global_config.yml"
23
+ end
24
+
25
+ def create_project_config(language)
26
+ boxci_file = File.join(Boxci.project_path, ".boxci.yml")
27
+ @language = language
28
+ @current_ruby_version = dot_ruby_version
29
+ template "templates/dot_boxci.yml.tt", boxci_file
30
+ end
31
+
32
+ def dot_ruby_version
33
+ dot_ruby_version_file_path = File.join(Boxci.project_path, ".ruby-version")
34
+ return nil unless File.exist?(dot_ruby_version_file_path)
35
+ dot_ruby_version_content = File.read(dot_ruby_version_file_path).strip
36
+ if dot_ruby_version_content =~ /(?:ruby-)?(\d+\.\d+\.\d+(?:-p\d+)?)(?:@[\w\-]+)?/
37
+ return $1
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,35 @@
1
+ module Boxci
2
+ class Language < Thor
3
+ include Thor::Actions
4
+
5
+ no_commands do
6
+ def self.source_root
7
+ File.dirname(__FILE__)
8
+ end
9
+
10
+ def self.supported_languages
11
+ @@supported_languages ||= []
12
+ end
13
+
14
+ def self.inherited(subclass)
15
+ self.supported_languages << subclass.to_s.split('::').last.downcase
16
+ end
17
+
18
+ def before_permutation_switch
19
+ ""
20
+ end
21
+
22
+ def after_permutation_switch
23
+ ""
24
+ end
25
+
26
+ def default_script
27
+ raise ::Boxci::PureVirtualMethod, "'default_script' must be implemented on Boxci::Language subclasses"
28
+ end
29
+
30
+ def generate_starter_puppet_manifest
31
+ raise ::Boxci::PureVirtualMethod, "'generate_starter_puppet_manifest' must be implemented on Boxci::Language subclasses"
32
+ end
33
+ end
34
+ end
35
+ end