Skip to content

Commit edab6a9

Browse files
authored
Merge pull request #9 from randycoulman/trigger-parameterized-builds-publisher
Support the trigger-parameterized-builds publisher
2 parents 6292230 + e9e38e0 commit edab6a9

File tree

5 files changed

+174
-4
lines changed

5 files changed

+174
-4
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ The following sections and components are supported:
113113
* `wrappers`: (`timeout`, `timestamps`)
114114
* `builders`: (`shell`)
115115
* `publishers`: (`archive`, `cppcheck`, `email_ext`, `fitnesse`, `ircbot`, `junit`,
116-
`trigger`, `unittest`, `xunit`)
116+
`trigger`, `trigger_parameterized_builds`, `unittest`, `xunit`)
117117
* `notifications`: None defined yet
118118

119119
See [the end-to-end example job](examples/fixtures/endToEnd/endToEnd.job) for example

acceptance/fixtures/endToEnd/endToEnd.job

+24-1
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ job "endToEnd" do |j|
1515
regex: "REGEX",
1616
msg: "MESSAGE")
1717

18+
j.properties << priority_sorter(priority: 150)
1819
j.properties << throttle(max_per_node: 2,
1920
max_total: 4,
2021
option: "category",
2122
categories: %w{CAT1 CAT2})
22-
j.properties << priority_sorter(priority: 150)
2323

2424
j.scm << git(url: "URL", branches: %w{master dev}, wipe_workspace: false)
2525
j.scm << store(script: "SCRIPT",
@@ -60,6 +60,29 @@ job "endToEnd" do |j|
6060
j.publishers << ircbot(notify_start: true)
6161
j.publishers << junit(results: "RESULTS", keep_long_stdio: false)
6262
j.publishers << trigger(project: "PROJECT")
63+
j.publishers << trigger_parameterized_builds do |builds|
64+
builds << build(project: %w[PROJECT1 PROJECT2],
65+
predefined_parameters: { param1: "VALUE1", param2: "VALUE2" },
66+
current_parameters: true,
67+
node_parameters: false,
68+
svn_revision: true,
69+
include_upstream: false,
70+
git_revision: { combine_queued_commits: true },
71+
boolean_parameters: { bool1: true, bool2: false },
72+
condition: "FAILED_OR_BETTER",
73+
property_file: "FILE.properties",
74+
fail_on_missing: true,
75+
use_matrix_child_files: false,
76+
only_exact_matrix_child_runs: true,
77+
file_encoding: "UTF-8",
78+
trigger_with_no_params: false,
79+
restrict_matrix_project: 'label=="x86"',
80+
node_label_name: "LABEL_NAME",
81+
node_label: "LABEL")
82+
builds << build(project: "SINGLE_PROJECT",
83+
predefined_parameters: { param: "VALUE" },
84+
git_revision: true)
85+
end
6386
j.publishers << xunit do |types|
6487
types << unittest(pattern: "PATTERN", deleteoutput: false)
6588
end

acceptance/fixtures/endToEnd/expected.yml

+31-2
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@
2727
regex: REGEX
2828
msg: MESSAGE
2929
properties:
30+
- priority-sorter:
31+
priority: 150
3032
- throttle:
3133
max-per-node: 2
3234
max-total: 4
3335
option: category
3436
categories:
3537
- CAT1
3638
- CAT2
37-
- priority-sorter:
38-
priority: 150
3939
scm:
4040
- git:
4141
url: URL
@@ -111,6 +111,35 @@
111111
keep-long-stdio: false
112112
- trigger:
113113
project: PROJECT
114+
- trigger-parameterized-builds:
115+
- project:
116+
- PROJECT1
117+
- PROJECT2
118+
predefined-parameters: |
119+
param1=VALUE1
120+
param2=VALUE2
121+
current-parameters: true
122+
node-parameters: false
123+
svn-revision: true
124+
include-upstream: false
125+
git-revision:
126+
combine-queued-commits: true
127+
boolean-parameters:
128+
bool1: true
129+
bool2: false
130+
condition: FAILED_OR_BETTER
131+
property-file: FILE.properties
132+
fail-on-missing: true
133+
use-matrix-child-files: false
134+
only-exact-matrix-child-runs: true
135+
file-encoding: UTF-8
136+
trigger-with-no-params: false
137+
restrict-matrix-project: label=="x86"
138+
node-label-name: LABEL_NAME
139+
node-label: LABEL
140+
- project: SINGLE_PROJECT
141+
predefined-parameters: param=VALUE
142+
git-revision: true
114143
- xunit:
115144
types:
116145
- unittest:

lib/jujube/components/publishers.rb

+58
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,31 @@ module Publishers
6868
# @return [Hash] The specification for the component.
6969
standard_component :trigger
7070

71+
# Specify a `trigger-parameterized-builds` publisher for a job.
72+
#
73+
# See {http://docs.openstack.org/infra/jenkins-job-builder/publishers.html#publishers.trigger-parameterized-builds}.
74+
#
75+
# `trigger-parameterized-builds` can trigger multiple sets of builds,
76+
# each with their own configuration. Each build specification is added
77+
# in a nested configuration block using the {#build} method.
78+
#
79+
# @example
80+
# job "trigger-parameterized-builds-example" do |j|
81+
# j.publishers << trigger_parameterized_builds do |builds|
82+
# builds << build(project: %w[PROJECT1 PROJECT2], condition: "SUCCESS")
83+
# builds << build(project: "SINGLE_PROJECT", current_parameters: true)
84+
# end
85+
# end
86+
#
87+
# @yieldparam builds [Array] An array to which nested build specifications
88+
# should be added by the block.
89+
# @return [Hash] The specification for the component.
90+
def trigger_parameterized_builds
91+
builds = []
92+
yield(builds) if block_given?
93+
{"trigger-parameterized-builds" => builds}
94+
end
95+
7196
# Specify an `xunit` publisher for a job.
7297
#
7398
# See {http://docs.openstack.org/infra/jenkins-job-builder/publishers.html#publishers.xunit}.
@@ -90,6 +115,38 @@ def xunit(options = {}, &block)
90115
to_config("xunit", nested_options(:types, options, &block))
91116
end
92117

118+
# @!group trigger_parameterized_builds Builds
119+
120+
# Configure a `build` for a {#trigger_parameterized_builds} publisher.
121+
#
122+
# See {http://docs.openstack.org/infra/jenkins-job-builder/publishers.html#publishers.trigger-parameterized-builds}.
123+
#
124+
# @param options [Hash] The configuration options for the build.
125+
# @return [Hash] The specification for the build.
126+
def build(options = {})
127+
identity = ->(value) { value }
128+
transforms = {
129+
predefined_parameters: ->(value) do
130+
result = value.map { |k,v| "#{k}=#{v}" }.join("\n")
131+
value.size > 1 ? result + "\n" : result
132+
end,
133+
boolean_parameters: ->(value) do
134+
Hash[value.map { |k,v| [k.to_s, v] }]
135+
end,
136+
git_revision: ->(value) do
137+
value.is_a?(Hash) ? canonicalize_options(value) : value
138+
end
139+
}
140+
transformed_options = options.map do |k, v|
141+
transform = transforms.fetch(k) { identity }
142+
[k, transform.call(v)]
143+
end
144+
145+
canonicalize_options(Hash[transformed_options])
146+
end
147+
148+
# @!endgroup
149+
93150
# @!group xunit Test Types
94151

95152
# @!method unittest(options = {})
@@ -101,6 +158,7 @@ def xunit(options = {}, &block)
101158
# @return [Hash] The specification for the test type.
102159
named_config :unittest
103160

161+
# @!endgroup
104162
end
105163
end
106164
end

test/components/publishers_test.rb

+60
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,66 @@ def test_trigger
4242
assert_equal(expected, trigger(project: "PROJECT"))
4343
end
4444

45+
def test_trigger_parameterized_builds
46+
expected = {"trigger-parameterized-builds" => [
47+
{"project" => ["PROJECT1", "PROJECT2"], "condition" => "UNSTABLE"}
48+
]}
49+
actual = trigger_parameterized_builds do |builds|
50+
builds << build(project: %w[PROJECT1 PROJECT2], condition: "UNSTABLE")
51+
end
52+
assert_equal(expected, actual)
53+
end
54+
55+
def test_trigger_parameterized_builds_formats_single_predefined_parameter
56+
expected = {"trigger-parameterized-builds" => [
57+
{"predefined-parameters" => "param=value"}
58+
]}
59+
actual = trigger_parameterized_builds do |builds|
60+
builds << build(predefined_parameters: {param: 'value'})
61+
end
62+
assert_equal(expected, actual)
63+
end
64+
65+
def test_trigger_parameterized_builds_formats_multiiple_predefined_parameters
66+
expected = {"trigger-parameterized-builds" => [
67+
{"predefined-parameters" => "param1=value1\nparam2=value2\n"}
68+
]}
69+
actual = trigger_parameterized_builds do |builds|
70+
builds << build(predefined_parameters: {param1: 'value1', param2: 'value2'})
71+
end
72+
assert_equal(expected, actual)
73+
end
74+
75+
def test_trigger_parameterized_builds_formats_boolean_parameters
76+
expected = {"trigger-parameterized-builds" => [
77+
{"boolean-parameters" => {"param_1" => true, "param_2" => false}}
78+
]}
79+
actual = trigger_parameterized_builds do |builds|
80+
builds << build(boolean_parameters: {param_1: true, param_2: false})
81+
end
82+
assert_equal(expected, actual)
83+
end
84+
85+
def test_trigger_parameterized_builds_formats_git_revision_as_boolean
86+
expected = {"trigger-parameterized-builds" => [
87+
{"git-revision" => true}
88+
]}
89+
actual = trigger_parameterized_builds do |builds|
90+
builds << build(git_revision: true)
91+
end
92+
assert_equal(expected, actual)
93+
end
94+
95+
def test_trigger_parameterized_builds_formats_git_revision_as_nested_hash
96+
expected = {"trigger-parameterized-builds" => [
97+
{"git-revision" => {"combine-queued-commits" => true}}
98+
]}
99+
actual = trigger_parameterized_builds do |builds|
100+
builds << build(git_revision: {combine_queued_commits: true})
101+
end
102+
assert_equal(expected, actual)
103+
end
104+
45105
def test_xunit
46106
expected = {"xunit" =>
47107
{"types" =>

0 commit comments

Comments
 (0)