jenkins-maestrodev 0.6.9
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/Changelog.md +58 -0
- data/Gemfile +3 -0
- data/README.md +162 -0
- data/Rakefile +110 -0
- data/bin/jenkins +9 -0
- data/cucumber.yml +8 -0
- data/features/build_details.feature +44 -0
- data/features/configure.feature +36 -0
- data/features/default_host.feature +26 -0
- data/features/development.feature +14 -0
- data/features/listing_jobs.feature +34 -0
- data/features/manage_jobs.feature +263 -0
- data/features/manage_slave_nodes.feature +83 -0
- data/features/step_definitions/common_steps.rb +192 -0
- data/features/step_definitions/fixture_project_steps.rb +8 -0
- data/features/step_definitions/jenkins_steps.rb +116 -0
- data/features/step_definitions/scm_steps.rb +12 -0
- data/features/support/common.rb +37 -0
- data/features/support/env.rb +19 -0
- data/features/support/hooks.rb +16 -0
- data/features/support/jenkins_helpers.rb +6 -0
- data/features/support/matchers.rb +10 -0
- data/fixtures/jenkins/envfile.hpi +0 -0
- data/fixtures/jenkins/git.hpi +0 -0
- data/fixtures/jenkins/github.hpi +0 -0
- data/fixtures/jenkins/greenballs.hpi +0 -0
- data/fixtures/jenkins/rake.hpi +0 -0
- data/fixtures/jenkins/ruby.hpi +0 -0
- data/fixtures/projects/erlang/rebar.config +1 -0
- data/fixtures/projects/non-bundler/Rakefile +4 -0
- data/fixtures/projects/rails-3/.gitignore +4 -0
- data/fixtures/projects/rails-3/Gemfile +30 -0
- data/fixtures/projects/rails-3/Gemfile.lock +74 -0
- data/fixtures/projects/rails-3/README +256 -0
- data/fixtures/projects/rails-3/Rakefile +7 -0
- data/fixtures/projects/rails-3/app/controllers/application_controller.rb +3 -0
- data/fixtures/projects/rails-3/app/helpers/application_helper.rb +2 -0
- data/fixtures/projects/rails-3/app/views/layouts/application.html.erb +14 -0
- data/fixtures/projects/rails-3/config.ru +4 -0
- data/fixtures/projects/rails-3/config/application.rb +42 -0
- data/fixtures/projects/rails-3/config/boot.rb +13 -0
- data/fixtures/projects/rails-3/config/database.yml +22 -0
- data/fixtures/projects/rails-3/config/environment.rb +5 -0
- data/fixtures/projects/rails-3/config/environments/development.rb +26 -0
- data/fixtures/projects/rails-3/config/environments/production.rb +49 -0
- data/fixtures/projects/rails-3/config/environments/test.rb +35 -0
- data/fixtures/projects/rails-3/config/initializers/backtrace_silencers.rb +7 -0
- data/fixtures/projects/rails-3/config/initializers/inflections.rb +10 -0
- data/fixtures/projects/rails-3/config/initializers/mime_types.rb +5 -0
- data/fixtures/projects/rails-3/config/initializers/secret_token.rb +7 -0
- data/fixtures/projects/rails-3/config/initializers/session_store.rb +8 -0
- data/fixtures/projects/rails-3/config/locales/en.yml +5 -0
- data/fixtures/projects/rails-3/config/routes.rb +58 -0
- data/fixtures/projects/rails-3/db/seeds.rb +7 -0
- data/fixtures/projects/rails-3/doc/README_FOR_APP +2 -0
- data/fixtures/projects/rails-3/lib/tasks/.gitkeep +0 -0
- data/fixtures/projects/rails-3/public/404.html +26 -0
- data/fixtures/projects/rails-3/public/422.html +26 -0
- data/fixtures/projects/rails-3/public/500.html +26 -0
- data/fixtures/projects/rails-3/public/favicon.ico +0 -0
- data/fixtures/projects/rails-3/public/images/rails.png +0 -0
- data/fixtures/projects/rails-3/public/index.html +239 -0
- data/fixtures/projects/rails-3/public/javascripts/application.js +2 -0
- data/fixtures/projects/rails-3/public/javascripts/controls.js +965 -0
- data/fixtures/projects/rails-3/public/javascripts/dragdrop.js +974 -0
- data/fixtures/projects/rails-3/public/javascripts/effects.js +1123 -0
- data/fixtures/projects/rails-3/public/javascripts/prototype.js +6001 -0
- data/fixtures/projects/rails-3/public/javascripts/rails.js +175 -0
- data/fixtures/projects/rails-3/public/robots.txt +5 -0
- data/fixtures/projects/rails-3/public/stylesheets/.gitkeep +0 -0
- data/fixtures/projects/rails-3/script/rails +6 -0
- data/fixtures/projects/rails-3/test/performance/browsing_test.rb +9 -0
- data/fixtures/projects/rails-3/test/test_helper.rb +13 -0
- data/fixtures/projects/rails-3/vendor/plugins/.gitkeep +0 -0
- data/fixtures/projects/ruby/Gemfile +3 -0
- data/fixtures/projects/ruby/Gemfile.lock +10 -0
- data/fixtures/projects/ruby/Rakefile +4 -0
- data/jenkins.gemspec +34 -0
- data/lib/jenkins.rb +6 -0
- data/lib/jenkins/api.rb +312 -0
- data/lib/jenkins/cli.rb +361 -0
- data/lib/jenkins/cli/formatting.rb +53 -0
- data/lib/jenkins/config.rb +27 -0
- data/lib/jenkins/core_ext/hash.rb +9 -0
- data/lib/jenkins/core_ext/object/blank.rb +77 -0
- data/lib/jenkins/hudson-cli.jar +0 -0
- data/lib/jenkins/job_config_builder.rb +417 -0
- data/lib/jenkins/project_scm.rb +22 -0
- data/lib/jenkins/remote.rb +11 -0
- data/lib/jenkins/version.rb +3 -0
- data/spec/api_spec.rb +67 -0
- data/spec/fixtures/ec2_global.config.xml +103 -0
- data/spec/fixtures/erlang.single.config.xml +59 -0
- data/spec/fixtures/rails.multi.config.xml +82 -0
- data/spec/fixtures/rails.single.config.triggers.xml +84 -0
- data/spec/fixtures/rails.single.config.xml +80 -0
- data/spec/fixtures/ruby.multi-ruby-multi-labels.config.xml +84 -0
- data/spec/fixtures/ruby.multi.config.xml +77 -0
- data/spec/fixtures/ruby.single.config.xml +58 -0
- data/spec/fixtures/ruby.user-defined-axis.config.xml +69 -0
- data/spec/fixtures/therubyracer.config.xml +77 -0
- data/spec/hash_key_cleaner_spec.rb +25 -0
- data/spec/job_config_builder_spec.rb +233 -0
- data/spec/spec_helper.rb +15 -0
- metadata +291 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Feature: Display default host information
|
|
2
|
+
|
|
3
|
+
Scenario: Display default host information if it is setup
|
|
4
|
+
Given I run local executable "jenkins" with arguments "configure --host localhost --port 3010"
|
|
5
|
+
When I run local executable "jenkins" with arguments "default_host"
|
|
6
|
+
Then I should see exactly
|
|
7
|
+
"""
|
|
8
|
+
http://localhost:3010
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
Scenario: Display default secure host information if it is setup
|
|
12
|
+
Given I run local executable "jenkins" with arguments "configure --host localhost --port 3010 --ssl"
|
|
13
|
+
When I run local executable "jenkins" with arguments "default_host"
|
|
14
|
+
Then I should see exactly
|
|
15
|
+
"""
|
|
16
|
+
https://localhost:3010
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
Scenario: Display warning if never used Jenkins.rb before
|
|
20
|
+
When I run local executable "jenkins" with arguments "default_host"
|
|
21
|
+
Then I should see exactly
|
|
22
|
+
"""
|
|
23
|
+
ERROR: Either use --host or add remote servers.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Feature: Development processes of jenkins itself (rake tasks)
|
|
2
|
+
|
|
3
|
+
As a Newgem maintainer or contributor
|
|
4
|
+
I want rake tasks to maintain and release the gem
|
|
5
|
+
So that I can spend time on the tests and code, and not excessive time on maintenance processes
|
|
6
|
+
|
|
7
|
+
Scenario: Generate RubyGem
|
|
8
|
+
Given this project is active project folder
|
|
9
|
+
When I invoke task "rake clean" so that I start with nothing
|
|
10
|
+
And I invoke task "rake build"
|
|
11
|
+
Then file with name matching "pkg/jenkins-*.gem" is created
|
|
12
|
+
And file with name matching "jenkins.gemspec" is created
|
|
13
|
+
And the file "jenkins.gemspec" is a valid gemspec
|
|
14
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
Feature: Listing jobs
|
|
2
|
+
I want to see the status of jobs on servers I'm interested in
|
|
3
|
+
|
|
4
|
+
Scenario: List jobs on a non-existent server (jenkins list)
|
|
5
|
+
When I run local executable "jenkins" with arguments "list --host localhost --port 9999"
|
|
6
|
+
Then I should see exactly
|
|
7
|
+
"""
|
|
8
|
+
No connection available to the server.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
@jenkins-server
|
|
12
|
+
Scenario: List jobs on a server with no jobs (jenkins list)
|
|
13
|
+
Given I have a Jenkins server running
|
|
14
|
+
And the Jenkins server has no current jobs
|
|
15
|
+
When I run local executable "jenkins" with arguments "list --host localhost --port 3010"
|
|
16
|
+
Then I should see exactly
|
|
17
|
+
"""
|
|
18
|
+
http://localhost:3010: no jobs
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
@jenkins-server
|
|
22
|
+
Scenario: List jobs on a server with jobs (jenkins list)
|
|
23
|
+
Given I have a Jenkins server running
|
|
24
|
+
And the Jenkins server has no current jobs
|
|
25
|
+
And I am in the "ruby" project folder
|
|
26
|
+
And the project uses "git" scm
|
|
27
|
+
When I run local executable "jenkins" with arguments "create . --host localhost --port 3010"
|
|
28
|
+
When I run local executable "jenkins" with arguments "list"
|
|
29
|
+
Then I should see exactly
|
|
30
|
+
"""
|
|
31
|
+
http://localhost:3010:
|
|
32
|
+
* ruby
|
|
33
|
+
|
|
34
|
+
"""
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
@jenkins-server
|
|
2
|
+
Feature: Create and manage jobs
|
|
3
|
+
In order to reduce cost of getting a new project up onto Jenkins
|
|
4
|
+
As a project developer
|
|
5
|
+
I want to add a new project to Jenkins as a job
|
|
6
|
+
|
|
7
|
+
Background:
|
|
8
|
+
Given I have a Jenkins server running
|
|
9
|
+
And the Jenkins server has no current jobs
|
|
10
|
+
|
|
11
|
+
Scenario: Setup jenkins job for git scm (jenkins create)
|
|
12
|
+
Given I am in the "ruby" project folder
|
|
13
|
+
And the project uses "git" scm
|
|
14
|
+
When I run local executable "jenkins" with arguments "create . --host localhost --port 3010"
|
|
15
|
+
Then I should see exactly
|
|
16
|
+
"""
|
|
17
|
+
Added ruby project 'ruby' to Jenkins.
|
|
18
|
+
Triggering initial build...
|
|
19
|
+
Trigger additional builds via:
|
|
20
|
+
URL: http://localhost:3010/job/ruby/build
|
|
21
|
+
CLI: jenkins build ruby
|
|
22
|
+
"""
|
|
23
|
+
When I run local executable "jenkins" with arguments "list --host localhost --port 3010"
|
|
24
|
+
Then I should see "ruby"
|
|
25
|
+
|
|
26
|
+
Scenario: Create job via $JENKINS_HOST and $JENKINS_PORT (jenkins create)
|
|
27
|
+
Given I am in the "ruby" project folder
|
|
28
|
+
And the project uses "git" scm
|
|
29
|
+
And env variable $JENKINS_HOST set to "localhost"
|
|
30
|
+
And env variable $JENKINS_PORT set to "3010"
|
|
31
|
+
When I run local executable "jenkins" with arguments "create ."
|
|
32
|
+
Then I should see "http://localhost:3010/job/ruby/build"
|
|
33
|
+
When I run local executable "jenkins" with arguments "list"
|
|
34
|
+
Then I should see "ruby"
|
|
35
|
+
|
|
36
|
+
Scenario: Don't trigger initial job build (jenkins create --no-build)
|
|
37
|
+
Given I am in the "ruby" project folder
|
|
38
|
+
And the project uses "git" scm
|
|
39
|
+
When I run local executable "jenkins" with arguments "create . --no-build --host localhost --port 3010"
|
|
40
|
+
Then I should see exactly
|
|
41
|
+
"""
|
|
42
|
+
Added ruby project 'ruby' to Jenkins.
|
|
43
|
+
Trigger builds via:
|
|
44
|
+
URL: http://localhost:3010/job/ruby/build
|
|
45
|
+
CLI: jenkins build ruby
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
Scenario: Setup jenkins job with explicit scm url/branches (jenkins create --scm URI --scm-branches='master,other')
|
|
49
|
+
Given I am in the "ruby" project folder
|
|
50
|
+
And the project uses "git" scm
|
|
51
|
+
When I run local executable "jenkins" with arguments "create . --scm git://localhost/myapp.git --scm-branches 'master,other' --host localhost --port 3010"
|
|
52
|
+
Then I should see "Added ruby project 'ruby' to Jenkins."
|
|
53
|
+
And the job "ruby" config "scm" should be:
|
|
54
|
+
"""
|
|
55
|
+
<scm class="hudson.plugins.git.GitSCM">
|
|
56
|
+
<configVersion>1</configVersion>
|
|
57
|
+
<remoteRepositories>
|
|
58
|
+
<org.spearce.jgit.transport.RemoteConfig>
|
|
59
|
+
<string>origin</string>
|
|
60
|
+
<int>5</int>
|
|
61
|
+
<string>fetch</string>
|
|
62
|
+
<string>+refs/heads/*:refs/remotes/origin/*</string>
|
|
63
|
+
<string>receivepack</string>
|
|
64
|
+
<string>git-upload-pack</string>
|
|
65
|
+
<string>uploadpack</string>
|
|
66
|
+
<string>git-upload-pack</string>
|
|
67
|
+
<string>url</string>
|
|
68
|
+
<string>git://localhost/myapp.git</string>
|
|
69
|
+
<string>tagopt</string>
|
|
70
|
+
<string></string>
|
|
71
|
+
</org.spearce.jgit.transport.RemoteConfig>
|
|
72
|
+
</remoteRepositories>
|
|
73
|
+
<branches>
|
|
74
|
+
<hudson.plugins.git.BranchSpec>
|
|
75
|
+
<name>master</name>
|
|
76
|
+
</hudson.plugins.git.BranchSpec>
|
|
77
|
+
<hudson.plugins.git.BranchSpec>
|
|
78
|
+
<name>other</name>
|
|
79
|
+
</hudson.plugins.git.BranchSpec>
|
|
80
|
+
</branches>
|
|
81
|
+
<localBranch></localBranch>
|
|
82
|
+
<mergeOptions />
|
|
83
|
+
<recursiveSubmodules>false</recursiveSubmodules>
|
|
84
|
+
<doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
|
|
85
|
+
<authorOrCommitter>false</authorOrCommitter>
|
|
86
|
+
<clean>false</clean>
|
|
87
|
+
<wipeOutWorkspace>false</wipeOutWorkspace>
|
|
88
|
+
<pruneBranches>false</pruneBranches>
|
|
89
|
+
<buildChooser class="hudson.plugins.git.util.DefaultBuildChooser" />
|
|
90
|
+
<gitTool>Default</gitTool>
|
|
91
|
+
<submoduleCfg class="list" />
|
|
92
|
+
<relativeTargetDir></relativeTargetDir>
|
|
93
|
+
<excludedRegions></excludedRegions>
|
|
94
|
+
<excludedUsers></excludedUsers>
|
|
95
|
+
</scm>
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
Scenario: Update the SCM configuration of an existing jenkins job (jenkins update . --scm URI --scm-branches='master')
|
|
99
|
+
Given I am in the "ruby" project folder
|
|
100
|
+
And the project uses "git" scm
|
|
101
|
+
And I run local executable "jenkins" with arguments "create . --scm git://localhost/myapp.git --scm-branches 'master,other' --host localhost --port 3010"
|
|
102
|
+
Then I should see "Added ruby project 'ruby' to Jenkins."
|
|
103
|
+
And I run local executable "jenkins" with arguments "update . --scm git://localhost/myapp_new.git --scm-branches 'master' --host localhost --port 3010"
|
|
104
|
+
Then I should see "Updated ruby project 'ruby'."
|
|
105
|
+
And the job "ruby" config "scm" should be:
|
|
106
|
+
"""
|
|
107
|
+
<scm class="hudson.plugins.git.GitSCM">
|
|
108
|
+
<configVersion>1</configVersion>
|
|
109
|
+
<remoteRepositories>
|
|
110
|
+
<org.spearce.jgit.transport.RemoteConfig>
|
|
111
|
+
<string>origin</string>
|
|
112
|
+
<int>5</int>
|
|
113
|
+
<string>fetch</string>
|
|
114
|
+
<string>+refs/heads/*:refs/remotes/origin/*</string>
|
|
115
|
+
<string>receivepack</string>
|
|
116
|
+
<string>git-upload-pack</string>
|
|
117
|
+
<string>uploadpack</string>
|
|
118
|
+
<string>git-upload-pack</string>
|
|
119
|
+
<string>url</string>
|
|
120
|
+
<string>git://localhost/myapp_new.git</string>
|
|
121
|
+
<string>tagopt</string>
|
|
122
|
+
<string />
|
|
123
|
+
</org.spearce.jgit.transport.RemoteConfig>
|
|
124
|
+
</remoteRepositories>
|
|
125
|
+
<branches>
|
|
126
|
+
<hudson.plugins.git.BranchSpec>
|
|
127
|
+
<name>master</name>
|
|
128
|
+
</hudson.plugins.git.BranchSpec>
|
|
129
|
+
</branches>
|
|
130
|
+
<localBranch />
|
|
131
|
+
<mergeOptions />
|
|
132
|
+
<recursiveSubmodules>false</recursiveSubmodules>
|
|
133
|
+
<doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
|
|
134
|
+
<authorOrCommitter>false</authorOrCommitter>
|
|
135
|
+
<clean>false</clean>
|
|
136
|
+
<wipeOutWorkspace>false</wipeOutWorkspace>
|
|
137
|
+
<buildChooser class="hudson.plugins.git.util.DefaultBuildChooser" />
|
|
138
|
+
<gitTool>Default</gitTool>
|
|
139
|
+
<submoduleCfg class="list" />
|
|
140
|
+
<relativeTargetDir />
|
|
141
|
+
<excludedRegions />
|
|
142
|
+
<excludedUsers />
|
|
143
|
+
</scm>
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
Scenario: Setup jenkins job with multiple rubies (jenkins create --rubies '1.8.7,rbx-head,jruby')
|
|
147
|
+
Given I am in the "ruby" project folder
|
|
148
|
+
And the project uses "git" scm
|
|
149
|
+
When I run local executable "jenkins" with arguments "create . --rubies '1.8.7,rbx-head,jruby' --host localhost --port 3010"
|
|
150
|
+
Then I should see "Added ruby project 'ruby' to Jenkins."
|
|
151
|
+
And the job "ruby" config "axes" should be:
|
|
152
|
+
"""
|
|
153
|
+
<axes>
|
|
154
|
+
<hudson.matrix.TextAxis>
|
|
155
|
+
<name>RUBY_VERSION</name>
|
|
156
|
+
<values>
|
|
157
|
+
<string>1.8.7</string>
|
|
158
|
+
<string>rbx-head</string>
|
|
159
|
+
<string>jruby</string>
|
|
160
|
+
</values>
|
|
161
|
+
</hudson.matrix.TextAxis>
|
|
162
|
+
</axes>
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
Scenario: Setup jenkins job with multiple rubies and multiple nodes (jenkins create --rubies.. --node_labels..)
|
|
166
|
+
Given I am in the "ruby" project folder
|
|
167
|
+
And the project uses "git" scm
|
|
168
|
+
When I run local executable "jenkins" with arguments "create . --rubies '1.8.7,rbx-head,jruby' --node-labels '1.8.7,ubuntu' --host localhost --port 3010"
|
|
169
|
+
Then I should see "Added ruby project 'ruby' to Jenkins."
|
|
170
|
+
And the job "ruby" config "axes" should be:
|
|
171
|
+
"""
|
|
172
|
+
<axes>
|
|
173
|
+
<hudson.matrix.TextAxis>
|
|
174
|
+
<name>RUBY_VERSION</name>
|
|
175
|
+
<values>
|
|
176
|
+
<string>1.8.7</string>
|
|
177
|
+
<string>rbx-head</string>
|
|
178
|
+
<string>jruby</string>
|
|
179
|
+
</values>
|
|
180
|
+
</hudson.matrix.TextAxis>
|
|
181
|
+
<hudson.matrix.LabelAxis>
|
|
182
|
+
<name>label</name>
|
|
183
|
+
<values>
|
|
184
|
+
<string>1.8.7</string>
|
|
185
|
+
<string>ubuntu</string>
|
|
186
|
+
</values>
|
|
187
|
+
</hudson.matrix.LabelAxis>
|
|
188
|
+
</axes>
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
Scenario: Setup jenkins job for a specific node label (jenkins create --assigned_node)
|
|
192
|
+
Given I am in the "ruby" project folder
|
|
193
|
+
And the project uses "git" scm
|
|
194
|
+
When I run local executable "jenkins" with arguments "create . --assigned_node my_node --host localhost --port 3010"
|
|
195
|
+
Then I should see "Added ruby project 'ruby' to Jenkins."
|
|
196
|
+
|
|
197
|
+
Scenario: Select 'rails3' project type (jenkins create --template rails3)
|
|
198
|
+
Given I am in the "rails-3" project folder
|
|
199
|
+
And the project uses "git" scm
|
|
200
|
+
When I run local executable "jenkins" with arguments "create . --template rails3 --host localhost --port 3010"
|
|
201
|
+
Then I should see "Added rails3 project 'rails-3' to Jenkins."
|
|
202
|
+
|
|
203
|
+
Scenario: Select 'erlang' project type (jenkins create --template erlang)
|
|
204
|
+
Given I am in the "erlang" project folder
|
|
205
|
+
And the project uses "git" scm
|
|
206
|
+
When I run local executable "jenkins" with arguments "create . --template erlang --host localhost --port 3010"
|
|
207
|
+
Then I should see "Added erlang project 'erlang' to Jenkins."
|
|
208
|
+
|
|
209
|
+
Scenario: Create job without default steps (jenkins create --no-template)
|
|
210
|
+
Given I am in the "non-bundler" project folder
|
|
211
|
+
And the project uses "git" scm
|
|
212
|
+
When I run local executable "jenkins" with arguments "create . --no-template --host localhost --port 3010"
|
|
213
|
+
Then I should see "Added project 'non-bundler' to Jenkins."
|
|
214
|
+
And the job "non-bundler" config "builders" should be:
|
|
215
|
+
"""
|
|
216
|
+
<builders>
|
|
217
|
+
<hudson.tasks.Shell>
|
|
218
|
+
<command>echo "THERE ARE NO STEPS! Except this one..."</command>
|
|
219
|
+
</hudson.tasks.Shell>
|
|
220
|
+
</builders>
|
|
221
|
+
"""
|
|
222
|
+
|
|
223
|
+
Scenario: Reject projects that don't use bundler (jenkins create)
|
|
224
|
+
Given I am in the "non-bundler" project folder
|
|
225
|
+
And the project uses "git" scm
|
|
226
|
+
When I run local executable "jenkins" with arguments "create . --host localhost --port 3010"
|
|
227
|
+
Then I should see "Ruby/Rails projects without a Gemfile are currently unsupported."
|
|
228
|
+
|
|
229
|
+
Scenario: Attempt to create project without scm (jenkins create)
|
|
230
|
+
Given I am in the "ruby" project folder
|
|
231
|
+
When I run local executable "jenkins" with arguments "create . --host localhost --port 3010"
|
|
232
|
+
Then I should see "Cannot determine project SCM. Currently supported:"
|
|
233
|
+
|
|
234
|
+
Scenario: Recreate a job (jenkins create --override)
|
|
235
|
+
Given I am in the "ruby" project folder
|
|
236
|
+
When I create a job
|
|
237
|
+
Then I should see "Added ruby project 'ruby' to Jenkins."
|
|
238
|
+
When I recreate a job
|
|
239
|
+
Then I should see "Added ruby project 'ruby' to Jenkins."
|
|
240
|
+
|
|
241
|
+
Scenario: Trigger a job build (jenkins build)
|
|
242
|
+
Given I am in the "ruby" project folder
|
|
243
|
+
When I create a job
|
|
244
|
+
When I run local executable "jenkins" with arguments "build"
|
|
245
|
+
Then I should see "Build for 'ruby' running now..."
|
|
246
|
+
|
|
247
|
+
Scenario: Trigger a job build on invaild project (jenkins build)
|
|
248
|
+
Given I am in the "ruby" project folder
|
|
249
|
+
When I run local executable "jenkins" with arguments "build . --host localhost --port 3010"
|
|
250
|
+
Then I should see "ERROR: No job 'ruby' on server."
|
|
251
|
+
|
|
252
|
+
Scenario: Remove a job (jenkins remove)
|
|
253
|
+
Given I am in the "ruby" project folder
|
|
254
|
+
When I create a job
|
|
255
|
+
Then I should see "Added ruby project 'ruby' to Jenkins."
|
|
256
|
+
When I run local executable "jenkins" with arguments "remove ."
|
|
257
|
+
Then I should see "Removed project 'ruby' from Jenkins."
|
|
258
|
+
|
|
259
|
+
Scenario: Remove a job that doesn't exist gives error (jenkins remove)
|
|
260
|
+
Given I am in the "ruby" project folder
|
|
261
|
+
When I run local executable "jenkins" with arguments "remove . --host localhost --port 3010"
|
|
262
|
+
Then I should see "ERROR: Failed to delete project 'ruby'."
|
|
263
|
+
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
@jenkins-server
|
|
2
|
+
Feature: Adding slave nodes
|
|
3
|
+
In order to have different environments for different projects
|
|
4
|
+
As a developer
|
|
5
|
+
I want to add new slave nodes to my Jenkins instance
|
|
6
|
+
|
|
7
|
+
Background:
|
|
8
|
+
Given I have a Jenkins server running
|
|
9
|
+
And the Jenkins server has no slaves
|
|
10
|
+
When I run local executable "jenkins" with arguments "nodes --host localhost --port 3010"
|
|
11
|
+
Then I should see exactly
|
|
12
|
+
"""
|
|
13
|
+
master
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
Scenario: Add slave via API (jenkins nodes)
|
|
17
|
+
When I create a new node with the following options on "http://localhost:3010":
|
|
18
|
+
| name | Slave 1 |
|
|
19
|
+
| label | app1 app2 app3 |
|
|
20
|
+
| slave_host | foo1.bar.com |
|
|
21
|
+
| slave_user | jenkins |
|
|
22
|
+
When I run local executable "jenkins" with arguments "nodes"
|
|
23
|
+
Then I should see exactly
|
|
24
|
+
"""
|
|
25
|
+
master
|
|
26
|
+
Slave 1
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
Scenario: Add slave via CLI with name defaulted to URL (jenkins add_node)
|
|
30
|
+
When I run local executable "jenkins" with arguments "add_node foo1.bar.com --slave-user deploy --labels 'app1,app2'"
|
|
31
|
+
Then I should see exactly
|
|
32
|
+
"""
|
|
33
|
+
Added slave node 'foo1.bar.com' to foo1.bar.com
|
|
34
|
+
"""
|
|
35
|
+
When I run local executable "jenkins" with arguments "add_node foo1.bar.com --slave-user deploy --labels 'app1,app2'"
|
|
36
|
+
Then I should see exactly
|
|
37
|
+
"""
|
|
38
|
+
Slave called 'foo1.bar.com' already exists
|
|
39
|
+
ERROR: Failed to add slave node foo1.bar.com
|
|
40
|
+
"""
|
|
41
|
+
When I run local executable "jenkins" with arguments "nodes"
|
|
42
|
+
Then I should see exactly
|
|
43
|
+
"""
|
|
44
|
+
master
|
|
45
|
+
foo1.bar.com
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
@wip
|
|
49
|
+
Scenario: Add a local Vagrant/VirtualBox VM as a slave (jenkins add_node --vagrant)
|
|
50
|
+
Given I am in the "rails-3" project folder
|
|
51
|
+
When I run local executable "jenkins" with arguments "add_node localhost --name rails-3 --vagrant --labels 'app1,app2'"
|
|
52
|
+
Then I should see exactly
|
|
53
|
+
"""
|
|
54
|
+
Added slave node 'rails-3' to localhost
|
|
55
|
+
"""
|
|
56
|
+
When I run local executable "jenkins" with arguments "nodes"
|
|
57
|
+
Then I should see exactly
|
|
58
|
+
"""
|
|
59
|
+
master
|
|
60
|
+
rails-3
|
|
61
|
+
"""
|
|
62
|
+
And the Jenkins config "slaves" should be:
|
|
63
|
+
"""
|
|
64
|
+
<slaves>
|
|
65
|
+
<slave>
|
|
66
|
+
<name>rails-3</name>
|
|
67
|
+
<description>Automatically created by Jenkins.rb</description>
|
|
68
|
+
<remoteFS>/vagrant/tmp/jenkins-slave/</remoteFS>
|
|
69
|
+
<numExecutors>2</numExecutors>
|
|
70
|
+
<mode>EXCLUSIVE</mode>
|
|
71
|
+
<retentionStrategy class="hudson.slaves.RetentionStrategy$Always" />
|
|
72
|
+
<launcher class="hudson.plugins.sshslaves.SSHLauncher">
|
|
73
|
+
<host>localhost</host>
|
|
74
|
+
<port>2222</port>
|
|
75
|
+
<username>vagrant</username>
|
|
76
|
+
<password>rvDV+OTiBj3UtK5p7sl62Q==</password>
|
|
77
|
+
<privatekey>/Library/Ruby/Gems/1.8/gems/vagrant-0.6.7/keys/vagrant</privatekey>
|
|
78
|
+
</launcher>
|
|
79
|
+
<label>app1 app2</label>
|
|
80
|
+
<nodeProperties />
|
|
81
|
+
</slave>
|
|
82
|
+
</slaves>
|
|
83
|
+
"""
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
|
|
2
|
+
Given /^this project is active project folder/ do
|
|
3
|
+
@active_project_folder = File.expand_path(File.dirname(__FILE__) + "/../..")
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
Given /^env variable \$([\w_]+) set to( project path|) "(.*)"/ do |env_var, path, value|
|
|
7
|
+
in_project_folder {
|
|
8
|
+
value = File.expand_path(value)
|
|
9
|
+
} unless path.empty?
|
|
10
|
+
ENV[env_var] = value
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
Given /"(.*)" folder is deleted/ do |folder|
|
|
14
|
+
in_project_folder { FileUtils.rm_rf folder }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
When /^I invoke "(.*)" generator with arguments "(.*)"$/ do |generator, arguments|
|
|
18
|
+
@stdout = StringIO.new
|
|
19
|
+
in_project_folder do
|
|
20
|
+
if Object.const_defined?("APP_ROOT")
|
|
21
|
+
APP_ROOT.replace(FileUtils.pwd)
|
|
22
|
+
else
|
|
23
|
+
APP_ROOT = FileUtils.pwd
|
|
24
|
+
end
|
|
25
|
+
run_generator(generator, arguments.split(' '), SOURCES, :stdout => @stdout)
|
|
26
|
+
end
|
|
27
|
+
File.open(File.join(@tmp_root, "generator.out"), "w") do |f|
|
|
28
|
+
@stdout.rewind
|
|
29
|
+
f << @stdout.read
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
When /^I run executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
|
34
|
+
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
|
35
|
+
in_project_folder do
|
|
36
|
+
system "#{executable.inspect} #{arguments} > #{@stdout.inspect} 2> #{@stdout.inspect}"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
When /^I run project executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
|
41
|
+
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
|
42
|
+
in_project_folder do
|
|
43
|
+
system "ruby #{executable.inspect} #{arguments} > #{@stdout.inspect} 2> #{@stdout.inspect}"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
When /^I run local executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
|
48
|
+
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
|
49
|
+
executable = File.expand_path(File.join(File.dirname(__FILE__), "/../../bin", executable))
|
|
50
|
+
in_project_folder do
|
|
51
|
+
system "ruby #{executable.inspect} #{arguments} > #{@stdout.inspect} 2> #{@stdout.inspect}"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
When /^I invoke task "rake (.*)"/ do |task|
|
|
56
|
+
@stdout = File.expand_path(File.join(@tmp_root, "tests.out"))
|
|
57
|
+
in_project_folder do
|
|
58
|
+
system "rake #{task} --trace > #{@stdout.inspect} 2> #{@stdout.inspect}"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
Then /^folder "(.*)" (is|is not) created/ do |folder, is|
|
|
63
|
+
in_project_folder do
|
|
64
|
+
File.exists?(folder).should(is == 'is' ? be_true : be_false)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
Then /^file "(.*)" (is|is not) created/ do |file, is|
|
|
69
|
+
in_project_folder do
|
|
70
|
+
File.exists?(file).should(is == 'is' ? be_true : be_false)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
Then /^file with name matching "(.*)" is created/ do |pattern|
|
|
75
|
+
in_project_folder do
|
|
76
|
+
Dir[pattern].should_not be_empty
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
Then /^file "(.*)" contents (does|does not) match \/(.*)\// do |file, does, regex|
|
|
81
|
+
in_project_folder do
|
|
82
|
+
actual_output = File.read(file)
|
|
83
|
+
(does == 'does') ?
|
|
84
|
+
actual_output.should(match(/#{regex}/)) :
|
|
85
|
+
actual_output.should_not(match(/#{regex}/))
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
Then /gem file "(.*)" and generated file "(.*)" should be the same/ do |gem_file, project_file|
|
|
90
|
+
File.exists?(gem_file).should be_true
|
|
91
|
+
File.exists?(project_file).should be_true
|
|
92
|
+
gem_file_contents = File.read(File.dirname(__FILE__) + "/../../#{gem_file}")
|
|
93
|
+
project_file_contents = File.read(File.join(@active_project_folder, project_file))
|
|
94
|
+
project_file_contents.should == gem_file_contents
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
Then /^(does|does not) invoke generator "(.*)"$/ do |does_invoke, generator|
|
|
98
|
+
actual_output = get_command_output
|
|
99
|
+
does_invoke == "does" ?
|
|
100
|
+
actual_output.should(match(/dependency\s+#{generator}/)) :
|
|
101
|
+
actual_output.should_not(match(/dependency\s+#{generator}/))
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
Then /help options "(.*)" and "(.*)" are displayed/ do |opt1, opt2|
|
|
105
|
+
actual_output = get_command_output
|
|
106
|
+
actual_output.should match(/#{opt1}/)
|
|
107
|
+
actual_output.should match(/#{opt2}/)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
Then /^I should see "([^\"]*)"$/ do |text|
|
|
111
|
+
actual_output = get_command_output
|
|
112
|
+
actual_output.should contain(text)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
Then /^I should not see "([^\"]*)"$/ do |text|
|
|
116
|
+
actual_output =
|
|
117
|
+
actual_output.should_not contain(text)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
Then /^I should see$/ do |text|
|
|
121
|
+
actual_output = get_command_output
|
|
122
|
+
actual_output.should contain(text)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
Then /^I should not see$/ do |text|
|
|
126
|
+
actual_output = get_command_output
|
|
127
|
+
actual_output.should_not contain(text)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
Then /^I should see exactly$/ do |text|
|
|
131
|
+
actual_output = get_command_output
|
|
132
|
+
actual_output.should == text
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
Then /^I should see all (\d+) tests pass/ do |expected_test_count|
|
|
136
|
+
expected = %r{^#{expected_test_count} tests, \d+ assertions, 0 failures, 0 errors}
|
|
137
|
+
actual_output = get_command_output
|
|
138
|
+
actual_output.should match(expected)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
Then /^I should see all (\d+) examples pass/ do |expected_test_count|
|
|
142
|
+
expected = %r{^#{expected_test_count} examples?, 0 failures}
|
|
143
|
+
actual_output = get_command_output
|
|
144
|
+
actual_output.should match(expected)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
Then /^yaml file "(.*)" contains (\{.*\})/ do |file, yaml|
|
|
148
|
+
in_project_folder do
|
|
149
|
+
yaml = eval yaml
|
|
150
|
+
YAML.load(File.read(file)).should == yaml
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
Then /^Rakefile can display tasks successfully/ do
|
|
155
|
+
@stdout = File.expand_path(File.join(@tmp_root, "rakefile.out"))
|
|
156
|
+
in_project_folder do
|
|
157
|
+
system "rake -T > #{@stdout.inspect} 2> #{@stdout.inspect}"
|
|
158
|
+
end
|
|
159
|
+
actual_output = get_command_output
|
|
160
|
+
actual_output.should match(/^rake\s+\w+\s+#\s.*/)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
Then /^task "rake (.*)" is executed successfully/ do |task|
|
|
164
|
+
@stdout.should_not be_nil
|
|
165
|
+
actual_output = get_command_output
|
|
166
|
+
actual_output.should_not match(/^Don't know how to build task '#{task}'/)
|
|
167
|
+
actual_output.should_not match(/Error/i)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
Then /^gem spec key "(.*)" contains \/(.*)\// do |key, regex|
|
|
171
|
+
in_project_folder do
|
|
172
|
+
gem_file = Dir["pkg/*.gem"].first
|
|
173
|
+
gem_spec = Gem::Specification.from_yaml(`gem spec #{gem_file}`)
|
|
174
|
+
spec_value = gem_spec.send(key.to_sym)
|
|
175
|
+
spec_value.to_s.should match(/#{regex}/)
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
Then /^the file "([^\"]*)" is a valid gemspec$/ do |filename|
|
|
180
|
+
spec = eval(File.read(filename))
|
|
181
|
+
spec.validate
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
When /^I create a new node with the following options on "http:\/\/(.+?):(\d+)":$/ do |host, port, table|
|
|
185
|
+
options = table.raw.inject({}) do |options, (key, value)|
|
|
186
|
+
options[(key.to_sym rescue key) || key] = value
|
|
187
|
+
options
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
Jenkins::Api.setup_base_url(:host => host, :port => port.to_i)
|
|
191
|
+
Jenkins::Api.add_node(options)
|
|
192
|
+
end
|