ampel_extase 0.0.0
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 +7 -0
- data/.gitignore +9 -0
- data/Gemfile +5 -0
- data/README.md +0 -0
- data/Rakefile +27 -0
- data/VERSION +1 -0
- data/ampel_extase.gemspec +50 -0
- data/bin/ampel_control +16 -0
- data/lib/ampel_extase.rb +6 -0
- data/lib/ampel_extase/build_state.rb +32 -0
- data/lib/ampel_extase/controller.rb +106 -0
- data/lib/ampel_extase/jenkins_client.rb +52 -0
- data/lib/ampel_extase/light_switcher.rb +32 -0
- data/lib/ampel_extase/version.rb +8 -0
- data/spec/ampel_extase/jenkins_client_spec.rb +5 -0
- data/spec/ampel_extase/light_switcher_spec.rb +5 -0
- data/spec/spec_helper.rb +9 -0
- metadata +158 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 022ff48198a22a7cfe5cc1420e65700947e0172f
|
4
|
+
data.tar.gz: 2f3be2fc324ec1db920c33eec571df7b0f017e99
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 609b536235aa262677b606e148e05beb87594fbe356181391bad36a3265ba13ab0f160e9fdc9ab053f79917930c1ddf9d7f225aa375a51e9b3a3889d945ea3ba
|
7
|
+
data.tar.gz: 3e8b6f53050e98aa865f977c5c6a410f351bbe5b566780621d667f35d283318f54e5520f3f0fac5db8b4ac155b12c4afe1cd9c9acec6117bce9a6d366587f916
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
File without changes
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# vim: set filetype=ruby et sw=2 ts=2:
|
2
|
+
|
3
|
+
require 'gem_hadar'
|
4
|
+
|
5
|
+
GemHadar do
|
6
|
+
name 'ampel_extase'
|
7
|
+
author 'Florian Frank'
|
8
|
+
email 'flori@ping.de'
|
9
|
+
homepage "http://github.com/flori/#{name}"
|
10
|
+
summary 'Library to control the build traffic light'
|
11
|
+
description "#{summary}. Yes, we can…"
|
12
|
+
licenses << 'GPL-2'
|
13
|
+
test_dir 'spec'
|
14
|
+
ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock', '.rvmrc', 'coverage',
|
15
|
+
'tags', '.bundle', '.DS_Store', '.build'
|
16
|
+
|
17
|
+
readme 'README.md'
|
18
|
+
executables.merge Dir['bin/*'].map { |x| File.basename(x) }
|
19
|
+
|
20
|
+
dependency 'tins', '~>1.0'
|
21
|
+
dependency 'socket_switcher'
|
22
|
+
development_dependency 'simplecov', '~>0.9'
|
23
|
+
development_dependency 'rspec', '~>3.0'
|
24
|
+
development_dependency 'byebug'
|
25
|
+
|
26
|
+
default_task_dependencies :spec
|
27
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.0
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# stub: ampel_extase 0.0.0 ruby lib
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "ampel_extase"
|
6
|
+
s.version = "0.0.0"
|
7
|
+
|
8
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
|
+
s.require_paths = ["lib"]
|
10
|
+
s.authors = ["Florian Frank"]
|
11
|
+
s.date = "2015-01-02"
|
12
|
+
s.description = "Library to control the build traffic light. Yes, we can\u{2026}"
|
13
|
+
s.email = "flori@ping.de"
|
14
|
+
s.executables = ["ampel_control"]
|
15
|
+
s.extra_rdoc_files = ["README.md", "lib/ampel_extase.rb", "lib/ampel_extase/build_state.rb", "lib/ampel_extase/controller.rb", "lib/ampel_extase/jenkins_client.rb", "lib/ampel_extase/light_switcher.rb", "lib/ampel_extase/version.rb"]
|
16
|
+
s.files = [".gitignore", "Gemfile", "README.md", "Rakefile", "VERSION", "ampel_extase.gemspec", "bin/ampel_control", "lib/ampel_extase.rb", "lib/ampel_extase/build_state.rb", "lib/ampel_extase/controller.rb", "lib/ampel_extase/jenkins_client.rb", "lib/ampel_extase/light_switcher.rb", "lib/ampel_extase/version.rb", "spec/ampel_extase/jenkins_client_spec.rb", "spec/ampel_extase/light_switcher_spec.rb", "spec/spec_helper.rb"]
|
17
|
+
s.homepage = "http://github.com/flori/ampel_extase"
|
18
|
+
s.licenses = ["GPL-2"]
|
19
|
+
s.rdoc_options = ["--title", "AmpelExtase - Library to control the build traffic light", "--main", "README.md"]
|
20
|
+
s.rubygems_version = "2.2.2"
|
21
|
+
s.summary = "Library to control the build traffic light"
|
22
|
+
s.test_files = ["spec/ampel_extase/jenkins_client_spec.rb", "spec/ampel_extase/light_switcher_spec.rb", "spec/spec_helper.rb"]
|
23
|
+
|
24
|
+
if s.respond_to? :specification_version then
|
25
|
+
s.specification_version = 4
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_development_dependency(%q<gem_hadar>, ["~> 1.0.0"])
|
29
|
+
s.add_development_dependency(%q<simplecov>, ["~> 0.9"])
|
30
|
+
s.add_development_dependency(%q<rspec>, ["~> 3.0"])
|
31
|
+
s.add_development_dependency(%q<byebug>, [">= 0"])
|
32
|
+
s.add_runtime_dependency(%q<tins>, ["~> 1.0"])
|
33
|
+
s.add_runtime_dependency(%q<socket_switcher>, [">= 0"])
|
34
|
+
else
|
35
|
+
s.add_dependency(%q<gem_hadar>, ["~> 1.0.0"])
|
36
|
+
s.add_dependency(%q<simplecov>, ["~> 0.9"])
|
37
|
+
s.add_dependency(%q<rspec>, ["~> 3.0"])
|
38
|
+
s.add_dependency(%q<byebug>, [">= 0"])
|
39
|
+
s.add_dependency(%q<tins>, ["~> 1.0"])
|
40
|
+
s.add_dependency(%q<socket_switcher>, [">= 0"])
|
41
|
+
end
|
42
|
+
else
|
43
|
+
s.add_dependency(%q<gem_hadar>, ["~> 1.0.0"])
|
44
|
+
s.add_dependency(%q<simplecov>, ["~> 0.9"])
|
45
|
+
s.add_dependency(%q<rspec>, ["~> 3.0"])
|
46
|
+
s.add_dependency(%q<byebug>, [">= 0"])
|
47
|
+
s.add_dependency(%q<tins>, ["~> 1.0"])
|
48
|
+
s.add_dependency(%q<socket_switcher>, [">= 0"])
|
49
|
+
end
|
50
|
+
end
|
data/bin/ampel_control
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'ampel_extase'
|
4
|
+
|
5
|
+
serial = ENV['SERIAL'] or
|
6
|
+
fail 'need env var SERIAL for path to serial port'
|
7
|
+
jenkins_url = ENV['JENKINS_URL'] or
|
8
|
+
fail 'need env var JENKINS_URL of the form http://test2.local:8080/job/foo'
|
9
|
+
sleep_duration = (ENV['SLEEP'] || 10).to_i
|
10
|
+
|
11
|
+
AmpelExtase::Controller.new(
|
12
|
+
serial,
|
13
|
+
jenkins_url,
|
14
|
+
debug: true,
|
15
|
+
sleep: sleep_duration,
|
16
|
+
).start
|
data/lib/ampel_extase.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
class AmpelExtase::BuildState
|
2
|
+
def self.for(a = nil)
|
3
|
+
a ||= [ "N/A", nil ]
|
4
|
+
new(*a)
|
5
|
+
end
|
6
|
+
|
7
|
+
def initialize(last_result, is_building)
|
8
|
+
@last_result, @is_building = last_result, is_building
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :last_result
|
12
|
+
|
13
|
+
def building?
|
14
|
+
!!@is_building
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_a
|
18
|
+
return @last_result, @is_building
|
19
|
+
end
|
20
|
+
|
21
|
+
def ==(other)
|
22
|
+
to_a == other.to_a
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
if building?
|
27
|
+
"#{@last_result} (building)"
|
28
|
+
else
|
29
|
+
@last_result.to_s
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'ampel_extase/jenkins_client'
|
4
|
+
require 'ampel_extase/light_switcher'
|
5
|
+
require 'ampel_extase/build_state'
|
6
|
+
|
7
|
+
class AmpelExtase::Controller
|
8
|
+
def initialize(serial, jenkins_url, debug: false, sleep: 10)
|
9
|
+
@jenkins = AmpelExtase::JenkinsClient.new(jenkins_url, debug: debug)
|
10
|
+
check_jenkins
|
11
|
+
@lights = AmpelExtase::LightSwitcher.new(serial, debug: debug)
|
12
|
+
check_lights
|
13
|
+
@sleep = sleep
|
14
|
+
@build_state = AmpelExtase::BuildState.for
|
15
|
+
end
|
16
|
+
|
17
|
+
def start
|
18
|
+
puts "starting controller loop"
|
19
|
+
loop do
|
20
|
+
begin
|
21
|
+
perform
|
22
|
+
rescue => e
|
23
|
+
warn "Caught: #{e.class}: #{e}\n#{e.backtrace * ?\n}"
|
24
|
+
crashed
|
25
|
+
end
|
26
|
+
sleep_duration
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def sleep_duration
|
33
|
+
puts "sleep for #@sleep seconds"
|
34
|
+
sleep @sleep
|
35
|
+
end
|
36
|
+
|
37
|
+
def perform
|
38
|
+
@crashed = false
|
39
|
+
on_state_change do |state|
|
40
|
+
perform_switch state
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def perform_switch(state)
|
45
|
+
case state.last_result
|
46
|
+
when 'SUCCESS'
|
47
|
+
@lights.green.on
|
48
|
+
@lights.red.off
|
49
|
+
when 'FAILURE', 'ABORTED'
|
50
|
+
@lights.red.on
|
51
|
+
if state.building?
|
52
|
+
@lights.green.on
|
53
|
+
else
|
54
|
+
@lights.green.off
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def on_state_change
|
60
|
+
new_state = AmpelExtase::BuildState.for [ last_result, building? ]
|
61
|
+
if new_state == @build_state
|
62
|
+
puts "state did not change, is still #@build_state => do nothing"
|
63
|
+
else
|
64
|
+
puts "state changed from #@build_state to #{new_state} => taking action"
|
65
|
+
yield new_state
|
66
|
+
end
|
67
|
+
ensure
|
68
|
+
@build_state = new_state
|
69
|
+
end
|
70
|
+
|
71
|
+
def last_result
|
72
|
+
@jenkins.fetch_build(:last_completed_build)['result']
|
73
|
+
end
|
74
|
+
|
75
|
+
def building?
|
76
|
+
@jenkins.fetch_build(:last_build)['building']
|
77
|
+
end
|
78
|
+
|
79
|
+
def crashed
|
80
|
+
return if @crashed
|
81
|
+
for light in @lights
|
82
|
+
light.off
|
83
|
+
end
|
84
|
+
rescue
|
85
|
+
ensure
|
86
|
+
@crashed = true
|
87
|
+
end
|
88
|
+
|
89
|
+
def check_lights
|
90
|
+
puts "checking lights configuration"
|
91
|
+
for light in @lights
|
92
|
+
light.on
|
93
|
+
end
|
94
|
+
sleep 1
|
95
|
+
for light in @lights
|
96
|
+
light.off
|
97
|
+
end
|
98
|
+
sleep 1
|
99
|
+
puts "OK"
|
100
|
+
end
|
101
|
+
|
102
|
+
def check_jenkins
|
103
|
+
puts "checking jenkins configuration"
|
104
|
+
@jenkins.fetch and puts "OK"
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'tins/xt'
|
3
|
+
require 'json'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
module AmpelExtase
|
7
|
+
class JenkinsClient
|
8
|
+
def initialize(url, debug: false)
|
9
|
+
url = URI.parse(url.to_s) unless URI::HTTP === url
|
10
|
+
@url, @debug = url, debug
|
11
|
+
end
|
12
|
+
|
13
|
+
def api_url(*path)
|
14
|
+
[ @url, *path, 'api', 'json' ].compact * '/'
|
15
|
+
end
|
16
|
+
|
17
|
+
def console_url(number)
|
18
|
+
[ @url, number, 'consoleText' ] * '/'
|
19
|
+
end
|
20
|
+
|
21
|
+
def fetch(url = api_url)
|
22
|
+
@debug and STDERR.puts "Fetching #{url.to_s.inspect}."
|
23
|
+
JSON open(url).read
|
24
|
+
rescue => e
|
25
|
+
e.message << " for #{url.inspect}"
|
26
|
+
raise
|
27
|
+
end
|
28
|
+
|
29
|
+
def fetch_build(type)
|
30
|
+
url = if sym = type.ask_and_send(:to_sym)
|
31
|
+
key = sym.to_s.camelize(:lower)
|
32
|
+
key[0, 1] = key[0, 1].downcase
|
33
|
+
api_url(key)
|
34
|
+
else
|
35
|
+
api_url(type)
|
36
|
+
end
|
37
|
+
fetch url
|
38
|
+
end
|
39
|
+
|
40
|
+
def fetch_build_revision(type)
|
41
|
+
data = fetch_build(type)
|
42
|
+
data['actions'].find { |x| x.keys.include?('lastBuiltRevision') }['lastBuiltRevision']['SHA1']
|
43
|
+
rescue
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
|
47
|
+
def fetch_console_text(type)
|
48
|
+
build = fetch_build(type)
|
49
|
+
open(console_url(build['number'])).read
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'socket_switcher'
|
2
|
+
|
3
|
+
module AmpelExtase
|
4
|
+
class LightSwitcher
|
5
|
+
def initialize(serial, debug: false)
|
6
|
+
@port = SocketSwitcher::Port.new(serial, debug: debug)
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :port
|
10
|
+
|
11
|
+
def green
|
12
|
+
@port.device(0)
|
13
|
+
end
|
14
|
+
|
15
|
+
def red
|
16
|
+
@port.device(1)
|
17
|
+
end
|
18
|
+
|
19
|
+
def aux
|
20
|
+
@port.device(2)
|
21
|
+
end
|
22
|
+
|
23
|
+
def each(&block)
|
24
|
+
[
|
25
|
+
:green,
|
26
|
+
:red,
|
27
|
+
# not in use for now :aux,
|
28
|
+
].map { |color| __send__(color) }.each(&block)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ampel_extase
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Florian Frank
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: gem_hadar
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.0.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: simplecov
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.9'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.9'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: byebug
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: tins
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: socket_switcher
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: Library to control the build traffic light. Yes, we can…
|
98
|
+
email: flori@ping.de
|
99
|
+
executables:
|
100
|
+
- ampel_control
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files:
|
103
|
+
- README.md
|
104
|
+
- lib/ampel_extase.rb
|
105
|
+
- lib/ampel_extase/build_state.rb
|
106
|
+
- lib/ampel_extase/controller.rb
|
107
|
+
- lib/ampel_extase/jenkins_client.rb
|
108
|
+
- lib/ampel_extase/light_switcher.rb
|
109
|
+
- lib/ampel_extase/version.rb
|
110
|
+
files:
|
111
|
+
- ".gitignore"
|
112
|
+
- Gemfile
|
113
|
+
- README.md
|
114
|
+
- Rakefile
|
115
|
+
- VERSION
|
116
|
+
- ampel_extase.gemspec
|
117
|
+
- bin/ampel_control
|
118
|
+
- lib/ampel_extase.rb
|
119
|
+
- lib/ampel_extase/build_state.rb
|
120
|
+
- lib/ampel_extase/controller.rb
|
121
|
+
- lib/ampel_extase/jenkins_client.rb
|
122
|
+
- lib/ampel_extase/light_switcher.rb
|
123
|
+
- lib/ampel_extase/version.rb
|
124
|
+
- spec/ampel_extase/jenkins_client_spec.rb
|
125
|
+
- spec/ampel_extase/light_switcher_spec.rb
|
126
|
+
- spec/spec_helper.rb
|
127
|
+
homepage: http://github.com/flori/ampel_extase
|
128
|
+
licenses:
|
129
|
+
- GPL-2
|
130
|
+
metadata: {}
|
131
|
+
post_install_message:
|
132
|
+
rdoc_options:
|
133
|
+
- "--title"
|
134
|
+
- AmpelExtase - Library to control the build traffic light
|
135
|
+
- "--main"
|
136
|
+
- README.md
|
137
|
+
require_paths:
|
138
|
+
- lib
|
139
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
145
|
+
requirements:
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: '0'
|
149
|
+
requirements: []
|
150
|
+
rubyforge_project:
|
151
|
+
rubygems_version: 2.2.2
|
152
|
+
signing_key:
|
153
|
+
specification_version: 4
|
154
|
+
summary: Library to control the build traffic light
|
155
|
+
test_files:
|
156
|
+
- spec/ampel_extase/jenkins_client_spec.rb
|
157
|
+
- spec/ampel_extase/light_switcher_spec.rb
|
158
|
+
- spec/spec_helper.rb
|