robot_sweatshop 0.4.9 → 0.4.11
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -0
- data/Gemfile.lock +1 -2
- data/bin/sweatshop +4 -5
- data/bin/{sweatshop-input → sweatshop-api} +1 -1
- data/config.defaults.yaml +2 -1
- data/docs/README.md +1 -1
- data/docs/architecture.dot +15 -15
- data/docs/architecture.gif +0 -0
- data/lib/robot_sweatshop/cli/config.rb +1 -4
- data/lib/robot_sweatshop/cli/start.rb +2 -2
- data/lib/robot_sweatshop/config.rb +3 -0
- data/lib/robot_sweatshop/overseer.rb +5 -5
- data/lib/robot_sweatshop/templates/default_job.yaml +2 -2
- data/lib/robot_sweatshop/templates/index.html.eruby +2 -2
- data/lib/robot_sweatshop/templates/log.html.eruby +3 -0
- data/robot_sweatshop.eye +4 -4
- data/robot_sweatshop.gemspec +1 -2
- data/test/README.md +3 -1
- data/test/all.rb +1 -1
- data/test/{input_spec.rb → api_spec.rb} +2 -3
- data/test/conveyor_spec.rb +0 -1
- data/test/end-to-end_spec.rb +4 -4
- data/test/job_dictionary_spec.rb +0 -1
- data/test/overseer_spec.rb +4 -5
- data/test/payload_parser_spec.rb +0 -1
- data/test/shared/helpers/input.rb +2 -3
- data/test/shared/helpers/output.rb +0 -1
- data/test/shared/helpers/overseer.rb +0 -1
- data/test/shared/scaffolding.rb +3 -4
- data/test/worker_spec.rb +0 -1
- metadata +6 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9ae5c44f98320bdde45d1f7cb315f29059a0b92
|
4
|
+
data.tar.gz: ea24dec2cb35c6eef63e03a5f3d251627701fdd1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1d9969540fee3705c050f823525ac671626a3dbd94746a710a2bdfe755cbd864b7ec702e0072b2e6dc7e5ce3d031735dfeba59f46052a23ca8e304a3f8bf4da
|
7
|
+
data.tar.gz: aad296f9bf18403b6ade6f6064bc706d750d98c338c57852a3b2bb58c6abf917183fd95f080efbeb91e7fb03c6d9bd9a824f1593730429f4244145162529965c
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# Change Log
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
This project adheres to [Semantic Versioning](http://semver.org/).
|
4
|
+
|
5
|
+
## [Unreleased][unreleased]
|
6
|
+
### Added
|
7
|
+
- Multiple worker support
|
8
|
+
|
9
|
+
## [0.4.11] - 2015-07-14
|
10
|
+
### Fixed
|
11
|
+
- Config erroring out if you don't have a home path
|
12
|
+
|
13
|
+
## [0.4.10] - 2015-07-13
|
14
|
+
### Added
|
15
|
+
- Started using a change log
|
16
|
+
|
17
|
+
### Removed
|
18
|
+
- `sweatshop config system` for convention over configuration
|
19
|
+
|
20
|
+
### Changed
|
21
|
+
- Input server being transformed into the API server
|
22
|
+
|
23
|
+
### Fixed
|
24
|
+
- Front-end hitting the the API server instead of always `localhost`
|
25
|
+
|
26
|
+
[0.4.9 and previous]: https://github.com/jscott/robot_sweatshop/compare/0.1.0...0.4.9
|
data/Gemfile.lock
CHANGED
data/bin/sweatshop
CHANGED
@@ -7,7 +7,7 @@ require 'robot_sweatshop/config'
|
|
7
7
|
require 'robot_sweatshop/create-config-directories'
|
8
8
|
|
9
9
|
program :name, 'Robot Sweatshop'
|
10
|
-
program :version, '0.4.
|
10
|
+
program :version, '0.4.11'
|
11
11
|
program :description, 'A lightweight, nonopinionated CI server'
|
12
12
|
program :help, 'Author', 'Justin Scott <jvscott@gmail.com>'
|
13
13
|
|
@@ -48,11 +48,8 @@ end
|
|
48
48
|
command :start do |c|
|
49
49
|
c.syntax = 'sweatshop start [options]'
|
50
50
|
c.description = 'Start the Sweatshop.'
|
51
|
-
c.option '--testing', 'Load the testing Eye configuration.'
|
52
51
|
c.action do |_args, options|
|
53
|
-
|
54
|
-
environment = options.testing ? 'testing' : 'production'
|
55
|
-
CLI::Start.sweatshop for_environment: environment
|
52
|
+
CLI::Start.sweatshop
|
56
53
|
end
|
57
54
|
end
|
58
55
|
|
@@ -64,6 +61,8 @@ command :stop do |c|
|
|
64
61
|
end
|
65
62
|
end
|
66
63
|
|
64
|
+
alias_command :restart, :start
|
65
|
+
|
67
66
|
command :gears do |c|
|
68
67
|
c.syntax = 'sweatshop gears ...'
|
69
68
|
c.description = 'See `sweatshop-gears --help`'
|
@@ -7,7 +7,7 @@ require 'robot_sweatshop/connections'
|
|
7
7
|
using ExtendedEZMQ
|
8
8
|
|
9
9
|
configure do
|
10
|
-
set :port, configatron.
|
10
|
+
set :port, configatron.api_port
|
11
11
|
set :bind, configatron.http_bind
|
12
12
|
set :run, true
|
13
13
|
set :conveyor, EZMQ::Client.new(port: configatron.conveyor_port)
|
data/config.defaults.yaml
CHANGED
@@ -8,9 +8,10 @@ scripts_path: .robot_sweatshop/scripts
|
|
8
8
|
http_bind: 0.0.0.0
|
9
9
|
http_cross_origin: true
|
10
10
|
overseer_port: 10554
|
11
|
-
|
11
|
+
api_port: 10555
|
12
12
|
conveyor_port: 10556
|
13
13
|
payload_parser_port: 10557
|
14
14
|
job_dictionary_port: 10558
|
15
15
|
worker_port: 10559
|
16
|
+
api_url: http://localhost:10555
|
16
17
|
job_timeout_length: 300 # 5 minutes
|
data/docs/README.md
CHANGED
data/docs/architecture.dot
CHANGED
@@ -2,26 +2,26 @@ digraph architecture {
|
|
2
2
|
label="Robot Sweatshop process interaction"
|
3
3
|
labelloc="top"
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
overseer [label="Overseer",shape=box]
|
6
|
+
api [label="API"]
|
7
|
+
assembler [label="Assembler"]
|
8
|
+
worker [label="Worker"]
|
9
9
|
subgraph cluster_services {
|
10
10
|
label="Req/Rep Services"
|
11
11
|
labelloc="bottom"
|
12
12
|
style="dashed"
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
conveyor [label="Conveyor"]
|
14
|
+
parser [label="Payload Parser"]
|
15
|
+
dictionary [label="Job Dictionary"]
|
16
16
|
}
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
18
|
+
overseer->api
|
19
|
+
api->conveyor
|
20
|
+
assembler->conveyor [dir="both"]
|
21
|
+
assembler->parser [dir="both"]
|
22
|
+
assembler->dictionary [dir="both"]
|
23
|
+
assembler->worker [headlabel="1..*",labeldistance=2]
|
24
|
+
worker->conveyor
|
25
25
|
|
26
|
-
{ rank=same;
|
26
|
+
{ rank=same; api worker assembler }
|
27
27
|
}
|
data/docs/architecture.gif
CHANGED
Binary file
|
@@ -5,12 +5,12 @@ require 'robot_sweatshop/config'
|
|
5
5
|
module CLI
|
6
6
|
# Methods for starting Robot Sweatshop
|
7
7
|
module Start
|
8
|
-
def self.sweatshop
|
8
|
+
def self.sweatshop
|
9
9
|
Config.compile_to_file
|
10
10
|
eye_config = File.expand_path "#{__dir__}/../../../robot_sweatshop.eye"
|
11
11
|
output = `eye load #{eye_config}`
|
12
12
|
fail output if $?.exitstatus != 0
|
13
|
-
Announce.success "Robot Sweatshop loaded
|
13
|
+
Announce.success "Robot Sweatshop loaded"
|
14
14
|
Announce.info `eye restart robot_sweatshop`
|
15
15
|
Announce.info 'Run \'eye --help\' for more info on debugging'
|
16
16
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'configatron'
|
2
2
|
require 'yaml'
|
3
|
+
require 'terminal-announce'
|
3
4
|
|
4
5
|
configatron.reset!
|
5
6
|
|
@@ -16,6 +17,8 @@ configurations.each do |config_path|
|
|
16
17
|
hash = YAML.load_file config_path
|
17
18
|
configatron.configure_from_hash hash
|
18
19
|
end
|
20
|
+
rescue ArgumentError => error
|
21
|
+
Announce.info "Couldn't load '#{config_path}': #{error.message}"
|
19
22
|
end
|
20
23
|
|
21
24
|
require 'robot_sweatshop/create-config-directories'
|
@@ -3,20 +3,20 @@ require 'erubis'
|
|
3
3
|
# Helper methods for the Overseer Sinatra server
|
4
4
|
module OverseerHelper
|
5
5
|
def log_list
|
6
|
-
|
6
|
+
log_path = File.expand_path "#{configatron.logfile_path}"
|
7
|
+
Dir.glob("#{log_path}/*.log").map { |path| File.basename path, '.log' }
|
7
8
|
end
|
8
9
|
|
9
10
|
def job_list
|
10
|
-
|
11
|
-
|
12
|
-
Dir.glob("#{log_path}/*.yaml").map { |path| File.basename path, '.yaml' }
|
11
|
+
job_path = File.expand_path "#{configatron.job_path}"
|
12
|
+
Dir.glob("#{job_path}/*.yaml").map { |path| File.basename path, '.yaml' }
|
13
13
|
end
|
14
14
|
|
15
15
|
def frontpage
|
16
16
|
context = {
|
17
17
|
jobs: job_list,
|
18
18
|
logs: log_list,
|
19
|
-
|
19
|
+
api_url: configatron.api_url
|
20
20
|
}
|
21
21
|
template = File.read "#{__dir__}/templates/index.html.eruby"
|
22
22
|
eruby = Erubis::Eruby.new template
|
@@ -8,8 +8,8 @@
|
|
8
8
|
var QueueJob = function() {
|
9
9
|
var job = $('select#job').val();
|
10
10
|
var data = $('textarea#data').val();
|
11
|
-
console.log("
|
12
|
-
$.post("
|
11
|
+
console.log("POST <%= api_url %>/run/"+job);
|
12
|
+
$.post("<%= api_url %>/run/"+job, data);
|
13
13
|
}
|
14
14
|
</script>
|
15
15
|
<style>
|
data/robot_sweatshop.eye
CHANGED
@@ -42,10 +42,10 @@ Eye.application :robot_sweatshop do
|
|
42
42
|
start_command "#{__dir__}/bin/sweatshop-overseer"
|
43
43
|
daemonize true
|
44
44
|
end
|
45
|
-
process :
|
46
|
-
pid_file "#{PID_PATH}/
|
47
|
-
stdall "#{LOG_PATH}/
|
48
|
-
start_command "#{__dir__}/bin/sweatshop-
|
45
|
+
process :api do
|
46
|
+
pid_file "#{PID_PATH}/api.pid"
|
47
|
+
stdall "#{LOG_PATH}/api.log"
|
48
|
+
start_command "#{__dir__}/bin/sweatshop-api"
|
49
49
|
daemonize true
|
50
50
|
end
|
51
51
|
process :assembler do
|
data/robot_sweatshop.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |gem|
|
2
2
|
gem.name = 'robot_sweatshop'
|
3
|
-
gem.version = '0.4.
|
3
|
+
gem.version = '0.4.11'
|
4
4
|
gem.licenses = 'MIT'
|
5
5
|
gem.authors = ['Justin Scott']
|
6
6
|
gem.email = 'jvscott@gmail.com'
|
@@ -15,7 +15,6 @@ Gem::Specification.new do |gem|
|
|
15
15
|
|
16
16
|
gem.required_ruby_version = '>= 2.1'
|
17
17
|
|
18
|
-
gem.add_runtime_dependency 'bundler'
|
19
18
|
gem.add_runtime_dependency 'faker'
|
20
19
|
gem.add_runtime_dependency 'commander'
|
21
20
|
gem.add_runtime_dependency 'eye'
|
data/test/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
Please run these with `bundle exec`. There's so many self-references that it just makes sense.
|
2
|
+
|
1
3
|
You can run individual `_spec.rb` files with Ruby or `all.rb` to go through each. There's no way to run everything together with the way processes are set up but this hasn't been a problem so far.
|
2
4
|
|
3
|
-
Because I'm lazy, TestProcess::Stub uses the UNIX `lsof` to check if ports are in use. There's probably a better, more portable way to do this.
|
5
|
+
Because I'm lazy, `TestProcess::Stub.running?` uses the UNIX `lsof` to check if ports are in use. There's probably a better, more portable way to do this.
|
data/test/all.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'bundler/setup'
|
2
1
|
require 'kintama'
|
3
2
|
require 'ezmq'
|
4
3
|
require 'oj'
|
@@ -10,7 +9,7 @@ require_relative 'shared/helpers'
|
|
10
9
|
$stdout.sync = true
|
11
10
|
|
12
11
|
Kintama.on_start do
|
13
|
-
@pids = TestProcess.start %w(
|
12
|
+
@pids = TestProcess.start %w(api)
|
14
13
|
sleep $a_while
|
15
14
|
end
|
16
15
|
|
@@ -26,7 +25,7 @@ given 'the HTTP Input' do
|
|
26
25
|
context "POSTing #{format} data" do
|
27
26
|
setup do
|
28
27
|
@conveyor = TestProcess.stub :conveyor
|
29
|
-
url =
|
28
|
+
url = job_running_url for_job: 'test_job'
|
30
29
|
Timeout.timeout($a_while) do
|
31
30
|
@response = HTTP.post url, body: example_raw_payload(format)
|
32
31
|
end
|
data/test/conveyor_spec.rb
CHANGED
data/test/end-to-end_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require 'bundler/setup'
|
2
1
|
require 'kintama'
|
3
2
|
require 'ezmq'
|
4
3
|
require 'http'
|
4
|
+
require 'timeout'
|
5
5
|
require_relative 'shared/scaffolding'
|
6
6
|
require_relative 'shared/helpers'
|
7
7
|
|
@@ -11,7 +11,7 @@ describe 'Robot Sweatshop' do
|
|
11
11
|
|
12
12
|
setup do
|
13
13
|
Setup.empty_conveyor
|
14
|
-
@pids = TestProcess.start %w(
|
14
|
+
@pids = TestProcess.start %w(api conveyor payload-parser job-dictionary assembler worker)
|
15
15
|
Setup.populate_test_jobs
|
16
16
|
sleep $a_while
|
17
17
|
end
|
@@ -20,10 +20,10 @@ describe 'Robot Sweatshop' do
|
|
20
20
|
TestProcess.stop @pids
|
21
21
|
end
|
22
22
|
|
23
|
-
context "POSTing data to the
|
23
|
+
context "POSTing data to the API" do
|
24
24
|
setup do
|
25
25
|
clear_worker_output
|
26
|
-
url =
|
26
|
+
url = job_running_url for_job: 'test_job'
|
27
27
|
Timeout.timeout($a_while) { @response = HTTP.post url, body: example_raw_payload('JSON') }
|
28
28
|
end
|
29
29
|
|
data/test/job_dictionary_spec.rb
CHANGED
data/test/overseer_spec.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'bundler/setup'
|
2
1
|
require 'kintama'
|
3
2
|
require 'timeout'
|
4
3
|
require 'http'
|
@@ -24,7 +23,7 @@ given 'the Overseer' do
|
|
24
23
|
should('respond') { assert_equal 200, @response.code }
|
25
24
|
should('link to process logs') do
|
26
25
|
page = Nokogiri::HTML(@response.to_s)
|
27
|
-
links = page.css('a').select { |link| link.text.include? '
|
26
|
+
links = page.css('a').select { |link| link.text.include? 'overseer' }
|
28
27
|
assert_not_equal 0, links.count
|
29
28
|
end
|
30
29
|
should('have a form for running jobs') do
|
@@ -37,12 +36,12 @@ given 'the Overseer' do
|
|
37
36
|
setup { Timeout.timeout($a_while) { @response = HTTP.get overseer_url('log') } }
|
38
37
|
should('redirect') { assert_equal 303, @response.code }
|
39
38
|
end
|
40
|
-
context '/log?for=
|
41
|
-
setup { Timeout.timeout($a_while) { @response = HTTP.get overseer_url('log?for=
|
39
|
+
context '/log?for=overseer' do
|
40
|
+
setup { Timeout.timeout($a_while) { @response = HTTP.get overseer_url('log?for=overseer') } }
|
42
41
|
should('respond') { assert_equal 200, @response.code }
|
43
42
|
should('show logs from file') do
|
44
43
|
page = Nokogiri::HTML(@response.to_s)
|
45
|
-
log = File.read "#{configatron.logfile_path}/
|
44
|
+
log = File.read "#{configatron.logfile_path}/overseer.log"
|
46
45
|
output = page.css('.raw_log').first
|
47
46
|
assert_equal log, output.text, 'Expected raw log output'
|
48
47
|
end
|
data/test/payload_parser_spec.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'bundler/setup'
|
2
1
|
require 'yaml'
|
3
2
|
require 'oj'
|
4
3
|
require 'robot_sweatshop/payload'
|
@@ -10,8 +9,8 @@ module InputHelper
|
|
10
9
|
payload_strings[format.downcase]
|
11
10
|
end
|
12
11
|
|
13
|
-
def
|
14
|
-
"http://localhost:#{configatron.
|
12
|
+
def job_running_url(for_job: 'test_job')
|
13
|
+
"http://localhost:#{configatron.api_port}/run/#{for_job}"
|
15
14
|
end
|
16
15
|
|
17
16
|
def conveyor_enqueue(type)
|
data/test/shared/scaffolding.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'bundler/setup'
|
2
1
|
require 'fileutils'
|
3
2
|
require 'oj'
|
4
3
|
require 'robot_sweatshop/config'
|
@@ -28,9 +27,9 @@ module TestProcess
|
|
28
27
|
def self.start(name_list)
|
29
28
|
pids = []
|
30
29
|
name_list.each do |name|
|
31
|
-
|
32
|
-
|
33
|
-
pids.push spawn(
|
30
|
+
command = File.expand_path "#{__dir__}/../../bin/sweatshop-#{name}"
|
31
|
+
command += ' testingid' if name == 'worker'
|
32
|
+
pids.push spawn(command, out: '/dev/null', err: '/dev/null')
|
34
33
|
end
|
35
34
|
pids
|
36
35
|
end
|
data/test/worker_spec.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: robot_sweatshop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Scott
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: faker
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -280,9 +266,9 @@ description: A lightweight, nonopinionated CI server.
|
|
280
266
|
email: jvscott@gmail.com
|
281
267
|
executables:
|
282
268
|
- sweatshop
|
269
|
+
- sweatshop-api
|
283
270
|
- sweatshop-assembler
|
284
271
|
- sweatshop-conveyor
|
285
|
-
- sweatshop-input
|
286
272
|
- sweatshop-job-dictionary
|
287
273
|
- sweatshop-overseer
|
288
274
|
- sweatshop-payload-parser
|
@@ -292,15 +278,16 @@ extra_rdoc_files: []
|
|
292
278
|
files:
|
293
279
|
- ".gitignore"
|
294
280
|
- ".rubocop.yml"
|
281
|
+
- CHANGELOG.md
|
295
282
|
- Gemfile
|
296
283
|
- Gemfile.lock
|
297
284
|
- LICENSE
|
298
285
|
- README.md
|
299
286
|
- Rakefile
|
300
287
|
- bin/sweatshop
|
288
|
+
- bin/sweatshop-api
|
301
289
|
- bin/sweatshop-assembler
|
302
290
|
- bin/sweatshop-conveyor
|
303
|
-
- bin/sweatshop-input
|
304
291
|
- bin/sweatshop-job-dictionary
|
305
292
|
- bin/sweatshop-overseer
|
306
293
|
- bin/sweatshop-payload-parser
|
@@ -331,6 +318,7 @@ files:
|
|
331
318
|
- robot_sweatshop.gemspec
|
332
319
|
- test/README.md
|
333
320
|
- test/all.rb
|
321
|
+
- test/api_spec.rb
|
334
322
|
- test/assembler_spec.rb
|
335
323
|
- test/conveyor_spec.rb
|
336
324
|
- test/data/custom_script
|
@@ -342,7 +330,6 @@ files:
|
|
342
330
|
- test/data/test_job.yaml
|
343
331
|
- test/data/weird_job.yaml
|
344
332
|
- test/end-to-end_spec.rb
|
345
|
-
- test/input_spec.rb
|
346
333
|
- test/job_dictionary_spec.rb
|
347
334
|
- test/overseer_spec.rb
|
348
335
|
- test/payload_parser_spec.rb
|