gnm-jenkins_cap 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+ gem "capistrano", ">= 2.9.0"
6
+ gem "json"
7
+ gem "term-ansicolor"
8
+
9
+ # Add dependencies to develop your gem here.
10
+ # Include everything needed to run rake, tests, features, etc.
11
+ group :development do
12
+ gem "shoulda", ">= 0"
13
+ gem "bundler", "~> 1.0.0"
14
+ gem "jeweler", "~> 1.6.4"
15
+ gem "rcov", ">= 0"
16
+ end
@@ -0,0 +1,39 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ capistrano (2.11.2)
5
+ highline
6
+ net-scp (>= 1.0.0)
7
+ net-sftp (>= 2.0.0)
8
+ net-ssh (>= 2.0.14)
9
+ net-ssh-gateway (>= 1.1.0)
10
+ git (1.2.5)
11
+ highline (1.6.11)
12
+ jeweler (1.6.4)
13
+ bundler (~> 1.0)
14
+ git (>= 1.2.5)
15
+ rake
16
+ json (1.6.5)
17
+ net-scp (1.0.4)
18
+ net-ssh (>= 1.99.1)
19
+ net-sftp (2.0.5)
20
+ net-ssh (>= 2.0.9)
21
+ net-ssh (2.3.0)
22
+ net-ssh-gateway (1.1.0)
23
+ net-ssh (>= 1.99.1)
24
+ rake (0.9.2.2)
25
+ rcov (0.9.8)
26
+ shoulda (2.11.3)
27
+ term-ansicolor (1.0.7)
28
+
29
+ PLATFORMS
30
+ ruby
31
+
32
+ DEPENDENCIES
33
+ bundler (~> 1.0.0)
34
+ capistrano (>= 2.9.0)
35
+ jeweler (~> 1.6.4)
36
+ json
37
+ rcov
38
+ shoulda
39
+ term-ansicolor
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Gorilla Nation Media
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,35 @@
1
+ = gnm-jenkins_cap
2
+
3
+ Adds Jenkins tasks to Capistrano.
4
+
5
+ == Installation
6
+
7
+ $ gem install gnm-jenkins_cap
8
+
9
+ Include in your Capfile
10
+ require 'rubygems'
11
+ require 'gnm-jenkins_cap'
12
+
13
+ == Usage
14
+
15
+ In your deploy.rb
16
+ set :jenkins_host, "http://jenkins.example.com"
17
+ set :jenkins_job_name, "mybuild"
18
+
19
+ before 'deploy', 'jenkins_cap:build_check' # check if the revision has been built by Jenkins successfully
20
+
21
+ == Contributing to gnm-jenkins_cap
22
+
23
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
24
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
25
+ * Fork the project
26
+ * Start a feature/bugfix branch
27
+ * Commit and push until you are happy with your contribution
28
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
29
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
30
+
31
+ == Copyright
32
+
33
+ Copyright (c) 2012 Gorilla Nation Media. See LICENSE.txt for
34
+ further details.
35
+
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "gnm-jenkins_cap"
18
+ gem.homepage = "https://github.com/GorillaNation/gnm-jenkins_cap"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{adds Jenkins tasks to Capistrano}
21
+ gem.description = %Q{add Jenkins tasks to Capistrano}
22
+ gem.email = "configurationmanagement@gorillanation.com"
23
+ gem.authors = ["Dru Ibarra"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+
35
+ require 'rcov/rcovtask'
36
+ Rcov::RcovTask.new do |test|
37
+ test.libs << 'test'
38
+ test.pattern = 'test/**/test_*.rb'
39
+ test.verbose = true
40
+ test.rcov_opts << '--exclude "gems/*"'
41
+ end
42
+
43
+ task :default => :test
44
+
45
+ require 'rake/rdoctask'
46
+ Rake::RDocTask.new do |rdoc|
47
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
+
49
+ rdoc.rdoc_dir = 'rdoc'
50
+ rdoc.title = "gnm-jenkins_cap #{version}"
51
+ rdoc.rdoc_files.include('README*')
52
+ rdoc.rdoc_files.include('lib/**/*.rb')
53
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.0
@@ -0,0 +1,69 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{gnm-jenkins_cap}
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = [%q{Dru Ibarra}]
12
+ s.date = %q{2012-03-20}
13
+ s.description = %q{add Jenkins tasks to Capistrano}
14
+ s.email = %q{configurationmanagement@gorillanation.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "Gemfile",
22
+ "Gemfile.lock",
23
+ "LICENSE.txt",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "gnm-jenkins_cap.gemspec",
28
+ "lib/gnm-jenkins_cap.rb",
29
+ "test/helper.rb",
30
+ "test/test_jenkins_cap.rb",
31
+ "test/test_settings.yml.template"
32
+ ]
33
+ s.homepage = %q{https://github.com/GorillaNation/gnm-jenkins_cap}
34
+ s.licenses = [%q{MIT}]
35
+ s.require_paths = [%q{lib}]
36
+ s.rubygems_version = %q{1.8.6}
37
+ s.summary = %q{adds Jenkins tasks to Capistrano}
38
+
39
+ if s.respond_to? :specification_version then
40
+ s.specification_version = 3
41
+
42
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
43
+ s.add_runtime_dependency(%q<capistrano>, [">= 2.9.0"])
44
+ s.add_runtime_dependency(%q<json>, [">= 0"])
45
+ s.add_runtime_dependency(%q<term-ansicolor>, [">= 0"])
46
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
47
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
48
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
49
+ s.add_development_dependency(%q<rcov>, [">= 0"])
50
+ else
51
+ s.add_dependency(%q<capistrano>, [">= 2.9.0"])
52
+ s.add_dependency(%q<json>, [">= 0"])
53
+ s.add_dependency(%q<term-ansicolor>, [">= 0"])
54
+ s.add_dependency(%q<shoulda>, [">= 0"])
55
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
56
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
57
+ s.add_dependency(%q<rcov>, [">= 0"])
58
+ end
59
+ else
60
+ s.add_dependency(%q<capistrano>, [">= 2.9.0"])
61
+ s.add_dependency(%q<json>, [">= 0"])
62
+ s.add_dependency(%q<term-ansicolor>, [">= 0"])
63
+ s.add_dependency(%q<shoulda>, [">= 0"])
64
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
65
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
66
+ s.add_dependency(%q<rcov>, [">= 0"])
67
+ end
68
+ end
69
+
@@ -0,0 +1,81 @@
1
+ require 'json'
2
+ require 'term/ansicolor'
3
+ require 'capistrano'
4
+
5
+ class String
6
+ include Term::ANSIColor
7
+ end
8
+
9
+ module Capistrano
10
+ module JenkinsCap
11
+
12
+ def json_request(url)
13
+ response = `wget -q -O - #{url}`
14
+ JSON.load(response)
15
+ end
16
+
17
+ def get_builds()
18
+ json_results = json_request("#{jenkins_host}/job/#{jenkins_job_name}/api/json")
19
+ builds = []
20
+ json_results['builds'].each{|b| builds << b['number']}
21
+ builds
22
+ rescue NoMethodError => e
23
+ puts "WARNING: #{e}".yellow
24
+ end
25
+
26
+ def get_revision_from_build(build_number)
27
+ json_results = json_request("#{jenkins_host}/job/#{jenkins_job_name}/#{build_number}/api/json")
28
+ return nil if json_results['changeSet']['revisions'].nil?
29
+ revisions = []
30
+ json_results['changeSet']['revisions'].each{|r| revisions << r['revision']}
31
+ revisions.sort.last
32
+ rescue NoMethodError => e
33
+ puts "WARNING: #{e}".yellow
34
+ end
35
+
36
+ def build_has_revision?(build_number)
37
+ build_revision = get_revision_from_build(build_number)
38
+ #puts build_revision
39
+ build_revision.to_i == revision.to_i
40
+ end
41
+
42
+ def build_passed?(build_number)
43
+ json_results = json_request("#{jenkins_host}/job/#{jenkins_job_name}/#{build_number}/api/json")
44
+ json_results['result'] == "SUCCESS"
45
+ rescue NoMethodError => e
46
+ puts "WARNING: #{e}".yellow
47
+ end
48
+
49
+ def revision_passed?()
50
+ builds_list = get_builds()
51
+ return false if builds_list.nil?
52
+
53
+ builds_list.each do |build_number|
54
+ if build_has_revision?(build_number) # check if build has the revision we care about
55
+ return build_passed?(build_number)
56
+ end
57
+ end
58
+ false
59
+ end
60
+
61
+ def self.load_into(configuration)
62
+ configuration.load do
63
+ namespace :jenkins_cap do
64
+ desc "Check if this deployment as a good Jenkins build"
65
+ task "build_check" do
66
+ abort "\n\n\nThis revision #{revision} has not been built by Jenkins successfully!\n\n\n".red unless jenkins.revision_passed?
67
+ puts "\n Revision #{revision} has passed Jenkins tests.\n".green
68
+ end # end of task
69
+ end # end of namespace
70
+ end # end of configuration.load
71
+ end # end of def self.load_into
72
+
73
+ end # end of JenkinsCap module
74
+
75
+ Capistrano.plugin :jenkins, JenkinsCap
76
+
77
+ end # end of Capistrano module
78
+
79
+ if Capistrano::Configuration.instance
80
+ Capistrano::JenkinsCap.load_into(Capistrano::Configuration.instance)
81
+ end
@@ -0,0 +1,19 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'gnm-jenkins_cap'
16
+
17
+
18
+ class Test::Unit::TestCase
19
+ end
@@ -0,0 +1,51 @@
1
+ require 'helper'
2
+
3
+ TEST_SETTINGS = YAML.load_file(File.join(File.dirname(__FILE__), "test_settings.yml"))
4
+
5
+ class TestJenkinsCap < Test::Unit::TestCase
6
+ def setup
7
+ @config = Capistrano::Configuration.new
8
+ Capistrano::JenkinsCap.load_into(@config)
9
+ @config.role :app, TEST_SETTINGS["app"]
10
+ @config.set :deploy_to, TEST_SETTINGS["deploy_to"]
11
+ @config.set :jenkins_host, TEST_SETTINGS["jenkins_host"]
12
+ @config.set :jenkins_job_name, TEST_SETTINGS["jenkins_job_name"]
13
+ @config.set :revision, TEST_SETTINGS["revision"]
14
+ end
15
+
16
+ # Unit tests for helper functions
17
+ #
18
+ should "get a successful JSON response" do
19
+ assert @config.jenkins.json_request("#{@config.jenkins_host}/api/json")
20
+ end
21
+
22
+ should "get an Array of build numbers" do
23
+ assert_kind_of Array, @config.jenkins.get_builds
24
+ end
25
+
26
+ should "get a revision number (or nil) without error" do
27
+ # no assertion here because can't be sure what we'll get from Jenkins
28
+ @config.jenkins.get_revision_from_build(TEST_SETTINGS["build_number"])
29
+ end
30
+
31
+ should "check if a build contains the revision number about to be deployed" do
32
+ # no assertion here because can't be sure what we'll get from Jenkins
33
+ @config.jenkins.build_has_revision?(TEST_SETTINGS["build_number"])
34
+ end
35
+
36
+ should "check if a build passed" do
37
+ # no assertion here because can't be sure what we'll get from Jenkins
38
+ @config.jenkins.build_passed?(TEST_SETTINGS["build_number"])
39
+ end
40
+
41
+ should "check if a revision passed" do
42
+ # no assertion here because can't be sure what we'll get from Jenkins
43
+ @config.jenkins.revision_passed?
44
+ end
45
+
46
+ # Unit tests for Capistrano tasks
47
+ should "run build_check task" do
48
+ # need a revision that will pass, otherwise the tests will abort
49
+ #@config.jenkins_cap.build_check
50
+ end
51
+ end
@@ -0,0 +1,5 @@
1
+ app: localhost
2
+ deploy_to: "/tmp"
3
+ jenkins_host: "http://localhost"
4
+ jenkins_job_name: "test_job"
5
+ revision: "1"
metadata ADDED
@@ -0,0 +1,180 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gnm-jenkins_cap
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
+ platform: ruby
12
+ authors:
13
+ - Dru Ibarra
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-03-20 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ type: :runtime
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ hash: 43
28
+ segments:
29
+ - 2
30
+ - 9
31
+ - 0
32
+ version: 2.9.0
33
+ version_requirements: *id001
34
+ name: capistrano
35
+ prerelease: false
36
+ - !ruby/object:Gem::Dependency
37
+ type: :runtime
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ version_requirements: *id002
48
+ name: json
49
+ prerelease: false
50
+ - !ruby/object:Gem::Dependency
51
+ type: :runtime
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ version_requirements: *id003
62
+ name: term-ansicolor
63
+ prerelease: false
64
+ - !ruby/object:Gem::Dependency
65
+ type: :development
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ version_requirements: *id004
76
+ name: shoulda
77
+ prerelease: false
78
+ - !ruby/object:Gem::Dependency
79
+ type: :development
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ hash: 23
86
+ segments:
87
+ - 1
88
+ - 0
89
+ - 0
90
+ version: 1.0.0
91
+ version_requirements: *id005
92
+ name: bundler
93
+ prerelease: false
94
+ - !ruby/object:Gem::Dependency
95
+ type: :development
96
+ requirement: &id006 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ hash: 7
102
+ segments:
103
+ - 1
104
+ - 6
105
+ - 4
106
+ version: 1.6.4
107
+ version_requirements: *id006
108
+ name: jeweler
109
+ prerelease: false
110
+ - !ruby/object:Gem::Dependency
111
+ type: :development
112
+ requirement: &id007 !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ hash: 3
118
+ segments:
119
+ - 0
120
+ version: "0"
121
+ version_requirements: *id007
122
+ name: rcov
123
+ prerelease: false
124
+ description: add Jenkins tasks to Capistrano
125
+ email: configurationmanagement@gorillanation.com
126
+ executables: []
127
+
128
+ extensions: []
129
+
130
+ extra_rdoc_files:
131
+ - LICENSE.txt
132
+ - README.rdoc
133
+ files:
134
+ - .document
135
+ - Gemfile
136
+ - Gemfile.lock
137
+ - LICENSE.txt
138
+ - README.rdoc
139
+ - Rakefile
140
+ - VERSION
141
+ - gnm-jenkins_cap.gemspec
142
+ - lib/gnm-jenkins_cap.rb
143
+ - test/helper.rb
144
+ - test/test_jenkins_cap.rb
145
+ - test/test_settings.yml.template
146
+ homepage: https://github.com/GorillaNation/gnm-jenkins_cap
147
+ licenses:
148
+ - MIT
149
+ post_install_message:
150
+ rdoc_options: []
151
+
152
+ require_paths:
153
+ - lib
154
+ required_ruby_version: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ hash: 3
160
+ segments:
161
+ - 0
162
+ version: "0"
163
+ required_rubygems_version: !ruby/object:Gem::Requirement
164
+ none: false
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ hash: 3
169
+ segments:
170
+ - 0
171
+ version: "0"
172
+ requirements: []
173
+
174
+ rubyforge_project:
175
+ rubygems_version: 1.8.6
176
+ signing_key:
177
+ specification_version: 3
178
+ summary: adds Jenkins tasks to Capistrano
179
+ test_files: []
180
+