gorgon 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- Njg4ZmM0YTg5NWRkZTk0ZWU4ZWY4OTRiNjEwYTcxMmYwNGI1MzdjZQ==
4
+ ODFiMzc4NjIzZTU3NmVjYjUyZDA0NDk0MWEzYTQ4MTg5MzZmZjBlZg==
5
5
  data.tar.gz: !binary |-
6
- ODAxYjJlMDgyNjFhMDM1YjI2ZTU4ZTJiNzE3OTI4MzViNThmZTM2Mw==
6
+ YzljZGEyNTE5ZTU3OWFiYjhiNTdhMDU2YTkyMzg1NjU4YjA4MzI1Zg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MWYxYzg1NzAwNThjOTEzZDhjODZmMWU5Y2VmNTI4ODI3NWUyZWM5M2JhNWI0
10
- YzI3NzE4N2RiODY0NDM1NmIzOGRlNzY5NjY2MTFiN2ZiNGM1NWIwNDEyOGJh
11
- NzZmOTE0YzQyYTY2NGJlOTk1NGZkODFjODgyNDQ5MzQ4NGQ4MzA=
9
+ ZWY1MWNmOWIwZjM3NjE4YTc5MTFiNjQzOWY0NmU2Y2FmMTUxOGJlZmMyZDky
10
+ YmQ3NGRjNzM1MTMwNTY2Zjg5YzhmZWYxNDJiMTEzZWYyNmQ1ZGMxYzI5ZTAx
11
+ NzkzMDA4N2U3MDc3NzJhYmMzNDk4NzE1YWEwNDNlNTZlZTBjMzM=
12
12
  data.tar.gz: !binary |-
13
- ZjE2ZjQyMzI5NmExYzBkYTJlZjVkMzczNGNiMzIzMTcyZjUwZWFkYzJiODAz
14
- MjkyYTZkZTAwMmI4Nzc3NTJkZGQ2NjU3MGNiM2E3NzI3NDUyZmI5OWU3YTVk
15
- MDdkNTA4ZDgwYTA0MDE2ZWY1OTcwMWJiY2IzNzExMGE2MmIzN2Y=
13
+ NjZiMTAyYTIxZjRjYzcxNmRhOTM0NmYwNmY2ZjU3MmU5MzdjMGE4Mjc4ZWUw
14
+ MzQ1M2ZmZGQxYjM1ZjI1NzAyMGMyNmI1NjFhNDBhZDE1OGEyNmFlNDllZWE4
15
+ NTJjOTY0ODhiYWYyZWZhYjZkODljYjZhMzczZWM5MWEwNjVhODY=
data/.gitignore CHANGED
@@ -11,3 +11,4 @@ pkg
11
11
  .rbenv-version
12
12
  *.log
13
13
  *.json
14
+ .rspec
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gorgon (0.7.0)
4
+ gorgon (0.7.1)
5
5
  amqp (~> 1.1.0)
6
6
  awesome_print
7
7
  colorize (~> 0.5.8)
@@ -21,7 +21,7 @@ GEM
21
21
  colorize (0.5.8)
22
22
  diff-lcs (1.1.3)
23
23
  eventmachine (1.0.3)
24
- open4 (1.3.0)
24
+ open4 (1.3.4)
25
25
  rake (0.9.2.2)
26
26
  rspec (2.11.0)
27
27
  rspec-core (~> 2.11.0)
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  Gorgon
2
2
  =====================
3
3
 
4
+ [![Gem Version](https://badge.fury.io/rb/gorgon.png)](https://rubygems.org/gems/gorgon)
4
5
  [![Code Climate](https://codeclimate.com/github/Fitzsimmons/Gorgon.png)](https://codeclimate.com/github/Fitzsimmons/Gorgon)
5
6
 
6
7
  About
@@ -1,28 +1,44 @@
1
1
  Architecture
2
2
  ---------------------
3
3
 
4
- By running `gorgon start`, the originating computer will publish a *job definition* to the AMQP server. This object contains all of the information required to run the tests:
4
+ [Gorgon](https://github.com/Fitzsimmons/Gorgon/) distributes a test suite across multiple machines. So you can use all the computer power in your office to run your tests in parallel.
5
5
 
6
- * The rsync information with which to fetch the source tree
7
- * The name of a AMQP queue that contains the list of files that require testing
8
- * The name of a AMQP exchange to send replies to
6
+ These are the main components of Gorgon's architecture:
7
+
8
+ * *originator*: program that we run in the terminal to start running tests.
9
+ * *listener*: long living program running as background process on every remote host that will run tests. It will wait for a *job definition* form *originator*, and fork a *worker manager*.
10
+ * *file server*: middleman host used to transfer source code from *originator* to *listeners*.
11
+ * *worker manager*: process that forks *workers*.
12
+ * *worker*: process that runs test files and sends results back to *originator*
13
+ * [*RabbitMQ*](http://www.rabbitmq.com/): message broker running on a fixed host. It's used to communicate between *originator*, and *listeners*, *worker managers* and *workers*.
14
+
15
+ ![image](https://www.lucidchart.com/publicSegments/view/540e47ae-2288-4569-880b-4c780a00596c/image.png =600x)
16
+
17
+ Every machine needs to run a *listener*, that should be launched on system startup. Between *originator* and *listeners* we have a *file server* and *RabbitMQ*. When we run Gorgon, *originator* will push all files to the *file server*, and add a *job definition* to a *RabbitMQ* queue that all listener are listening to.
18
+
19
+ A *job definition* contains:
20
+
21
+ * The rsync information with which to fetch the source tree from *file server*
22
+ * The name of a RabbitMQ queue that contains the list of files that require testing
23
+ * The name of a RabbitMQ exchange to send replies to
9
24
  * Application-specific setup/teardown, either per-job or per-worker (callbacks)
10
25
 
11
- The job listener subscribes to the job publish event, and maintains its own queue of jobs. When a job has available *worker slots*, it will prepare the workspace:
26
+ When a *listener* receives a *job definition*, it:
12
27
 
13
- * Create a unique temporary workspace directory for the job
14
- * Rsync the source tree to the temporary workspace
15
- * Run after_sync callback
28
+ * Creates a unique temporary workspace directory for the job
29
+ * Rsync the source tree from *file server* to the temporary workspace
30
+ * Runs after_sync callback
16
31
  * Invoke a WorkerManager
17
32
 
18
- After WorkerManager starts, it will:
19
- * Run before\_creating\_workers callback
20
- * Fork *n* workers, where *n* is the number of available *worker slots*.
21
- * Subscribe to a queue where originator can send a cancel_job message
33
+ After WorkerManager starts, it:
34
+
35
+ * Runs before_creating_workers callback
36
+ * Forks n workers, where n is the number of available worker slots specified in [gorgon configuration](https://github.com/Fitzsimmons/Gorgon/blob/master/gorgon_listener.json.sample).
37
+ * Subscribes to a queue where originator can send a cancel_job message
38
+
39
+ Each Worker:
22
40
 
23
- Each Worker will:
24
- * Run before_start callback
25
- * Pop a file from file queue and run it until file queue is empty, or WorkerManager sends an INT signal. For each file, it post a 'start_message' and a 'finish_message' with the results to the *reply queue*
26
- * Run after_complete callback
41
+ * Runs before_start callback
42
+ * Keeps popping files one at a time until *file queue* is empty. For every file, it posts a *start message*, runs file using correct *test runner* (RSpec or MiniTest), and sends a *finish message* to *originator* with the results through the reply queue.
43
+ * Runs after_complete callback
27
44
 
28
- To invoke the worker manager, the listener passes the name of the *file queue*, *reply queue*, and *listener queue* to the worker manager initialization, and then it will block until worker manager finishes.
@@ -160,8 +160,13 @@ class Originator
160
160
  end
161
161
 
162
162
  def file_server_host
163
- file_server = configuration[:file_server]
164
- raise 'Please, provide file_server configuration.' if file_server.nil?
163
+ if configuration[:file_server].nil?
164
+ raise <<-MSG
165
+ Missing file_server configuration.
166
+ See https://github.com/Fitzsimmons/Gorgon/blob/master/gorgon.json.sample for a sample configuration
167
+ MSG
168
+ end
169
+
165
170
  configuration[:file_server][:host]
166
171
  end
167
172
 
@@ -1,6 +1,6 @@
1
1
  module Settings
2
2
  class FilesContent
3
- attr_accessor :amqp_host, :sync_exclude, :files, :originator_log_file,
3
+ attr_accessor :amqp_host, :file_server_host, :sync_exclude, :files, :originator_log_file,
4
4
  :callbacks, :callbacks_dir
5
5
 
6
6
  TEST_UNIT_GLOB = "test/**/*_test.rb"
@@ -12,15 +12,22 @@ module Settings
12
12
  @files << FilesContent::RSPEC_GLOB if Dir.exist?('spec')
13
13
  end
14
14
 
15
- DEFAULT_AMQP_HOST = 'localhost'
15
+ DEFAULT_HOST = 'localhost'
16
16
  def self.get_amqp_host
17
- puts "AMQP host (default '#{DEFAULT_AMQP_HOST}')? "
17
+ puts "What's the AMQP host name? (leave blank to use '#{DEFAULT_HOST}') "
18
+ return get_input_or_default(DEFAULT_HOST)
19
+ end
20
+
21
+ def self.get_file_server_host
22
+ puts "What's the File Server host name? (leave blank to use '#{DEFAULT_HOST}') "
23
+ return get_input_or_default(DEFAULT_HOST)
24
+ end
25
+
26
+ private
27
+
28
+ def self.get_input_or_default(default)
18
29
  input = $stdin.gets.chomp
19
- if input == ""
20
- return DEFAULT_AMQP_HOST
21
- else
22
- return input
23
- end
30
+ (input == '') ? default : input
24
31
  end
25
32
  end
26
33
  end
@@ -22,6 +22,7 @@ module Settings
22
22
  end
23
23
 
24
24
  private
25
+
25
26
  def self.create_gorgon_json content
26
27
  if File.exist? GORGON_JSON_FILE
27
28
  puts "gorgo.json exists. Skipping..."
@@ -30,6 +31,7 @@ module Settings
30
31
 
31
32
  config = {
32
33
  connection: {host: content.amqp_host},
34
+ file_server: {host: content.file_server_host},
33
35
  job: {
34
36
  sync_exclude: content.sync_exclude
35
37
  },
@@ -5,6 +5,7 @@ module Settings
5
5
  def initialize
6
6
  super
7
7
  @amqp_host = FilesContent.get_amqp_host
8
+ @file_server_host = FilesContent.get_file_server_host
8
9
  @sync_exclude = [".git", ".rvmrc","tmp","log","doc"]
9
10
  @originator_log_file = 'log/gorgon-originator.log'
10
11
  create_callbacks
@@ -67,8 +68,8 @@ if status.exitstatus != 0
67
68
  raise "ERROR: 'rake db:setup' failed.\n#{stderr.read}\n#{stdout.read}"
68
69
  end
69
70
 
70
- spec_helper_file = File.expand_path('../../spec_helper', __FILE__)
71
- test_helper_file = File.expand_path('../../test_helper', __FILE__)
71
+ spec_helper_file = File.expand_path('../../spec_helper.rb', __FILE__)
72
+ test_helper_file = File.expand_path('../../test_helper.rb', __FILE__)
72
73
 
73
74
  require spec_helper_file if File.exist?(spec_helper_file)
74
75
  require test_helper_file if File.exist?(test_helper_file)
@@ -5,6 +5,7 @@ module Settings
5
5
  def initialize
6
6
  super
7
7
  @amqp_host = FilesContent.get_amqp_host
8
+ @file_server_host = FilesContent.get_file_server_host
8
9
  @sync_exclude = [".git", ".rvmrc"]
9
10
  @originator_log_file = 'gorgon-originator.log'
10
11
  end
@@ -1,3 +1,3 @@
1
1
  module Gorgon
2
- VERSION = "0.7.0"
2
+ VERSION = "0.7.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gorgon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Fitzsimmons
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2014-05-13 00:00:00.000000000 Z
15
+ date: 2014-10-11 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rake
@@ -365,8 +365,86 @@ required_rubygems_version: !ruby/object:Gem::Requirement
365
365
  version: '0'
366
366
  requirements: []
367
367
  rubyforge_project: gorgon
368
- rubygems_version: 2.1.11
368
+ rubygems_version: 2.2.2
369
369
  signing_key:
370
370
  specification_version: 4
371
371
  summary: Distributed testing for ruby with centralized management
372
- test_files: []
372
+ test_files:
373
+ - spec/acceptance/run_tests_spec.rb
374
+ - spec/acceptance_spec_helper.rb
375
+ - spec/callback_handler_spec.rb
376
+ - spec/crash_reporter_spec.rb
377
+ - spec/failures_printer_spec.rb
378
+ - spec/gem_command_handler_spec.rb
379
+ - spec/gem_service_spec.rb
380
+ - spec/gorgon_rspec_formatter_spec.rb
381
+ - spec/host_state_spec.rb
382
+ - spec/job_definition_spec.rb
383
+ - spec/job_state_spec.rb
384
+ - spec/listener_spec.rb
385
+ - spec/mini_test_runner_spec.rb
386
+ - spec/originator_logger_spec.rb
387
+ - spec/originator_protocol_spec.rb
388
+ - spec/originator_spec.rb
389
+ - spec/ping_service_spec.rb
390
+ - spec/pipe_forker_spec.rb
391
+ - spec/progress_bar_view_spec.rb
392
+ - spec/rspec_runner_spec.rb
393
+ - spec/rsync_daemon_spec.rb
394
+ - spec/shutdown_manager_spec.rb
395
+ - spec/source_tree_syncer_spec.rb
396
+ - spec/support/mock_app/.gitignore
397
+ - spec/support/mock_app/Gemfile
398
+ - spec/support/mock_app/Gemfile.lock
399
+ - spec/support/mock_app/README.rdoc
400
+ - spec/support/mock_app/Rakefile
401
+ - spec/support/mock_app/app/assets/images/rails.png
402
+ - spec/support/mock_app/app/assets/javascripts/application.js
403
+ - spec/support/mock_app/app/assets/stylesheets/application.css
404
+ - spec/support/mock_app/app/controllers/application_controller.rb
405
+ - spec/support/mock_app/app/helpers/application_helper.rb
406
+ - spec/support/mock_app/app/mailers/.gitkeep
407
+ - spec/support/mock_app/app/models/.gitkeep
408
+ - spec/support/mock_app/app/views/layouts/application.html.erb
409
+ - spec/support/mock_app/config.ru
410
+ - spec/support/mock_app/config/application.rb
411
+ - spec/support/mock_app/config/boot.rb
412
+ - spec/support/mock_app/config/database.yml
413
+ - spec/support/mock_app/config/environment.rb
414
+ - spec/support/mock_app/config/environments/development.rb
415
+ - spec/support/mock_app/config/environments/production.rb
416
+ - spec/support/mock_app/config/environments/test.rb
417
+ - spec/support/mock_app/config/initializers/backtrace_silencers.rb
418
+ - spec/support/mock_app/config/initializers/inflections.rb
419
+ - spec/support/mock_app/config/initializers/mime_types.rb
420
+ - spec/support/mock_app/config/initializers/secret_token.rb
421
+ - spec/support/mock_app/config/initializers/session_store.rb
422
+ - spec/support/mock_app/config/initializers/wrap_parameters.rb
423
+ - spec/support/mock_app/config/locales/en.yml
424
+ - spec/support/mock_app/config/routes.rb
425
+ - spec/support/mock_app/db/seeds.rb
426
+ - spec/support/mock_app/doc/README_FOR_APP
427
+ - spec/support/mock_app/lib/assets/.gitkeep
428
+ - spec/support/mock_app/lib/tasks/.gitkeep
429
+ - spec/support/mock_app/log/.gitkeep
430
+ - spec/support/mock_app/public/404.html
431
+ - spec/support/mock_app/public/422.html
432
+ - spec/support/mock_app/public/500.html
433
+ - spec/support/mock_app/public/favicon.ico
434
+ - spec/support/mock_app/public/index.html
435
+ - spec/support/mock_app/public/robots.txt
436
+ - spec/support/mock_app/script/rails
437
+ - spec/support/mock_app/test/fixtures/.gitkeep
438
+ - spec/support/mock_app/test/functional/.gitkeep
439
+ - spec/support/mock_app/test/integration/.gitkeep
440
+ - spec/support/mock_app/test/performance/browsing_test.rb
441
+ - spec/support/mock_app/test/test_helper.rb
442
+ - spec/support/mock_app/test/unit/.gitkeep
443
+ - spec/support/mock_app/test/unit/passing_test.rb
444
+ - spec/support/mock_app/vendor/assets/javascripts/.gitkeep
445
+ - spec/support/mock_app/vendor/assets/stylesheets/.gitkeep
446
+ - spec/support/mock_app/vendor/plugins/.gitkeep
447
+ - spec/support/originator_handler.rb
448
+ - spec/unknown_runner_spec.rb
449
+ - spec/worker_manager_spec.rb
450
+ - spec/worker_spec.rb