jenkins-capistrano 0.0.7 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/.gitignore +73 -16
  2. data/Gemfile.lock +80 -0
  3. data/README.md +169 -56
  4. data/Vagrantfile +23 -0
  5. data/example/Gemfile +3 -1
  6. data/example/README.md +13 -17
  7. data/example/config/deploy.rb +8 -12
  8. data/example/config/deploy/develop.rb +5 -3
  9. data/example/config/deploy/production.rb +13 -3
  10. data/example/config/deploy/staging.rb +13 -4
  11. data/example/config/jenkins/nodes/develop/dev-slave01.xml.erb +33 -0
  12. data/example/config/jenkins/nodes/production/prod-slave01.xml.erb +33 -0
  13. data/example/config/jenkins/nodes/production/prod-slave02.xml.erb +33 -0
  14. data/example/config/jenkins/nodes/production/prod-slave03.xml.erb +33 -0
  15. data/example/config/jenkins/nodes/staging/stg-slave01.xml.erb +33 -0
  16. data/example/config/jenkins/nodes/staging/stg-slave02.xml.erb +33 -0
  17. data/example/config/jenkins/nodes/staging/stg-slave03.xml.erb +33 -0
  18. data/example/script/bootstrap +1 -2
  19. data/features/config_jobs.feature +162 -0
  20. data/features/config_nodes.feature +121 -0
  21. data/features/config_views.feature +136 -0
  22. data/features/help.feature +83 -0
  23. data/features/step_definitions/jenkins_steps.rb +19 -0
  24. data/features/support/env.rb +5 -0
  25. data/features/support/jenkins_helper.rb +113 -0
  26. data/jenkins-capistrano.gemspec +4 -3
  27. data/lib/jenkins-capistrano.rb +2 -215
  28. data/lib/jenkins-capistrano/configurator.rb +87 -0
  29. data/lib/jenkins-capistrano/tasks.rb +112 -0
  30. data/lib/jenkins-capistrano/template.rb +20 -0
  31. data/lib/jenkins-capistrano/version.rb +1 -1
  32. metadata +87 -41
  33. checksums.yaml +0 -7
  34. data/example/config/jenkins/jobs/.gitkeep +0 -0
  35. data/example/config/jenkins/nodes/develop/dev-slave01.json +0 -17
  36. data/example/config/jenkins/nodes/production/prod-slave01.json +0 -17
  37. data/example/config/jenkins/nodes/production/prod-slave02.json +0 -17
  38. data/example/config/jenkins/nodes/production/prod-slave03.json +0 -17
  39. data/example/config/jenkins/nodes/staging/stg-slave01.json +0 -17
  40. data/example/config/jenkins/nodes/staging/stg-slave02.json +0 -17
  41. data/example/config/jenkins/nodes/staging/stg-slave03.json +0 -17
  42. data/lib/jenkins-capistrano/client.rb +0 -66
  43. data/lib/jenkins-capistrano/client/job.rb +0 -47
  44. data/lib/jenkins-capistrano/client/node.rb +0 -103
  45. data/lib/jenkins-capistrano/client/plugin_manager.rb +0 -51
  46. data/lib/jenkins-capistrano/client/update_center.rb +0 -43
  47. data/lib/jenkins-capistrano/client/view.rb +0 -40
data/.gitignore CHANGED
@@ -1,18 +1,75 @@
1
+ # Created by http://www.gitignore.io
2
+
3
+ ### Ruby ###
1
4
  *.gem
2
5
  *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
- vendor
6
+ /.config
7
+ /coverage/
8
+ /InstalledFiles
9
+ /pkg/
10
+ /spec/reports/
11
+ /test/tmp/
12
+ /test/version_tmp/
13
+ /tmp/
14
+ /example/Gemfile.lock
15
+
16
+ ## Specific to RubyMotion:
17
+ .dat*
18
+ .repl_history
19
+ build/
20
+
21
+ ## Documentation cache and generated files:
22
+ /.yardoc/
23
+ /_yardoc/
24
+ /doc/
25
+ /rdoc/
26
+
27
+ ## Environment normalisation:
28
+ /.bundle/
29
+ /lib/bundler/man/
30
+
31
+ # for a library or gem, you might want to ignore these files since the code is
32
+ # intended to run in multiple environments; otherwise, check them in:
33
+ # Gemfile.lock
34
+ # .ruby-version
35
+ # .ruby-gemset
36
+
37
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
38
+ .rvmrc
39
+
40
+
41
+ ### OSX ###
42
+ .DS_Store
43
+ .AppleDouble
44
+ .LSOverride
45
+
46
+ # Icon must end with two \r
47
+ Icon
48
+
49
+ # Thumbnails
50
+ ._*
51
+
52
+ # Files that might appear on external disk
53
+ .Spotlight-V100
54
+ .Trashes
55
+
56
+ # Directories potentially created on remote AFP share
57
+ .AppleDB
58
+ .AppleDesktop
59
+ Network Trash Folder
60
+ Temporary Items
61
+ .apdisk
62
+
63
+
64
+ ### Vagrant ###
65
+ .vagrant/
66
+
67
+
68
+ ### vim ###
69
+ [._]*.s[a-w][a-z]
70
+ [._]s[a-w][a-z]
71
+ *.un~
72
+ Session.vim
73
+ .netrwhist
74
+ *~
75
+
@@ -0,0 +1,80 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ jenkins-capistrano (0.1.0)
5
+ capistrano (< 3.0.0)
6
+ jenkins_api_client (>= 1.0.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ aruba (0.5.4)
12
+ childprocess (>= 0.3.6)
13
+ cucumber (>= 1.1.1)
14
+ rspec-expectations (>= 2.7.0)
15
+ builder (3.2.2)
16
+ capistrano (2.15.5)
17
+ highline
18
+ net-scp (>= 1.0.0)
19
+ net-sftp (>= 2.0.0)
20
+ net-ssh (>= 2.0.14)
21
+ net-ssh-gateway (>= 1.1.0)
22
+ childprocess (0.5.3)
23
+ ffi (~> 1.0, >= 1.0.11)
24
+ coderay (1.1.0)
25
+ cucumber (1.3.15)
26
+ builder (>= 2.1.2)
27
+ diff-lcs (>= 1.1.3)
28
+ gherkin (~> 2.12)
29
+ multi_json (>= 1.7.5, < 2.0)
30
+ multi_test (>= 0.1.1)
31
+ diff-lcs (1.2.5)
32
+ ffi (1.9.3)
33
+ gherkin (2.12.2)
34
+ multi_json (~> 1.3)
35
+ highline (1.6.21)
36
+ jenkins_api_client (1.0.0)
37
+ json
38
+ mixlib-shellout (>= 1.1.0)
39
+ nokogiri (~> 1.6.0)
40
+ terminal-table (>= 1.4.0)
41
+ thor (>= 0.16.0)
42
+ json (1.8.1)
43
+ method_source (0.8.2)
44
+ mini_portile (0.6.0)
45
+ mixlib-shellout (1.4.0)
46
+ multi_json (1.10.1)
47
+ multi_test (0.1.1)
48
+ net-scp (1.2.1)
49
+ net-ssh (>= 2.6.5)
50
+ net-sftp (2.1.2)
51
+ net-ssh (>= 2.6.5)
52
+ net-ssh (2.9.1)
53
+ net-ssh-gateway (1.2.0)
54
+ net-ssh (>= 2.6.5)
55
+ nokogiri (1.6.2.1)
56
+ mini_portile (= 0.6.0)
57
+ pry (0.10.0)
58
+ coderay (~> 1.1.0)
59
+ method_source (~> 0.8.1)
60
+ slop (~> 3.4)
61
+ rake (10.3.2)
62
+ rspec-expectations (3.0.2)
63
+ diff-lcs (>= 1.2.0, < 2.0)
64
+ rspec-support (~> 3.0.0)
65
+ rspec-support (3.0.2)
66
+ slop (3.5.0)
67
+ tapp (1.4.0)
68
+ thor
69
+ terminal-table (1.4.5)
70
+ thor (0.19.1)
71
+
72
+ PLATFORMS
73
+ ruby
74
+
75
+ DEPENDENCIES
76
+ aruba
77
+ jenkins-capistrano!
78
+ pry
79
+ rake
80
+ tapp
data/README.md CHANGED
@@ -1,29 +1,56 @@
1
1
  # jenkins-capistrano
2
2
 
3
- The capistrano tasks for Jenkins CI Server. Supports to manage following things:
3
+ **Note**: 0.1.0 has incompatible change for Node creation.
4
+ see [Release Notes](#release-notes) and [Node Configuration](#node-configuration) for detail.
5
+
6
+ #### Table of Contents
7
+
8
+ 1. [Overview](#overview)
9
+ 1. [Installation](#installation)
10
+ 1. [Usage](#usage)
11
+ * [Job Configuration](#job-configuration)
12
+ * [Disabling Jobs](#disabling-jobs)
13
+ * [Node Configuration](#node-configuraton)
14
+ * [Note for the Credentials Plugin and multistage-extension]()
15
+ * [View Configuration](#view-configuraton)
16
+ 1. [Don't know how to write config.xml?](#dont-know-how-to-write-configxml)
17
+ 1. [Known Issues](#known-issues)
18
+ * [Using mutlibyte characters in config.xml](#using-multibyte-characters-in-configxml)
19
+ 1. [Todo](#todo)
20
+ 1. [Release Notes](#release-notes)
21
+ 1. [Contributing](#contributing)
22
+
23
+ ## Overview
24
+
25
+ The capistrano tasks for Jenkins CI Server which manages following things:
4
26
 
5
27
  * Job
6
28
  * Node
7
29
  * View
8
- * Plugins(Experimental)
9
30
 
10
31
  ## Installation
11
32
 
12
33
  Add this line to your application's Gemfile::
13
34
 
14
- gem 'jenkins-capistrano'
35
+ ```
36
+ gem 'jenkins-capistrano'
37
+ ```
15
38
 
16
39
  And then execute::
17
40
 
18
- $ bundle
41
+ ```
42
+ $ bundle
43
+ ```
19
44
 
20
45
  Or install it yourself as::
21
46
 
22
- $ gem install jenkins-capistrano
47
+ ```
48
+ $ gem install jenkins-capistrano
49
+ ```
23
50
 
24
- ## Example
51
+ ## Usage
25
52
 
26
- See [example directory](https://github.com/cynipe/jenkins-capistrano/tree/develop/example>) or following instructions.
53
+ See example directory or following instructions.
27
54
 
28
55
  ### Job Configuration
29
56
 
@@ -54,7 +81,7 @@ set :jenkins_host, 'http://localhost:8080'
54
81
  before 'deploy', 'jenkins:deploy_jobs'
55
82
  ```
56
83
 
57
- #### Want to disabling some jobs for specific environment?
84
+ #### Disabling Jobs
58
85
 
59
86
  Since 0.0.5, you can disabling jobs using `disabled_jobs` option.
60
87
  Use this option with [multistage-extension](<https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension>).
@@ -64,7 +91,6 @@ Put the following line into `config/deploy/<env>.rb`:
64
91
  set :disabled_jobs, %w(job1 job2)
65
92
  ```
66
93
 
67
-
68
94
  ### Node Configuration
69
95
 
70
96
  config directory structure(name your json file as a node name):
@@ -73,32 +99,46 @@ config
73
99
  ├── deploy.rb
74
100
  └── jenkins
75
101
     └── nodes
76
-    ├── node1.json
77
-    ├── node2.json
78
-    └── node3.json
102
+    ├── node1.xml
103
+    ├── node2.xml
104
+    └── node3.xml
79
105
  ```
80
106
 
81
107
  sample node configuration:
82
- ```json
83
- {
84
- "name" : "example",
85
- "type" : "hudson.slaves.DumbSlave$DescriptorImpl",
86
- "description" : "some description",
87
- "executors" : 2,
88
- "labels" : "linux, java, ruby",
89
- "slave_host" : "example.com",
90
- "slave_port" : 22,
91
- "slave_user" : "jenkins",
92
- "master_key" : "/var/lib/jenkins/.ssh/id_rsa",
93
- "slave_fs" : "/home/jenkins",
94
- "exclusive" : true,
95
- "java_path": "/opt/java/bin/java",
96
- "jvm_options": "-Xmx512M",
97
- "env_vars": {
98
- "key1": "val1",
99
- "key2": "val2"
100
- }
101
- }
108
+ ```xml
109
+ <?xml version="1.0" encoding="UTF-8"?>
110
+ <slave>
111
+ <name>example</name>
112
+ <description/>
113
+ <remoteFS>/home/jenkins</remoteFS>
114
+ <numExecutors>5</numExecutors>
115
+ <mode>EXCLUSIVE</mode>
116
+ <retentionStrategy class="hudson.slaves.RetentionStrategy$Always"/>
117
+ <launcher class="hudson.plugins.sshslaves.SSHLauncher" plugin="ssh-slaves@1.5">
118
+ <host>dev-slave01.local</host>
119
+ <port>22</port>
120
+ <credentialsId>CREDENTIAL-ID-FOR-SLAVE</credentialsId>
121
+ <jvmOptions>-Dfile.encoding=UTF-8</jvmOptions>
122
+ </launcher>
123
+ <label>hello</label>
124
+ <nodeProperties>
125
+ <hudson.slaves.EnvironmentVariablesNodeProperty>
126
+ <envVars serialization="custom">
127
+ <unserializable-parents/>
128
+ <tree-map>
129
+ <default>
130
+ <comparator class="hudson.util.CaseInsensitiveComparator"/>
131
+ </default>
132
+ <int>2</int><!-- must specify env var count -->
133
+ <string>LANG</string>
134
+ <string>ja_JP.UTF-8</string>
135
+ <string>ENVIRONMENT</string>
136
+ <string>develop</string>
137
+ </tree-map>
138
+ </envVars>
139
+ </hudson.slaves.EnvironmentVariablesNodeProperty>
140
+ </nodeProperties>
141
+ </slave>
102
142
  ```
103
143
 
104
144
  deploy.rb:
@@ -115,6 +155,62 @@ set :jenkins_host, 'http://localhost:8080'
115
155
  before 'deploy', 'jenkins:config_nodes'
116
156
  ```
117
157
 
158
+ #### Note for the Credentials Plugin and multistage-extension
159
+
160
+ Recently, Jenkins has changed the slave's auth method to use
161
+ [Credentials Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Credentials+Plugin),
162
+ and we need to use its id(credentialsId) to create slave configuration.
163
+ However, Credentials Plugin doesn't have a REST interface to manage their credentials,
164
+ and credentialsId is different on every Jenkins master.
165
+
166
+ So, if you want to use same config.xml against different masters,
167
+ use the ERB template support to specify correct credentialsId like as following:
168
+
169
+ config/jenkins/nodes/node1.xml.erb:
170
+ ```xml
171
+ <?xml version="1.0" encoding="UTF-8"?>
172
+ <slave>
173
+ <name>batch-slave</name>
174
+ <description/>
175
+ <remoteFS>/home/jenkins</remoteFS>
176
+ <numExecutors>5</numExecutors>
177
+ <mode>EXCLUSIVE</mode>
178
+ <retentionStrategy class="hudson.slaves.RetentionStrategy$Always"/>
179
+ <launcher class="hudson.plugins.sshslaves.SSHLauncher" plugin="ssh-slaves@1.5">
180
+ <host>batch-slave</host>
181
+ <port>22</port>
182
+ <credentialsId><%= @credential_id %></credentialsId>
183
+ <jvmOptions>-Dfile.encoding=UTF-8</jvmOptions>
184
+ </launcher>
185
+ <label>hello</label>
186
+ <nodeProperties/>
187
+ </slave>
188
+ ```
189
+
190
+ config/deploy.rb
191
+ ```ruby
192
+ set :application, "your-awesome-app"
193
+ set :scm, :git
194
+ set :repository, "https://github.com/your/repository.git"
195
+
196
+ set :jenkins_host, 'http://localhost:8080'
197
+ before 'deploy', 'jenkins:config_nodes'
198
+ ```
199
+
200
+ config/deploy/staging.rb:
201
+ ```xml
202
+ set :jenkins_template_vars, {
203
+ :credential_id => 'STAGING-CREDENTIAL_ID'
204
+ }
205
+ ```
206
+
207
+ config/deploy/production.rb:
208
+ ```xml
209
+ set :jenkins_template_vars, {
210
+ :credential_id => 'PRODUCTION-CREDENTIAL_ID'
211
+ }
212
+ ```
213
+
118
214
  ### View Configuration
119
215
 
120
216
  config directory structure(name your json file as a node name):
@@ -166,37 +262,49 @@ set :jenkins_host, 'http://localhost:8080'
166
262
  before 'deploy', 'jenkins:config_views'
167
263
  ```
168
264
 
169
- #### Don't know how to write config.xml for view?
265
+ ## Don't know how to write config.xml?
170
266
 
171
- Create or configure the view you want to manage via usual operation through the Jenkins UI.
172
- Then, open the `JENKINS_HOME/config.xml` and copy the desired configuration from `<views>` section, and
173
- ommit `<owner class="hudson" reference="../../.."/>` line.
267
+ First, create the job, node, or view you want to manage with via the Jenkins UI.
268
+ Then, runnning following command to download them:
174
269
 
175
- ### Plugin Configuration(experimental)
270
+ ```
271
+ # For the job
272
+ curl -o config/jenkins/jobs/<job_name>.xml http://jenkins.example.org/job/<job_name>/config.xml
176
273
 
177
- #### Note
274
+ # For the node
275
+ curl -o config/jenkins/nodes/<node_name>.xml http://jenkins.example.org/computer/<node_name>/config.xml
178
276
 
179
- This feature is may change its API without any notice.
180
- Use at your own risk.
277
+ # For the view
278
+ curl -o config/jenkins/views/<view_name>.xml http://jenkins.example.org/view/<view_name>/config.xml
279
+ ```
181
280
 
182
- deploy.rb:
183
- ```ruby
184
- set :application, "your-awesome-app"
185
- set :scm, :git
186
- set :repository, "https://github.com/your/repository.git"
281
+ ## Known Issues
282
+
283
+ ### Using mutlibyte characters in config.xml
187
284
 
188
- set :jenkins_plugins, %w(cron_column envinject join)
189
- # you can specify version as follows:
190
- #set :jenkins_plugins, %w(cron_column@1.1.2 envinject join@1.0.0)
191
- set :jenkins_install_timeout, 60 * 5 # default: 5min
192
- set :jenkins_plugin_enable_update, false # dafault: false
193
- set :jenkins_plugin_enable_restart, false # default: false
285
+ Until [jenkins_api_client PR143](https://github.com/arangamani/jenkins_api_client/pull/143) merged,
286
+ put following code to your Gemfile:
194
287
 
195
- before 'deploy', 'jenkins:install_plugins'
288
+ ```ruby
289
+ # FIXME after https://github.com/arangamani/jenkins_api_client/pull/143 merged
290
+ gem 'jenkins_api_client', github: 'cynipe/jenkins_api_client', branch: 'fix-multibyte-configs'
196
291
  ```
197
292
 
293
+ ## TODO
294
+
295
+ * [ ] Reverse config support. something like `cap jenkins:reverse_job`
296
+ * [ ] CI cucumber tests on Wercker
297
+ * [ ] Capistrano v3 support
298
+ * [ ] Make examples triable on user's local
299
+ * [ ] Collect usage report using Google Analytics to see who uses this tool.
300
+
198
301
  ## Release Notes
199
302
 
303
+ ### 0.1.0
304
+ * **[INCOMPATIBLE CHANGE]** Remove plugin support
305
+ * **[INCOMPATIBLE CHANGE]** Change node configuration to use config.xml instead of json config
306
+ * Support erb template for config.xml(need to name the file xxx.xml.erb)
307
+
200
308
  ### 0.0.7
201
309
  * Fix disable_job is not working with recent version of Jenkins ([#9](https://github.com/cynipe/jenkins-capistrano/pull/9))
202
310
 
@@ -210,9 +318,14 @@ before 'deploy', 'jenkins:install_plugins'
210
318
  ## Contributing
211
319
 
212
320
  1. Fork it
213
- 2. Create your feature branch (`git checkout -b my-new-feature`)
214
- 3. Commit your changes (`git commit -am 'Added some feature'`)
215
- 4. Push to the branch (`git push origin my-new-feature`)
216
- 5. Create new Pull Request
321
+ 1. Create your feature branch (`git checkout -b my-new-feature`)
322
+ 1. Commit your changes (`git commit -am 'Added some feature'`)
323
+ 1. Run Integration tests as following:
324
+
325
+ $ vagrant up
326
+ $ bundle exec cucumber
327
+
328
+ 1. Push to the branch (`git push origin my-new-feature`)
329
+ 1. Create new Pull Request
217
330
 
218
331
  [![githalytics.com alpha](https://cruel-carlota.pagodabox.com/e76247570c952ad3205ca7d6d3f0f7b5 "githalytics.com")](http://githalytics.com/cynipe/jenkins-capistrano)