dynport_tools 0.2.18 → 0.2.19
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/dynport_tools.gemspec +6 -2
- data/lib/dynport_tools.rb +1 -1
- data/lib/dynport_tools/jenkins.rb +68 -11
- data/lib/dynport_tools/job_dsl.rb +114 -0
- data/lib/dynport_tools/log_tracer.rb +42 -0
- data/spec/dynport_tools/jenkins_spec.rb +5 -0
- data/spec/dynport_tools/job_dsl_spec.rb +301 -0
- data/spec/dynport_tools/log_tracer_spec.rb +36 -0
- metadata +8 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.19
|
data/dynport_tools.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dynport_tools}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.19"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Tobias Schwab"]
|
12
|
-
s.date = %q{2011-09-
|
12
|
+
s.date = %q{2011-09-14}
|
13
13
|
s.description = %q{Collection of various tools}
|
14
14
|
s.email = %q{tobias.schwab@dynport.de}
|
15
15
|
s.executables = ["xmldiff", "redis_dumper"]
|
@@ -40,6 +40,8 @@ Gem::Specification.new do |s|
|
|
40
40
|
"lib/dynport_tools/eta.rb",
|
41
41
|
"lib/dynport_tools/have_attributes.rb",
|
42
42
|
"lib/dynport_tools/jenkins.rb",
|
43
|
+
"lib/dynport_tools/job_dsl.rb",
|
44
|
+
"lib/dynport_tools/log_tracer.rb",
|
43
45
|
"lib/dynport_tools/redis_dumper.rb",
|
44
46
|
"lib/dynport_tools/redis_q.rb",
|
45
47
|
"lib/dynport_tools/xml_file.rb",
|
@@ -50,6 +52,8 @@ Gem::Specification.new do |s|
|
|
50
52
|
"spec/dynport_tools/eta_spec.rb",
|
51
53
|
"spec/dynport_tools/have_attributes_spec.rb",
|
52
54
|
"spec/dynport_tools/jenkins_spec.rb",
|
55
|
+
"spec/dynport_tools/job_dsl_spec.rb",
|
56
|
+
"spec/dynport_tools/log_tracer_spec.rb",
|
53
57
|
"spec/dynport_tools/redis_dumper_spec.rb",
|
54
58
|
"spec/dynport_tools/redis_q_spec.rb",
|
55
59
|
"spec/dynport_tools/xml_file_spec.rb",
|
data/lib/dynport_tools.rb
CHANGED
@@ -8,4 +8,4 @@ require "cgi"
|
|
8
8
|
require "term/ansicolor"
|
9
9
|
require "diff/lcs"
|
10
10
|
|
11
|
-
%w(deep_merger differ jenkins redis_dumper xml_file have_attributes redis_q eta ascii_table embedded_redis).map { |m| require "dynport_tools/#{m}" }
|
11
|
+
%w(deep_merger differ jenkins redis_dumper xml_file have_attributes redis_q eta ascii_table embedded_redis job_dsl log_tracer).map { |m| require "dynport_tools/#{m}" }
|
@@ -145,8 +145,10 @@ class DynportTools::Jenkins
|
|
145
145
|
end
|
146
146
|
|
147
147
|
class Project
|
148
|
-
attr_accessor :name, :commands, :crontab_pattern, :days_to_keep, :num_to_keep, :node, :child_projects, :locks, :disabled, :description,
|
149
|
-
|
148
|
+
attr_accessor :name, :commands, :crontab_pattern, :days_to_keep, :num_to_keep, :node, :child_projects, :locks, :disabled, :description,
|
149
|
+
:email_addresses, :git_repository
|
150
|
+
DEFAULT_SCM = "hudson.scm.NullSCM"
|
151
|
+
GIT_SCM = "hudson.plugins.git.GitSCM"
|
150
152
|
|
151
153
|
def initialize(name = nil)
|
152
154
|
self.name = name
|
@@ -160,22 +162,77 @@ class DynportTools::Jenkins
|
|
160
162
|
Digest::MD5.hexdigest(to_xml)
|
161
163
|
end
|
162
164
|
|
165
|
+
def log_rotate_xml(node)
|
166
|
+
node.logRotator do
|
167
|
+
node.daysToKeep days_to_keep || -1
|
168
|
+
node.numToKeep num_to_keep || -1
|
169
|
+
node.artifactDaysToKeep -1
|
170
|
+
node.artifactNumToKeep -1
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def git_repository_xml(xml)
|
175
|
+
xml.send("org.spearce.jgit.transport.RemoteConfig") do
|
176
|
+
xml.string "origin"
|
177
|
+
xml.int 5
|
178
|
+
xml.string "fetch"
|
179
|
+
xml.string "+refs/heads/*:refs/remotes/origin/*"
|
180
|
+
xml.string "receivepack"
|
181
|
+
xml.string "git-upload-pack"
|
182
|
+
xml.string "uploadpack"
|
183
|
+
xml.string "git-upload-pack"
|
184
|
+
xml.string "url"
|
185
|
+
xml.string git_repository
|
186
|
+
xml.string "tagopt"
|
187
|
+
xml.string
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def git_options_xml(xml)
|
192
|
+
xml.mergeOptions
|
193
|
+
xml.recursiveSubmodules false
|
194
|
+
xml.doGenerateSubmoduleConfigurations false
|
195
|
+
xml.authorOrCommitter false
|
196
|
+
xml.clean false
|
197
|
+
xml.wipeOutWorkspace false
|
198
|
+
xml.pruneBranches false
|
199
|
+
xml.buildChooser(:class => "hudson.plugins.git.util.DefaultBuildChooser")
|
200
|
+
xml.gitTool "Default"
|
201
|
+
xml.submoduleCfg(:class => "list")
|
202
|
+
xml.relativeTargetDir
|
203
|
+
xml.excludedRegion
|
204
|
+
xml.excludedUsers
|
205
|
+
xml.skipTag false
|
206
|
+
end
|
207
|
+
|
208
|
+
def git_xml(xml)
|
209
|
+
xml.scm(:class => GIT_SCM) do
|
210
|
+
xml.config_version 1
|
211
|
+
xml.remoteRepositories do
|
212
|
+
git_repository_xml(xml)
|
213
|
+
end
|
214
|
+
xml.branches do
|
215
|
+
xml.send("hudson.plugins.git.BranchSpec") do
|
216
|
+
xml.name "master"
|
217
|
+
end
|
218
|
+
end
|
219
|
+
git_options_xml(xml)
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
163
223
|
def to_xml
|
164
224
|
Nokogiri::XML::Builder.new(:encoding => "UTF-8") do |xml|
|
165
225
|
xml.project do
|
166
226
|
xml.actions
|
167
227
|
xml.description *[description].compact
|
168
|
-
if days_to_keep || num_to_keep
|
169
|
-
xml.logRotator do
|
170
|
-
xml.daysToKeep days_to_keep || -1
|
171
|
-
xml.numToKeep num_to_keep || -1
|
172
|
-
xml.artifactDaysToKeep -1
|
173
|
-
xml.artifactNumToKeep -1
|
174
|
-
end
|
175
|
-
end
|
228
|
+
log_rotate_xml(xml) if days_to_keep || num_to_keep
|
176
229
|
xml.keepDependencies false
|
177
230
|
xml.properties
|
178
|
-
|
231
|
+
if git_repository
|
232
|
+
git_xml(xml)
|
233
|
+
else
|
234
|
+
xml.scm(:class => DEFAULT_SCM)
|
235
|
+
end
|
179
236
|
if node
|
180
237
|
xml.assignedNode node
|
181
238
|
xml.canRoam false
|
@@ -0,0 +1,114 @@
|
|
1
|
+
class Jenkins
|
2
|
+
class JobDSL
|
3
|
+
class << self
|
4
|
+
attr_accessor :jobs
|
5
|
+
|
6
|
+
def setup(namespace = :default, &block)
|
7
|
+
dsl = self.new
|
8
|
+
dsl.instance_eval(&block) if block_given?
|
9
|
+
self.jobs ||= {}
|
10
|
+
self.jobs[namespace] ||= Array.new
|
11
|
+
self.jobs[namespace] += dsl.jobs
|
12
|
+
self.jobs[namespace]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_accessor :name, :jobs, :current_scope, :current_prefix
|
17
|
+
|
18
|
+
def initialize(options = {})
|
19
|
+
options.each do |key, value|
|
20
|
+
self.send(:"#{key}=", value) if self.respond_to?(:"#{key}=")
|
21
|
+
end
|
22
|
+
self.jobs = []
|
23
|
+
self.current_scope = {}
|
24
|
+
end
|
25
|
+
|
26
|
+
MULTIPLE = [:notify, :cron_patterns, :locks, :commands]
|
27
|
+
|
28
|
+
[
|
29
|
+
:node, :disabled, :days_to_keep, :num_to_keep, :notify, :cron_patterns, :locks, :commands, :ordered, :rails_root,
|
30
|
+
:rails_env
|
31
|
+
].each do |method|
|
32
|
+
attr_writer method
|
33
|
+
|
34
|
+
define_method(method) do |*values, &block|
|
35
|
+
self.setter_or_getter(method, *values, &block)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
alias_method :cron_pattern, :cron_patterns
|
40
|
+
alias_method :lock, :locks
|
41
|
+
alias_method :command, :commands
|
42
|
+
alias_method :prefix, :ordered
|
43
|
+
|
44
|
+
def disabled!(&block)
|
45
|
+
disabled(true, &block)
|
46
|
+
end
|
47
|
+
|
48
|
+
def use_rails3!
|
49
|
+
@rails3 = true
|
50
|
+
end
|
51
|
+
|
52
|
+
def use_bundle_exec!
|
53
|
+
@bundle_exec = true
|
54
|
+
end
|
55
|
+
|
56
|
+
def rails_command(cmd, options = {})
|
57
|
+
rails_command_or_script(%("#{cmd.gsub('"', '\\"')}"), options)
|
58
|
+
end
|
59
|
+
|
60
|
+
def rails_script(*args)
|
61
|
+
rails_command_or_script(*args)
|
62
|
+
end
|
63
|
+
|
64
|
+
def rake_task(task, options = {})
|
65
|
+
options[:env] = (options[:env] || {}).merge("RAILS_ENV" => options[:rails_env]) if options[:rails_env]
|
66
|
+
command "cd #{rails_root} && " + command_with_env("rake #{task}", options[:env])
|
67
|
+
end
|
68
|
+
|
69
|
+
def rails_command_or_script(cmd_or_script, options = {})
|
70
|
+
raise "rails_root must be set" if rails_root.nil?
|
71
|
+
command %(cd #{rails_root} && #{command_with_env(runner_command(options[:rails_env]), options[:env])} #{cmd_or_script})
|
72
|
+
end
|
73
|
+
|
74
|
+
def runner_command(env = nil)
|
75
|
+
env ||= rails_env
|
76
|
+
[@rails3 ? "rails runner" : "./script/runner", env ? "-e #{env}" : nil].compact.join(" ")
|
77
|
+
end
|
78
|
+
|
79
|
+
def command_with_env(cmd, env = {})
|
80
|
+
((env || {}).sort.map { |key, value| "#{key}=#{value}" } + [@bundle_exec ? "bundle exec" : nil, cmd].compact).join(" ")
|
81
|
+
end
|
82
|
+
|
83
|
+
def with(options, &block)
|
84
|
+
old_scope = self.current_scope
|
85
|
+
self.current_scope = self.current_scope.merge(options)
|
86
|
+
self.instance_eval(&block)
|
87
|
+
self.current_scope = old_scope
|
88
|
+
end
|
89
|
+
|
90
|
+
def current_prefix
|
91
|
+
self.current_scope[:ordered] || self.current_scope[:prefix]
|
92
|
+
end
|
93
|
+
|
94
|
+
def setter_or_getter(key, *values, &block)
|
95
|
+
value = MULTIPLE.include?(key) ? values : values.first
|
96
|
+
if block_given?
|
97
|
+
with(key => value, &block)
|
98
|
+
elsif ![[], nil].include?(value)
|
99
|
+
self.send(:"#{key}=", value)
|
100
|
+
end
|
101
|
+
self.instance_variable_get("@#{key}")
|
102
|
+
end
|
103
|
+
|
104
|
+
def job(name, &block)
|
105
|
+
if current_prefix
|
106
|
+
@prefix_indexes ||= Hash.new(0)
|
107
|
+
name = "#{current_prefix}%03d %s" % [@prefix_indexes[current_prefix] += 1, name]
|
108
|
+
end
|
109
|
+
job = JobDSL.new(self.current_scope.merge(:name => name))
|
110
|
+
job.instance_eval(&block) if block_given?
|
111
|
+
self.jobs << job
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class DynportTools::LogTracer
|
2
|
+
REMOVE_COLOR = /\e.*?\dm/
|
3
|
+
FILTER_BACKTRACE = /\/(gems|ruby)\//
|
4
|
+
LOGGER_METHODS = %w(unknown fatal error warn info debug)
|
5
|
+
|
6
|
+
def self.setup(logger)
|
7
|
+
return if logger.respond_to?(:log_trace)
|
8
|
+
logger.class.class_eval do
|
9
|
+
LOGGER_METHODS.each do |meth|
|
10
|
+
alias_method :"#{meth}_without_log_tracer", meth
|
11
|
+
|
12
|
+
def register_tracer(re_or_messahge, &block)
|
13
|
+
tracers[re_or_messahge] = block
|
14
|
+
end
|
15
|
+
|
16
|
+
def tracers
|
17
|
+
@tracers ||= Hash.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def log_trace(message)
|
21
|
+
self.tracers.each do |re_or_string, block|
|
22
|
+
filtered_backtrace = filter_backtrace(caller)
|
23
|
+
if filtered_backtrace.any? && (re_or_string.is_a?(String) ? message.include?(re_or_string) : message.match(re_or_string))
|
24
|
+
block.call(message.gsub(REMOVE_COLOR, "").strip, filtered_backtrace)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def filter_backtrace(trace)
|
30
|
+
trace.reject { |t| t.match(FILTER_BACKTRACE) }
|
31
|
+
end
|
32
|
+
|
33
|
+
eval <<-EOM, nil, __FILE__, __LINE__ + 1
|
34
|
+
def #{meth}(message = nil)
|
35
|
+
log_trace(message)
|
36
|
+
#{meth}_without_log_tracer(message)
|
37
|
+
end
|
38
|
+
EOM
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -135,6 +135,11 @@ describe "DynportTools::Jenkins" do
|
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
138
|
+
it "adds a git entry when git is set" do
|
139
|
+
job.git_repository = "git@github.com:dynport/dynport_tools.git"
|
140
|
+
job.to_xml.should include(%(scm class="hudson.plugins.git.GitSCM">))
|
141
|
+
end
|
142
|
+
|
138
143
|
it "sets the correct email_addresses when present" do
|
139
144
|
job.email_addresses = %w(test@test.xx test2@test.xx)
|
140
145
|
doc.xpath("/project/publishers/hudson.tasks.Mailer/recipients").map(&:inner_text).should == ["test@test.xx,test2@test.xx"]
|
@@ -0,0 +1,301 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Jenkins::JobDSL do
|
4
|
+
let(:job) { Jenkins::JobDSL.new }
|
5
|
+
|
6
|
+
after(:each) do
|
7
|
+
Jenkins::JobDSL.jobs = nil
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "Job" do
|
11
|
+
it "can be initialized with a scope" do
|
12
|
+
Jenkins::JobDSL.new(:node => "Some Node").node.should == "Some Node"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "sets the current scope to an empty hash" do
|
16
|
+
Jenkins::JobDSL.new.current_scope.should == {}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
describe "#runner_command" do
|
22
|
+
it "returns ./script/runner when no env given" do
|
23
|
+
job.runner_command.should == "./script/runner"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns rails runner when rails3 is set" do
|
27
|
+
job.use_rails3!
|
28
|
+
job.runner_command.should == "rails runner"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "adds the rails env when given" do
|
32
|
+
job.runner_command("staging").should == "./script/runner -e staging"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "adds the default rails_env" do
|
36
|
+
job.rails_env = "staging"
|
37
|
+
job.runner_command.should == "./script/runner -e staging"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "uses given rails env when both given" do
|
41
|
+
job.rails_env = "staging"
|
42
|
+
job.runner_command("staging2").should == "./script/runner -e staging2"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#rails_script" do
|
47
|
+
it "calls rails_command_or_script with script" do
|
48
|
+
job.should_receive(:rails_command_or_script).with("./jobs/do_something.rb", :rails_env => "staging")
|
49
|
+
job.rails_script("./jobs/do_something.rb", :rails_env => "staging")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#rake_task" do
|
54
|
+
before(:each) do
|
55
|
+
job.rails_root "/rails/root"
|
56
|
+
end
|
57
|
+
|
58
|
+
it "sets the correct rails command" do
|
59
|
+
job.rake_task "db:check"
|
60
|
+
job.commands.should == ["cd /rails/root && rake db:check"]
|
61
|
+
end
|
62
|
+
|
63
|
+
it "hands in env variables" do
|
64
|
+
job.should_receive(:command_with_env).with("rake db:check", { "A" => "true" }).and_return "some command"
|
65
|
+
job.rake_task "db:check", :env => { "A" => "true"}
|
66
|
+
job.commands.should == ["cd /rails/root && some command"]
|
67
|
+
end
|
68
|
+
|
69
|
+
it "correctly merges the rails env when given" do
|
70
|
+
job.should_receive(:command_with_env).with("rake db:check", { "A" => "true", "RAILS_ENV" => "staging" }).and_return "some other command"
|
71
|
+
job.rake_task "db:check", :env => { "A" => "true"}, :rails_env => "staging"
|
72
|
+
job.commands.should == ["cd /rails/root && some other command"]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#rails_command" do
|
77
|
+
it "calls rails_command_or_script with script" do
|
78
|
+
job.should_receive(:rails_command_or_script).with(%("puts 1"), :rails_env => "staging")
|
79
|
+
job.rails_command("puts 1", :rails_env => "staging")
|
80
|
+
end
|
81
|
+
|
82
|
+
it "correctly escapes the command" do
|
83
|
+
job.should_receive(:rails_command_or_script).with(%("puts \\\"hello\\\""), :rails_env => "staging")
|
84
|
+
job.rails_command(%(puts "hello"), :rails_env => "staging")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "#command_with_env" do
|
89
|
+
it "puts all env variables in front of command" do
|
90
|
+
job.command_with_env("some command", "A" => "true").should == "A=true some command"
|
91
|
+
end
|
92
|
+
|
93
|
+
it "returns the command without env when env is nil" do
|
94
|
+
job.command_with_env("some command").should == "some command"
|
95
|
+
end
|
96
|
+
|
97
|
+
it "adds bundle exec between env and command" do
|
98
|
+
job.use_bundle_exec!
|
99
|
+
job.command_with_env("some command", "A" => "true").should == "A=true bundle exec some command"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "#rails_command_or_script" do
|
104
|
+
before(:each) do
|
105
|
+
job.rails_root = "/path/to/rails"
|
106
|
+
job.stub!(:runner_command).and_return "./script/runner"
|
107
|
+
end
|
108
|
+
|
109
|
+
it "calls command with correct args" do
|
110
|
+
job.rails_command_or_script "./some/script.rb"
|
111
|
+
job.commands.should == [%(cd /path/to/rails && ./script/runner ./some/script.rb)]
|
112
|
+
end
|
113
|
+
|
114
|
+
it "calls runner_command with correct env" do
|
115
|
+
job.should_receive(:runner_command).with("staging")
|
116
|
+
job.rails_command_or_script "puts 1", :rails_env => "staging"
|
117
|
+
job.commands
|
118
|
+
end
|
119
|
+
|
120
|
+
it "can set various env flags" do
|
121
|
+
job.rails_command_or_script "./script.rb", :env => { "A" => "a", "B" => "b"}
|
122
|
+
job.commands.should == [%(cd /path/to/rails && A=a B=b ./script/runner ./script.rb)]
|
123
|
+
end
|
124
|
+
|
125
|
+
it "raises an error when rails_root is nil" do
|
126
|
+
job.rails_root = nil
|
127
|
+
lambda {
|
128
|
+
job.rails_command_or_script "some"
|
129
|
+
}.should raise_error("rails_root must be set")
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe "setters and getters" do
|
134
|
+
{
|
135
|
+
:node => "Some Node", :disabled => true, :days_to_keep => 10, :num_to_keep => 1, :ordered => "A",
|
136
|
+
:rails_root => "/some/path"
|
137
|
+
}.each do |key, value|
|
138
|
+
it "sets #{key} to #{value}" do
|
139
|
+
job.send(key, value)
|
140
|
+
job.send(key).should == value
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
it "allows setting multiple email addresses" do
|
145
|
+
job.notify "email1@test.xx", "email2@test.xx"
|
146
|
+
job.notify.should == %w(email1@test.xx email2@test.xx)
|
147
|
+
end
|
148
|
+
|
149
|
+
%w(cron_pattern lock command command).each do |singular|
|
150
|
+
it "allows setting #{singular}s with #{singular}" do
|
151
|
+
job.send(singular, "#{singular}1")
|
152
|
+
job.send("#{singular}").should == ["#{singular}1"]
|
153
|
+
end
|
154
|
+
|
155
|
+
it "allows setting #{singular}s with #{singular}s" do
|
156
|
+
job.send("#{singular}s", "#{singular}1", "#{singular}2")
|
157
|
+
job.send("#{singular}").should == ["#{singular}1", "#{singular}2"]
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
it "provides a simple setter_or_getter" do
|
162
|
+
lambda {
|
163
|
+
job.disabled!
|
164
|
+
}.should change(job, :disabled).to(true)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe "#node" do
|
169
|
+
before(:each) do
|
170
|
+
job.current_scope = { :ttl => 1 }
|
171
|
+
end
|
172
|
+
|
173
|
+
it "can set the node" do
|
174
|
+
job.node "Some Node"
|
175
|
+
job.node.should == "Some Node"
|
176
|
+
end
|
177
|
+
|
178
|
+
it "does not set the node when block given" do
|
179
|
+
job.node "Some Node" do
|
180
|
+
end
|
181
|
+
job.node.should be_nil
|
182
|
+
end
|
183
|
+
|
184
|
+
it "resets the correct scope" do
|
185
|
+
job.node "Some Node" do
|
186
|
+
end
|
187
|
+
job.current_scope.should == { :ttl => 1 }
|
188
|
+
end
|
189
|
+
|
190
|
+
it "merges the current scope with the node" do
|
191
|
+
scope = nil
|
192
|
+
job.node "Some Node" do
|
193
|
+
scope = self.current_scope
|
194
|
+
end
|
195
|
+
scope.should have_attributes(:ttl => 1, :node => "Some Node")
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
describe "#setup" do
|
200
|
+
it "returns a new instance of Jenkins" do
|
201
|
+
Jenkins::JobDSL.setup.should be_kind_of(Array)
|
202
|
+
end
|
203
|
+
|
204
|
+
it "sets the new jobs to the default key when no namespace given" do
|
205
|
+
Jenkins::JobDSL.setup do
|
206
|
+
job "Default Job"
|
207
|
+
end
|
208
|
+
Jenkins::JobDSL.jobs[:default].count.should == 1
|
209
|
+
Jenkins::JobDSL.jobs[:default].first.name.should == "Default Job"
|
210
|
+
end
|
211
|
+
|
212
|
+
it "does not overwrite jobs" do
|
213
|
+
Jenkins::JobDSL.setup do
|
214
|
+
job "First Job"
|
215
|
+
end
|
216
|
+
Jenkins::JobDSL.setup do
|
217
|
+
job "Second Job"
|
218
|
+
end
|
219
|
+
Jenkins::JobDSL.jobs[:default].count.should == 2
|
220
|
+
end
|
221
|
+
|
222
|
+
it "dass the jobs to a custom key" do
|
223
|
+
Jenkins::JobDSL.setup :custom do
|
224
|
+
job "Default Job"
|
225
|
+
end
|
226
|
+
Jenkins::JobDSL.jobs[:custom].count.should == 1
|
227
|
+
Jenkins::JobDSL.jobs[:custom].first.name.should == "Default Job"
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
describe "#job" do
|
232
|
+
it "adds a new job to the children" do
|
233
|
+
job.job "Some Name"
|
234
|
+
job.jobs.count.should == 1
|
235
|
+
job.jobs.first.name.should == "Some Name"
|
236
|
+
end
|
237
|
+
|
238
|
+
it "initializes the job with current_scope" do
|
239
|
+
job.current_scope = { :node => "Test" }
|
240
|
+
job.job "Some Name"
|
241
|
+
job.jobs.first.node.should == "Test"
|
242
|
+
end
|
243
|
+
|
244
|
+
it "adds a prefix to the name when current_prefix is set" do
|
245
|
+
job.current_scope = { :ordered => "A" }
|
246
|
+
job.job "Some Name"
|
247
|
+
job.jobs.first.name.should == "A001 Some Name"
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
describe "integration" do
|
252
|
+
it "adds a new job to the dsl object" do
|
253
|
+
Jenkins::JobDSL.setup do
|
254
|
+
job "some name" do
|
255
|
+
node "Import"
|
256
|
+
end
|
257
|
+
|
258
|
+
job "some other name" do
|
259
|
+
command "ls"
|
260
|
+
|
261
|
+
job "child job"
|
262
|
+
end
|
263
|
+
|
264
|
+
node "Backup" do
|
265
|
+
job "Backup Task"
|
266
|
+
end
|
267
|
+
|
268
|
+
with :locks => %w(Lock1 Lock2), :node => "Other Node" do
|
269
|
+
job "Other Job"
|
270
|
+
end
|
271
|
+
|
272
|
+
ordered "A" do
|
273
|
+
job "First" do
|
274
|
+
with :prefix => "B" do
|
275
|
+
job "Third"
|
276
|
+
job "Fourth"
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
job "Second"
|
281
|
+
end
|
282
|
+
end
|
283
|
+
jobs = Jenkins::JobDSL.jobs[:default]
|
284
|
+
jobs.count.should == 6
|
285
|
+
jobs.first.name.should == "some name"
|
286
|
+
jobs.first.node.should == "Import"
|
287
|
+
jobs.at(1).commands.should == %w(ls)
|
288
|
+
jobs.at(1).jobs.count.should == 1
|
289
|
+
jobs.at(1).jobs.first.name.should == "child job"
|
290
|
+
jobs.at(2).name.should == "Backup Task"
|
291
|
+
jobs.at(2).node.should == "Backup"
|
292
|
+
|
293
|
+
jobs.at(3).node.should == "Other Node"
|
294
|
+
jobs.at(3).locks.should == %w(Lock1 Lock2)
|
295
|
+
jobs.at(3).name.should == "Other Job"
|
296
|
+
jobs.at(4).name.should == "A001 First"
|
297
|
+
jobs.at(5).name.should == "A002 Second"
|
298
|
+
jobs.at(4).jobs.map { |j| j.name }.should == ["B001 Third", "B002 Fourth"]
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require "logger"
|
3
|
+
|
4
|
+
describe "DynportTools::LogTracer" do
|
5
|
+
let(:clazz) { Class.new(Logger) }
|
6
|
+
let(:logger) { clazz.new("/dev/null") }
|
7
|
+
|
8
|
+
it "adds filters to all methods" do
|
9
|
+
DynportTools::LogTracer.setup(logger)
|
10
|
+
logger.should respond_to(:log_trace)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "calls class_eval once" do
|
14
|
+
clazz.should_receive(:class_eval)
|
15
|
+
DynportTools::LogTracer.setup(logger)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "does not call class_eval when already responding to log_trace" do
|
19
|
+
logger.should_receive(:respond_to?).with(:log_trace).and_return true
|
20
|
+
clazz.should_not_receive(:class_eval)
|
21
|
+
DynportTools::LogTracer.setup(logger)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "catches all messages with a specific pattern" do
|
25
|
+
DynportTools::LogTracer.setup(logger)
|
26
|
+
messages = []
|
27
|
+
logger.register_tracer(/rgne/) do |message, trace|
|
28
|
+
messages << message
|
29
|
+
end
|
30
|
+
logger.info("hello")
|
31
|
+
logger.info("rgne1")
|
32
|
+
logger.info("world")
|
33
|
+
logger.info("rgne2")
|
34
|
+
messages.should == %w(rgne1 rgne2)
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynport_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 49
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 19
|
10
|
+
version: 0.2.19
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tobias Schwab
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-09-
|
18
|
+
date: 2011-09-14 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -255,6 +255,8 @@ files:
|
|
255
255
|
- lib/dynport_tools/eta.rb
|
256
256
|
- lib/dynport_tools/have_attributes.rb
|
257
257
|
- lib/dynport_tools/jenkins.rb
|
258
|
+
- lib/dynport_tools/job_dsl.rb
|
259
|
+
- lib/dynport_tools/log_tracer.rb
|
258
260
|
- lib/dynport_tools/redis_dumper.rb
|
259
261
|
- lib/dynport_tools/redis_q.rb
|
260
262
|
- lib/dynport_tools/xml_file.rb
|
@@ -265,6 +267,8 @@ files:
|
|
265
267
|
- spec/dynport_tools/eta_spec.rb
|
266
268
|
- spec/dynport_tools/have_attributes_spec.rb
|
267
269
|
- spec/dynport_tools/jenkins_spec.rb
|
270
|
+
- spec/dynport_tools/job_dsl_spec.rb
|
271
|
+
- spec/dynport_tools/log_tracer_spec.rb
|
268
272
|
- spec/dynport_tools/redis_dumper_spec.rb
|
269
273
|
- spec/dynport_tools/redis_q_spec.rb
|
270
274
|
- spec/dynport_tools/xml_file_spec.rb
|