jenkins_tracker 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .rvmrc
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ spec/fixtures/live
17
+ test/tmp
18
+ test/version_tmp
19
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in jenkins_tracker.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Prashant Nadarajan, Bitium, Inc.
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,48 @@
1
+ # JenkinsTracker
2
+
3
+ `jenkins_tracker` is a command line utility packaged as a [RubyGem](https://rubygems.org) that integrates [Jenkins](http://jenkins-ci.org/) build information with
4
+ the relevant [Pivotal Tracker](https://www.pivotaltracker.com) stories within a project.
5
+
6
+ It's ideally run as a Post Build Action in Jenkins.
7
+
8
+ This utility makes some very specific assumptions about your Jenkins environment:-
9
+
10
+ * Git as your SCM via the [Jenkins Git Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin).
11
+
12
+ * The Jenkins build changelog file is available at `$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_NUMBER/changelog.xml`.
13
+
14
+ * Ability to execute Ruby scripts.
15
+
16
+
17
+ The following are required for your Pivotal Tracker project:-
18
+
19
+ * [API access enabled](https://www.pivotaltracker.com/help/api) (enabled by default).
20
+
21
+
22
+ ## Installation
23
+
24
+ Add this line to your application's Gemfile:
25
+
26
+ gem 'jenkins_tracker'
27
+
28
+ And then execute:
29
+
30
+ $ bundle
31
+
32
+ Or install it yourself as:
33
+
34
+ $ gem install jenkins_tracker
35
+
36
+
37
+ ## Usage
38
+
39
+ TODO: Write usage instructions here
40
+
41
+
42
+ ## Contributing
43
+
44
+ 1. Fork it
45
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
46
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
47
+ 4. Push to the branch (`git push origin my-new-feature`)
48
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ root = File.expand_path('../../lib', __FILE__)
4
+ $:.unshift(root) unless $:.include?(root)
5
+
6
+ require 'jenkins_tracker'
7
+ require 'jenkins_tracker/cli'
8
+
9
+ JenkinsTracker::Cli.start
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'jenkins_tracker/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "jenkins_tracker"
8
+ gem.version = JenkinsTracker::VERSION
9
+ gem.authors = ["Prashant Nadarajan"]
10
+ gem.email = ["prashant.nadarajan@gmail.com"]
11
+ gem.description = %q{Integrate Jenkins build info with Pivotal Tracker project stories }
12
+ gem.summary = %q{Integrate Jenkins build info as notes to the relevant Pivotal Tracker stories based on post commit message syntax}
13
+ gem.homepage = "https://github.com/prashantrajan/jenkins_tracker"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = %w(jenkins_tracker)
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_runtime_dependency 'rest-client', '~> 1.6'
21
+ gem.add_runtime_dependency 'thor', '~> 0.15'
22
+
23
+ gem.add_development_dependency 'rake', '>= 0.8'
24
+ gem.add_development_dependency 'rspec', '~> 2.12'
25
+ end
@@ -0,0 +1,9 @@
1
+ #require 'json'
2
+ require 'ostruct'
3
+
4
+ require 'rest-client'
5
+
6
+ require 'jenkins_tracker/version'
7
+ require 'jenkins_tracker/util'
8
+ require 'jenkins_tracker/tracker_client'
9
+ require 'jenkins_tracker/base'
@@ -0,0 +1,22 @@
1
+ module JenkinsTracker
2
+ class Base
3
+ include Util
4
+
5
+ attr_reader :changelog, :tracker_client, :job_name, :build_url
6
+
7
+ def initialize(options = {})
8
+ @changelog = File.read(options[:changelog_file])
9
+ @tracker_client = TrackerClient.new(:token => options[:tracker_token])
10
+ @job_name = options[:job_name]
11
+ @build_url = options[:build_url]
12
+ end
13
+
14
+ def integrate_job_with_tracker(project_id)
15
+ parse_changelog(changelog).each do |change|
16
+ note = "*#{change.commit_message}* integrated in *#{job_name}* (#{build_url})"
17
+ tracker_client.add_note_to_story(project_id, change.story_id, note)
18
+ end
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ require 'thor'
2
+
3
+ module JenkinsTracker
4
+ class Cli < Thor
5
+
6
+ desc 'integrate', 'Integrate Jenkins build with Pivotal Tracker project stories'
7
+ method_option 'tracker-token', :required => true, :desc => 'Pivotal Tracker API Token'
8
+ method_option 'tracker-project-id', :required => true, :type => :numeric, :desc => 'Pivotal Tracker Project ID'
9
+ method_option 'job-name', :default => ENV['JOB_NAME'], :desc => 'Jenkins job name'
10
+ method_option 'build-url', :default => ENV['BUILD_URL'], :desc => 'Jenkins build URL'
11
+ method_option 'changelog-file', :desc => 'Absolute path to changelog file.', :default => "#{ENV['JENKINS_HOME']}/jobs/#{ENV['JOB_NAME']}/builds/#{ENV['BUILD_NUMBER']}/changelog.xml"
12
+ def integrate
13
+ job_name = options['job-name']
14
+ tracker_project_id = options['tracker-project-id']
15
+
16
+ begin
17
+ JenkinsTracker::Base.new(
18
+ :changelog_file => options['changelog-file'],
19
+ :tracker_token => options['tracker-token'],
20
+ :job_name => job_name,
21
+ :build_url => options['build-url']
22
+ ).integrate_job_with_tracker(tracker_project_id)
23
+
24
+ say "Successfully integrated Jenkins Job (#{job_name}) with Pivotal Tracker Project (#{tracker_project_id})", :green
25
+ rescue
26
+ # do nothing
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,43 @@
1
+ module JenkinsTracker
2
+ class TrackerClient
3
+
4
+ attr_writer :use_ssl
5
+ attr_reader :token
6
+
7
+ def initialize(options = {})
8
+ @token = options[:token]
9
+ end
10
+
11
+ def connection(options = {})
12
+ @connection ||= RestClient::Resource.new(api_url, :headers => { 'X-TrackerToken' => token, 'Content-Type' => 'application/xml' })
13
+ end
14
+
15
+ def add_note_to_story(project_id, story_id, note)
16
+ connection["projects/#{project_id}/stories/#{story_id}/notes"].post("<note><text>#{note}</text></note>")
17
+ end
18
+
19
+
20
+ private
21
+
22
+ def tracker_host
23
+ 'www.pivotaltracker.com'
24
+ end
25
+
26
+ def api_path
27
+ '/services/v3'
28
+ end
29
+
30
+ def api_url
31
+ "#{protocol}://#{tracker_host}#{api_path}"
32
+ end
33
+
34
+ def use_ssl
35
+ @use_ssl || false
36
+ end
37
+
38
+ def protocol
39
+ use_ssl ? 'https' : 'http'
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,32 @@
1
+ module JenkinsTracker
2
+ module Util
3
+
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ end
10
+
11
+ #def parse_json(str, options = {})
12
+ # JSON.parse(str, options)
13
+ #end
14
+
15
+ def parse_changelog(str)
16
+ results = []
17
+
18
+ str.scan(/(\[[#a-zA-Z0-9\s]+\])(.*)/) do |ids, msg|
19
+ parse_tracker_story_ids(ids).each do |id|
20
+ results << OpenStruct.new(:story_id => id, :commit_message => "#{ids}#{msg}".strip)
21
+ end
22
+ end
23
+
24
+ results
25
+ end
26
+
27
+ def parse_tracker_story_ids(str)
28
+ str.strip.gsub(/[\[#\]]/, '').split(' ').map(&:to_i).reject { |i| i == 0 }
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ module JenkinsTracker
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,20 @@
1
+ Changes in branch origin/master, between c0d9a605c020d0ccaac2ef7f4a52607f0b1032ff and 05b96f9a60360525b5a17721e0ed107e53f42ede
2
+ commit 05b96f9a60360525b5a17721e0ed107e53f42ede
3
+ tree 90fae1497ff2e0eb19992993ac2a335561ef9e21
4
+ parent b1d0cda2f3766e5285cbe6f8c788d5d3c2d0aaf3
5
+ author Prashant Nadarajan <mrp@example.com> 1360758891 +0800
6
+ committer Prashant Nadarajan <mrp@example.com> 1360758902 +0800
7
+
8
+ [#123 #456] added more test
9
+
10
+ :100644 100644 7da3210b8da221718054af45ca5384a1b3c5a654 e57a7a9b044142080875d0b5b6548ea62f666143 M README.md
11
+
12
+ commit b1d0cda2f3766e5285cbe6f8c788d5d3c2d0aaf3
13
+ tree 5364d5d2ec4e082218ef7a1d779ac35a89647f3b
14
+ parent c0d9a605c020d0ccaac2ef7f4a52607f0b1032ff
15
+ author Prashant Nadarajan <mrp@example.com> 1360758738 +0800
16
+ committer Prashant Nadarajan <mrp@example.com> 1360758738 +0800
17
+
18
+ [Fixes #456 #789] added test 1 to readme
19
+
20
+ :100644 100644 3979ab174391acf45520c09801a8b6919fd9df95 7da3210b8da221718054af45ca5384a1b3c5a654 M README.md
@@ -0,0 +1,105 @@
1
+ {
2
+ "actions": [
3
+ {
4
+ "causes": [
5
+ {
6
+ "shortDescription": "Started by user Prashant Nadarajan",
7
+ "userId": "prashantrajan",
8
+ "userName": "Prashant Nadarajan"
9
+ }
10
+ ]
11
+ },
12
+ {
13
+ "buildsByBranchName": {
14
+ "origin/master": {
15
+ "buildNumber": 2,
16
+ "buildResult": null,
17
+ "revision": {
18
+ "SHA1": "05b96f9a60360525b5a17721e0ed107e53f42ede",
19
+ "branch": [
20
+ {
21
+ "SHA1": "05b96f9a60360525b5a17721e0ed107e53f42ede",
22
+ "name": "origin/master"
23
+ }
24
+ ]
25
+ }
26
+ }
27
+ },
28
+ "lastBuiltRevision": {
29
+ "SHA1": "05b96f9a60360525b5a17721e0ed107e53f42ede",
30
+ "branch": [
31
+ {
32
+ "SHA1": "05b96f9a60360525b5a17721e0ed107e53f42ede",
33
+ "name": "origin/master"
34
+ }
35
+ ]
36
+ },
37
+ "remoteUrls": ["ssh://git@github.com/prashantrajan/zz_test.git"],
38
+ "scmName": ""
39
+ },
40
+ {},
41
+ {}
42
+ ],
43
+ "artifacts": [],
44
+ "building": false,
45
+ "description": null,
46
+ "duration": 1355,
47
+ "estimatedDuration": 1618,
48
+ "executor": null,
49
+ "fullDisplayName": "zz_test #2",
50
+ "id": "2013-02-13_04-37-49",
51
+ "keepLog": false, "number": 2,
52
+ "result": "SUCCESS",
53
+ "timestamp": 1360759069600,
54
+ "url": "http://jenkins.example.com/job/zz_test/2/",
55
+ "builtOn": "",
56
+ "changeSet": {
57
+ "items": [
58
+ {
59
+ "affectedPaths": ["README.md"],
60
+ "commitId": "b1d0cda2f3766e5285cbe6f8c788d5d3c2d0aaf3",
61
+ "timestamp": 1360758738000,
62
+ "author": {
63
+ "absoluteUrl": "http://jenkins.example.com/user/prashantrajan",
64
+ "fullName": "Prashant Nadarajan"
65
+ },
66
+ "comment": "[#44375023] added test 1 to readme\n",
67
+ "date": "2013-02-13 04:32:18 +0800",
68
+ "id": "b1d0cda2f3766e5285cbe6f8c788d5d3c2d0aaf3",
69
+ "msg": "[#44375023] added test 1 to readme",
70
+ "paths": [
71
+ {
72
+ "editType": "edit",
73
+ "file": "README.md"
74
+ }
75
+ ]
76
+ },
77
+ {
78
+ "affectedPaths": ["README.md"],
79
+ "commitId": "05b96f9a60360525b5a17721e0ed107e53f42ede",
80
+ "timestamp": 1360758891000,
81
+ "author": {
82
+ "absoluteUrl": "http://jenkins.example.com/user/prashantrajan",
83
+ "fullName": "Prashant Nadarajan"
84
+ },
85
+ "comment": "[#44375023 #44375221] added more test\n",
86
+ "date": "2013-02-13 04:34:51 +0800",
87
+ "id": "05b96f9a60360525b5a17721e0ed107e53f42ede",
88
+ "msg": "[#44375023 #44375221] added more test",
89
+ "paths": [
90
+ {
91
+ "editType": "edit",
92
+ "file": "README.md"
93
+ }
94
+ ]
95
+ }
96
+ ],
97
+ "kind": null
98
+ },
99
+ "culprits": [
100
+ {
101
+ "absoluteUrl": "http://jenkins.example.com/user/prashantrajan",
102
+ "fullName": "Prashant Nadarajan"
103
+ }
104
+ ]
105
+ }
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe JenkinsTracker::Base do
4
+
5
+ describe '#initialize' do
6
+ it 'does basic set up' do
7
+ obj = described_class.new(
8
+ :changelog_file => fixture_file_path('git_changelog.txt'),
9
+ :tracker_token => 'xxx',
10
+ :job_name => 'foo_job',
11
+ :build_url => 'http://jenkins.bitium/com/foo_job/3'
12
+ )
13
+ expect(obj.changelog).to eq( File.read(fixture_file_path('git_changelog.txt')) )
14
+ expect(obj.tracker_client.token).to eq('xxx')
15
+ expect(obj.job_name).to eq('foo_job')
16
+ expect(obj.build_url).to eq('http://jenkins.bitium/com/foo_job/3')
17
+ end
18
+ end
19
+
20
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe JenkinsTracker::TrackerClient do
4
+
5
+ describe '#connection' do
6
+ it 'returns an instance of RestClient::Resource' do
7
+ tracker_client = described_class.new(:token => 'xxx')
8
+ expect(tracker_client.connection).to be_an_instance_of(RestClient::Resource)
9
+ expect(tracker_client.connection.to_s).to eq('http://www.pivotaltracker.com/services/v3')
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ class UtilModuleTester
5
+ include JenkinsTracker::Util
6
+ end
7
+
8
+
9
+ describe JenkinsTracker::Util do
10
+ let!(:class_instance) { UtilModuleTester.new }
11
+
12
+ #describe '#parse_json' do
13
+ # let(:json_str) { load_fixture_as_str('job.json') }
14
+ #
15
+ # it 'returns a Ruby data structure representation of the JSON string' do
16
+ # results = class_instance.parse_json(json_str)
17
+ # expect(results['changeSet']['items'].size).to eq(2)
18
+ # end
19
+ #
20
+ #end
21
+
22
+ describe '#parse_changelog' do
23
+ let(:git_changelog) { load_fixture_as_str('git_changelog.txt') }
24
+
25
+ it 'returns an array of struct objects' do
26
+ results = class_instance.parse_changelog(git_changelog)
27
+ expect(results.first.story_id).to eq(123)
28
+ expect(results.first.commit_message).to eq('[#123 #456] added more test')
29
+
30
+ expect(results.last.story_id).to eq(789)
31
+ expect(results.last.commit_message).to eq('[Fixes #456 #789] added test 1 to readme')
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,19 @@
1
+ require 'jenkins_tracker'
2
+
3
+ PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '../'))
4
+ Dir[ File.join(PROJECT_ROOT, 'spec', 'support/**/*.rb') ].each { |f| require f }
5
+
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+
18
+ config.include FixtureLoader
19
+ end
@@ -0,0 +1,11 @@
1
+ module FixtureLoader
2
+
3
+ def load_fixture_as_str(filename)
4
+ File.read(fixture_file_path(filename))
5
+ end
6
+
7
+ def fixture_file_path(filename)
8
+ File.join(PROJECT_ROOT, 'spec', 'fixtures', filename)
9
+ end
10
+
11
+ end
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jenkins_tracker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Prashant Nadarajan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rest-client
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.6'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.6'
30
+ - !ruby/object:Gem::Dependency
31
+ name: thor
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '0.15'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '0.15'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0.8'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0.8'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '2.12'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '2.12'
78
+ description: ! 'Integrate Jenkins build info with Pivotal Tracker project stories '
79
+ email:
80
+ - prashant.nadarajan@gmail.com
81
+ executables:
82
+ - jenkins_tracker
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - .gitignore
87
+ - .rspec
88
+ - Gemfile
89
+ - MIT-LICENSE
90
+ - README.md
91
+ - Rakefile
92
+ - bin/jenkins_tracker
93
+ - jenkins_tracker.gemspec
94
+ - lib/jenkins_tracker.rb
95
+ - lib/jenkins_tracker/base.rb
96
+ - lib/jenkins_tracker/cli.rb
97
+ - lib/jenkins_tracker/tracker_client.rb
98
+ - lib/jenkins_tracker/util.rb
99
+ - lib/jenkins_tracker/version.rb
100
+ - spec/fixtures/git_changelog.txt
101
+ - spec/fixtures/job.json
102
+ - spec/jenkins_tracker/base_spec.rb
103
+ - spec/jenkins_tracker/tracker_client_spec.rb
104
+ - spec/jenkins_tracker/util_spec.rb
105
+ - spec/spec_helper.rb
106
+ - spec/support/fixture_loader.rb
107
+ homepage: https://github.com/prashantrajan/jenkins_tracker
108
+ licenses: []
109
+ post_install_message:
110
+ rdoc_options: []
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ segments:
120
+ - 0
121
+ hash: 1872917664060546366
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ segments:
129
+ - 0
130
+ hash: 1872917664060546366
131
+ requirements: []
132
+ rubyforge_project:
133
+ rubygems_version: 1.8.24
134
+ signing_key:
135
+ specification_version: 3
136
+ summary: Integrate Jenkins build info as notes to the relevant Pivotal Tracker stories
137
+ based on post commit message syntax
138
+ test_files:
139
+ - spec/fixtures/git_changelog.txt
140
+ - spec/fixtures/job.json
141
+ - spec/jenkins_tracker/base_spec.rb
142
+ - spec/jenkins_tracker/tracker_client_spec.rb
143
+ - spec/jenkins_tracker/util_spec.rb
144
+ - spec/spec_helper.rb
145
+ - spec/support/fixture_loader.rb