jenkins-plugin-runtime 0.1.10 → 0.1.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.
- data/lib/jenkins/model/build.rb +20 -0
- data/lib/jenkins/model/descriptor.rb +8 -1
- data/lib/jenkins/plugin.rb +2 -2
- data/lib/jenkins/plugin/proxies.rb +56 -18
- data/lib/jenkins/plugin/proxies/build_wrapper.rb +5 -7
- data/lib/jenkins/plugin/proxy.rb +1 -1
- data/lib/jenkins/plugin/runtime/version.rb +1 -1
- data/lib/jenkins/tasks/build_wrapper.rb +2 -4
- data/spec/jenkins/model/build_spec.rb +21 -0
- data/spec/jenkins/plugin/proxies/build_wrapper_spec.rb +2 -2
- data/spec/jenkins/plugin/proxies_spec.rb +2 -2
- data/spec/jenkins/plugin/proxy_spec.rb +1 -1
- metadata +2 -2
data/lib/jenkins/model/build.rb
CHANGED
@@ -18,6 +18,26 @@ module Jenkins
|
|
18
18
|
|
19
19
|
def initialize(native = nil)
|
20
20
|
@native = native
|
21
|
+
@variables = {}
|
22
|
+
end
|
23
|
+
|
24
|
+
# Gets a build value. Each build stores a map of key,value
|
25
|
+
# pairs which can be used by each build step in the pipeline
|
26
|
+
#
|
27
|
+
# @param [String|Symbol] key
|
28
|
+
# @return [Object] value
|
29
|
+
def [](key)
|
30
|
+
@variables[key.to_s]
|
31
|
+
end
|
32
|
+
|
33
|
+
# Sets a build value. Each build has a map of key,value
|
34
|
+
# pairs which allow build steps to share information
|
35
|
+
#
|
36
|
+
# @param [String|Symbol] key
|
37
|
+
# @param [Object] value
|
38
|
+
# @return [Object] value
|
39
|
+
def []=(key, value)
|
40
|
+
@variables[key.to_s] = value
|
21
41
|
end
|
22
42
|
|
23
43
|
def workspace
|
@@ -55,8 +55,15 @@ module Jenkins
|
|
55
55
|
@impl.new
|
56
56
|
end
|
57
57
|
|
58
|
+
# compute the path name of views for this class
|
58
59
|
def name_to_path
|
59
|
-
|
60
|
+
# camel case to underscore conversion taken from ActiveSupport::Inflector::underscore,
|
61
|
+
# which is MIT-licensed.
|
62
|
+
@impl.name.split('::').join('/').gsub(/::/, '/').
|
63
|
+
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
|
64
|
+
gsub(/([a-z\d])([A-Z])/, '\1_\2').
|
65
|
+
tr("-", "_").
|
66
|
+
downcase
|
60
67
|
end
|
61
68
|
end
|
62
69
|
|
data/lib/jenkins/plugin.rb
CHANGED
@@ -152,8 +152,8 @@ module Jenkins
|
|
152
152
|
#
|
153
153
|
# @param [Object] internal the object on the Ruby side of the link
|
154
154
|
# @param [java.lang.Object] external the object on the Java side of the link
|
155
|
-
def
|
156
|
-
@proxies.
|
155
|
+
def linkout(internal, external)
|
156
|
+
@proxies.linkout internal, external
|
157
157
|
end
|
158
158
|
|
159
159
|
def load_models
|
@@ -5,7 +5,7 @@ module Jenkins
|
|
5
5
|
|
6
6
|
ExportError = Class.new(StandardError)
|
7
7
|
ImportError = Class.new(StandardError)
|
8
|
-
|
8
|
+
OpaqueJavaObject = Struct.new(:native)
|
9
9
|
|
10
10
|
# Maps JRuby objects part of the idomatic Ruby API
|
11
11
|
# to a plain Java object representation and vice-versa.
|
@@ -49,20 +49,20 @@ module Jenkins
|
|
49
49
|
# @param [Object] object the object to bring in from the outside
|
50
50
|
# @return the best representation of that object for this plugin
|
51
51
|
def import(object)
|
52
|
-
if
|
53
|
-
return
|
52
|
+
if proxy = deref(@ext2int, object)
|
53
|
+
return proxy
|
54
54
|
end
|
55
55
|
cls = object.class
|
56
56
|
while cls do
|
57
57
|
if internal_class = @@extcls2intcls[cls]
|
58
58
|
internal = internal_class.new(object)
|
59
|
-
|
59
|
+
linkin(internal, object)
|
60
60
|
return internal
|
61
61
|
end
|
62
62
|
cls = cls.superclass
|
63
63
|
end
|
64
|
-
internal =
|
65
|
-
|
64
|
+
internal = OpaqueJavaObject.new(object)
|
65
|
+
linkin(internal, object)
|
66
66
|
return internal
|
67
67
|
end
|
68
68
|
|
@@ -73,35 +73,73 @@ module Jenkins
|
|
73
73
|
# @return [java.lang.Object] the Java wrapper that provides an interface to `object`
|
74
74
|
# @throw [ExportError] if no suitable Java representation can be found
|
75
75
|
def export(object)
|
76
|
-
if
|
77
|
-
return
|
76
|
+
if proxy = deref(@int2ext, object)
|
77
|
+
return proxy
|
78
78
|
end
|
79
79
|
|
80
80
|
cls = object.class
|
81
81
|
while cls do
|
82
|
-
if
|
83
|
-
|
84
|
-
|
85
|
-
return
|
82
|
+
if external_class = @@intcls2extcls[cls]
|
83
|
+
external = external_class.new(@plugin, object)
|
84
|
+
linkout(object, external)
|
85
|
+
return external
|
86
86
|
end
|
87
87
|
cls = cls.superclass
|
88
88
|
end
|
89
89
|
raise ExportError, "unable to find suitable Java Proxy for #{object.inspect}"
|
90
90
|
end
|
91
91
|
|
92
|
-
|
93
|
-
#
|
94
|
-
#
|
95
|
-
#
|
96
|
-
#
|
92
|
+
|
93
|
+
# Forms an incoming reference to an internal Ruby object from an
|
94
|
+
# external Java object. These two objects will be referentially
|
95
|
+
# equivalent whenever they are passed back and forth between the Ruby
|
96
|
+
# plugin and the Jenkins runtime.
|
97
|
+
#
|
98
|
+
# The fact that this reference is "in" means
|
99
|
+
# that GC-wise, the internal Ruby object depends on the external
|
100
|
+
# Java object. In other words, it will not be garbage collected
|
101
|
+
# until the Java object is.
|
102
|
+
#
|
103
|
+
# This behavior is important for things like AbstractBuild objects. We
|
104
|
+
# don't want our Ruby `Build` object that corresponds to it to be GC'd
|
105
|
+
# until the `hudson.model.AbstractBuild` it represents is itself
|
106
|
+
# collected. That allows us to maintain state on the Ruby object, and know
|
107
|
+
# that the same state will be accessible wherever.
|
108
|
+
#
|
109
|
+
# Only weak refereces are maintained to the external Java object.
|
97
110
|
#
|
98
111
|
# @param [Object] internal the object on the Ruby side of the link
|
99
112
|
# @param [java.lang.Object] external the object on the Java side of the link
|
100
|
-
def
|
113
|
+
def linkin(internal, external)
|
101
114
|
@int2ext.put(internal, java.lang.ref.WeakReference.new(external))
|
115
|
+
@ext2int.put(external, internal)
|
116
|
+
end
|
117
|
+
|
118
|
+
# Forms an outgoing reference from an internal Ruby object to an
|
119
|
+
# external Java object. These two objects will be referentially
|
120
|
+
# equivalent whenever they are passed back and forth between the Ruby
|
121
|
+
# plugin and the Jenkins runtime.
|
122
|
+
#
|
123
|
+
# The fact that this reference goes "out" means
|
124
|
+
# that GC-wise, the external Java object depends on the internal
|
125
|
+
# Ruby object. In other words, The Java object will not be garbage
|
126
|
+
# collected until the local Ruby object is.
|
127
|
+
#
|
128
|
+
# Only weak refereces are maintained to the internal Ruby object.
|
129
|
+
#
|
130
|
+
# @param [Object] internal the object on the Ruby side of the link
|
131
|
+
# @param [java.lang.Object] external the object on the Java side of the link
|
132
|
+
def linkout(internal, external)
|
133
|
+
@int2ext.put(internal, external)
|
102
134
|
@ext2int.put(external, java.lang.ref.WeakReference.new(internal))
|
103
135
|
end
|
104
136
|
|
137
|
+
def deref(reflist, object)
|
138
|
+
if ref = reflist[object]
|
139
|
+
ref.is_a?(java.lang.ref.Reference) ? ref.get() : ref
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
105
143
|
##
|
106
144
|
# Associated the the Ruby class `internal_class` with the Java class `external_class`.
|
107
145
|
#
|
@@ -15,11 +15,10 @@ module Jenkins
|
|
15
15
|
include Jenkins::Plugin::Proxy
|
16
16
|
|
17
17
|
def setUp(build, launcher, listener)
|
18
|
-
|
19
|
-
|
20
|
-
EnvironmentWrapper.new(self, @plugin, @object, env)
|
18
|
+
@object.setup(import(build), import(launcher), import(listener))
|
19
|
+
EnvironmentWrapper.new(self, @plugin, @object)
|
21
20
|
rescue Jenkins::Model::Build::Halt
|
22
|
-
|
21
|
+
nil
|
23
22
|
end
|
24
23
|
|
25
24
|
def getDescriptor
|
@@ -35,15 +34,14 @@ module Jenkins
|
|
35
34
|
|
36
35
|
class EnvironmentWrapper < Java.hudson.tasks.BuildWrapper::Environment
|
37
36
|
|
38
|
-
def initialize(build_wrapper, plugin, impl
|
37
|
+
def initialize(build_wrapper, plugin, impl)
|
39
38
|
super(build_wrapper)
|
40
39
|
@plugin = plugin
|
41
40
|
@impl = impl
|
42
|
-
@env = env
|
43
41
|
end
|
44
42
|
|
45
43
|
def tearDown(build, listener)
|
46
|
-
@impl.teardown(@plugin.import(build), @plugin.import(listener)
|
44
|
+
@impl.teardown(@plugin.import(build), @plugin.import(listener))
|
47
45
|
true
|
48
46
|
rescue Jenkins::Model::Build::Halt
|
49
47
|
false
|
data/lib/jenkins/plugin/proxy.rb
CHANGED
@@ -56,7 +56,7 @@ module Jenkins
|
|
56
56
|
# so that they remain referentially equivalent.
|
57
57
|
def read_completed
|
58
58
|
@plugin = Java.jenkins.model.Jenkins.getInstance().getPlugin(@pluginid).getNativeRubyPlugin()
|
59
|
-
@plugin.
|
59
|
+
@plugin.linkout @object, self
|
60
60
|
end
|
61
61
|
|
62
62
|
end
|
@@ -17,8 +17,7 @@ module Jenkins
|
|
17
17
|
# @param [Jenkins::Model::Build] build the build about to run
|
18
18
|
# @param [Jenkins::Launcher] launcher a launcher for the orderly starting/stopping of processes.
|
19
19
|
# @param [Jenkins::Model::Listener] listener channel for interacting with build output console
|
20
|
-
|
21
|
-
def setup(build, launcher, listener, env)
|
20
|
+
def setup(build, launcher, listener)
|
22
21
|
|
23
22
|
end
|
24
23
|
|
@@ -29,8 +28,7 @@ module Jenkins
|
|
29
28
|
#
|
30
29
|
# @param [Jenkins::Model::Build] the build which has completed
|
31
30
|
# @param [Jenkins::Model::Listener] listener channel for interacting with build output console
|
32
|
-
|
33
|
-
def teardown(build, listener, env)
|
31
|
+
def teardown(build, listener)
|
34
32
|
|
35
33
|
end
|
36
34
|
end
|
@@ -36,4 +36,25 @@ describe Jenkins::Model::Build do
|
|
36
36
|
it "can abort" do
|
37
37
|
expect {@build.abort "aborting"}.should raise_error(Java.hudson.AbortException, "aborting")
|
38
38
|
end
|
39
|
+
|
40
|
+
describe "hash-y interface" do
|
41
|
+
before do
|
42
|
+
@val = Object.new
|
43
|
+
@build['val'] = @val
|
44
|
+
end
|
45
|
+
|
46
|
+
it "gets" do
|
47
|
+
@build['val'].should be @val
|
48
|
+
end
|
49
|
+
|
50
|
+
it "sets" do
|
51
|
+
@build['val'] = :foo
|
52
|
+
@build['val'].should be :foo
|
53
|
+
end
|
54
|
+
|
55
|
+
it "has symbol/string indifferent access" do
|
56
|
+
@build[:val].should be @val
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
39
60
|
end
|
@@ -14,12 +14,12 @@ describe Jenkins::Plugin::Proxies::BuildWrapper do
|
|
14
14
|
|
15
15
|
it "passes in an env file which will be called to " do
|
16
16
|
env = nil
|
17
|
-
@object.should_receive(:setup).with(@build, @launcher, @listener
|
17
|
+
@object.should_receive(:setup).with(@build, @launcher, @listener) do |*args|
|
18
18
|
env = args.last
|
19
19
|
end
|
20
20
|
environment = @wrapper.setUp(@jBuild, @jLauncher, @jListener)
|
21
21
|
|
22
|
-
@object.should_receive(:teardown).with(@build, @listener
|
22
|
+
@object.should_receive(:teardown).with(@build, @listener)
|
23
23
|
environment.tearDown(@jBuild, @jListener)
|
24
24
|
end
|
25
25
|
|
@@ -50,7 +50,7 @@ describe Jenkins::Plugin::Proxies do
|
|
50
50
|
describe "when a wrapper has already existed" do
|
51
51
|
before do
|
52
52
|
@proxy = Object.new
|
53
|
-
@proxies.
|
53
|
+
@proxies.linkin @object, @proxy
|
54
54
|
end
|
55
55
|
|
56
56
|
it "finds the same proxy on export" do
|
@@ -138,7 +138,7 @@ describe Jenkins::Plugin::Proxies do
|
|
138
138
|
@umappable = java.lang.Object.new
|
139
139
|
@import = @proxies.import(@umappable)
|
140
140
|
end
|
141
|
-
it "maps it
|
141
|
+
it "maps it to an opaque native java object structure" do
|
142
142
|
@import.native.should be @umappable
|
143
143
|
end
|
144
144
|
it "reuses the same opaque proxy on subsequent imports" do
|
@@ -34,7 +34,7 @@ describe "a class with #{Jenkins::Plugin::Proxy} mixed in" do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
it "reconstructs the @plugin field" do
|
37
|
-
@plugin.should_receive(:
|
37
|
+
@plugin.should_receive(:linkout).with(@impl, @proxy)
|
38
38
|
@proxy.read_completed
|
39
39
|
@proxy.plugin.should be(@plugin)
|
40
40
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: jenkins-plugin-runtime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.11
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Charles Lowell
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-10-
|
13
|
+
date: 2011-10-31 00:00:00 -05:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|