jenkins_tracker 0.3.0 → 0.3.1
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.
- data/README.md +25 -16
- data/lib/jenkins_tracker.rb +1 -1
- data/lib/jenkins_tracker/base.rb +21 -2
- data/lib/jenkins_tracker/changelog_item.rb +24 -0
- data/lib/jenkins_tracker/tracker_client.rb +1 -1
- data/lib/jenkins_tracker/util.rb +0 -16
- data/lib/jenkins_tracker/version.rb +1 -1
- data/spec/fixtures/git_changelog_with_duplicates.txt +39 -0
- data/spec/jenkins_tracker/base_spec.rb +28 -0
- data/spec/jenkins_tracker/changelog_item_spec.rb +71 -0
- data/spec/jenkins_tracker/util_spec.rb +1 -14
- metadata +9 -4
data/README.md
CHANGED
@@ -3,24 +3,33 @@
|
|
3
3
|
[](https://travis-ci.org/prashantrajan/jenkins_tracker)
|
4
4
|
[](http://badge.fury.io/rb/jenkins_tracker)
|
5
5
|
|
6
|
-
`jenkins_tracker` is a command line utility packaged as a [RubyGem](https://rubygems.org/gems/jenkins_tracker) that
|
7
|
-
|
6
|
+
`jenkins_tracker` is a command line utility packaged as a [RubyGem](https://rubygems.org/gems/jenkins_tracker) that
|
7
|
+
integrates [Jenkins CI](http://jenkins-ci.org/) build information with [Pivotal Tracker](https://www.pivotaltracker.com) stories within a project.
|
8
|
+
The underlying library is also used in the native [Jenkins Tracker Plugin](https://github.com/prashantrajan/jenkins-tracker-plugin).
|
8
9
|
|
9
|
-
This
|
10
|
+
This is an example of a successful build integration:
|
11
|
+
|
12
|
+

|
13
|
+
|
14
|
+
|
15
|
+
## Requirements
|
16
|
+
|
17
|
+
### Jenkins
|
10
18
|
|
11
19
|
* Git as your SCM via the [Jenkins Git Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin).
|
12
20
|
|
13
|
-
* The
|
21
|
+
* The build changelog file is available at `$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_NUMBER/changelog.xml`.
|
14
22
|
The changelog contents look like this [example](https://github.com/prashantrajan/jenkins_tracker/blob/master/spec/fixtures/git_changelog.txt).
|
15
23
|
|
16
|
-
*
|
24
|
+
* `Ruby` is available in the environment.
|
17
25
|
|
18
26
|
* Environment variables exists for `$JENKINS_HOME`, `$JOB_NAME`, `$BUILD_NUMBER` & `$BUILD_URL`.
|
19
27
|
|
28
|
+
### Pivotal Tracker
|
20
29
|
|
21
|
-
|
30
|
+
* You have created an [API Token](https://www.pivotaltracker.com/profile).
|
22
31
|
|
23
|
-
* [API access enabled](https://www.pivotaltracker.com/help/api) (enabled by default).
|
32
|
+
* Project has [API access enabled](https://www.pivotaltracker.com/help/api) (it's enabled by default).
|
24
33
|
|
25
34
|
|
26
35
|
## Installation
|
@@ -40,18 +49,18 @@ Or install it yourself as:
|
|
40
49
|
|
41
50
|
## Usage
|
42
51
|
|
43
|
-
|
44
|
-
|
45
|
-
$ bundle exec jenkins_tracker integrate --tracker-token ABC123456 --tracker-project-id 123456
|
46
|
-
# => Successfully integrated Jenkins Job ($JOB_NAME) with Pivotal Tracker Project (123456)
|
52
|
+
### As a Post-build Action script
|
47
53
|
|
48
|
-
|
54
|
+
Requires the [Post build task plugin](http://wiki.hudson-ci.org/display/HUDSON/Post+build+task):
|
49
55
|
|
50
|
-
|
56
|
+
```
|
57
|
+
# Assuming environment variables for $JENKINS_HOME, $JOB_NAME, $BUILD_NUMBER & $BUILD_URL exists
|
51
58
|
|
52
|
-
|
53
|
-
|
54
|
-
|
59
|
+
$ bundle exec jenkins_tracker integrate --tracker-token ABC123456 --tracker-project-id 123456
|
60
|
+
# => Successfully integrated Jenkins Job $JOB_NAME with Pivotal Tracker Project #123456
|
61
|
+
```
|
62
|
+
|
63
|
+

|
55
64
|
|
56
65
|
|
57
66
|
## Contributing
|
data/lib/jenkins_tracker.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
#require 'json'
|
2
|
-
require 'ostruct'
|
3
2
|
|
4
3
|
require 'rest-client'
|
5
4
|
|
@@ -7,4 +6,5 @@ require 'jenkins_tracker/version'
|
|
7
6
|
require 'jenkins_tracker/exceptions'
|
8
7
|
require 'jenkins_tracker/util'
|
9
8
|
require 'jenkins_tracker/tracker_client'
|
9
|
+
require 'jenkins_tracker/changelog_item'
|
10
10
|
require 'jenkins_tracker/base'
|
data/lib/jenkins_tracker/base.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module JenkinsTracker
|
2
2
|
class Base
|
3
|
-
include Util
|
3
|
+
#include Util
|
4
4
|
|
5
5
|
attr_reader :changelog, :tracker_client, :job_name, :build_url
|
6
6
|
|
@@ -17,11 +17,30 @@ module JenkinsTracker
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def integrate_job_with_tracker(project_id)
|
20
|
-
parse_changelog
|
20
|
+
parse_changelog.each do |change|
|
21
21
|
note = "*#{change.commit_message}* integrated in *#{job_name}* (#{build_url})"
|
22
22
|
tracker_client.add_note_to_story(project_id, change.story_id, note)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
def parse_changelog
|
27
|
+
results = []
|
28
|
+
|
29
|
+
changelog.scan(/(\[[#a-zA-Z0-9\s]+\])(.*)/) do |ids, msg|
|
30
|
+
parse_tracker_story_ids(ids).each do |id|
|
31
|
+
results << ChangelogItem.new(:story_id => id, :commit_message => "#{ids}#{msg}".strip)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
results.uniq
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def parse_tracker_story_ids(str)
|
42
|
+
str.strip.gsub(/[\[#\]]/, '').split(' ').map(&:to_i).reject { |i| i == 0 }
|
43
|
+
end
|
44
|
+
|
26
45
|
end
|
27
46
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module JenkinsTracker
|
2
|
+
class ChangelogItem
|
3
|
+
|
4
|
+
attr_accessor :story_id, :commit_message
|
5
|
+
|
6
|
+
def initialize(options = {})
|
7
|
+
@story_id = options[:story_id]
|
8
|
+
@commit_message = options[:commit_message]
|
9
|
+
end
|
10
|
+
|
11
|
+
def ==(other)
|
12
|
+
self.story_id == other.story_id && self.commit_message == other.commit_message
|
13
|
+
end
|
14
|
+
|
15
|
+
def eql?(other)
|
16
|
+
(self.class == other.class) && self == other
|
17
|
+
end
|
18
|
+
|
19
|
+
def hash
|
20
|
+
[story_id, commit_message].hash
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -17,7 +17,7 @@ module JenkinsTracker
|
|
17
17
|
connection["projects/#{project_id}/stories/#{story_id}/notes"].post("<note><text>#{note}</text></note>")
|
18
18
|
rescue => e
|
19
19
|
# if the post fails for whatever reason (e.g. invalid story id etc), just ignore it
|
20
|
-
puts ["An error occurred while trying add note to Story ##{story_id} in Project ##{project_id} ", e.message, e.backtrace] * "\n"
|
20
|
+
#puts ["An error occurred while trying add note to Story ##{story_id} in Project ##{project_id} ", e.message, e.backtrace] * "\n"
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
data/lib/jenkins_tracker/util.rb
CHANGED
@@ -12,21 +12,5 @@ module JenkinsTracker
|
|
12
12
|
# JSON.parse(str, options)
|
13
13
|
#end
|
14
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
15
|
end
|
32
16
|
end
|
@@ -0,0 +1,39 @@
|
|
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
|
21
|
+
commit 05b96f9a60360525b5a17721e0ed107e53f42ede
|
22
|
+
tree 90fae1497ff2e0eb19992993ac2a335561ef9e21
|
23
|
+
parent b1d0cda2f3766e5285cbe6f8c788d5d3c2d0aaf3
|
24
|
+
author Prashant Nadarajan <mrp@example.com> 1360758891 +0800
|
25
|
+
committer Prashant Nadarajan <mrp@example.com> 1360758902 +0800
|
26
|
+
|
27
|
+
[#123 #456] added more test
|
28
|
+
|
29
|
+
:100644 100644 7da3210b8da221718054af45ca5384a1b3c5a654 e57a7a9b044142080875d0b5b6548ea62f666143 M README.md
|
30
|
+
|
31
|
+
commit b1d0cda2f3766e5285cbe6f8c788d5d3c2d0aaf3
|
32
|
+
tree 5364d5d2ec4e082218ef7a1d779ac35a89647f3b
|
33
|
+
parent c0d9a605c020d0ccaac2ef7f4a52607f0b1032ff
|
34
|
+
author Prashant Nadarajan <mrp@example.com> 1360758738 +0800
|
35
|
+
committer Prashant Nadarajan <mrp@example.com> 1360758738 +0800
|
36
|
+
|
37
|
+
[Fixes #456 #789] added test 1 to readme
|
38
|
+
|
39
|
+
:100644 100644 3979ab174391acf45520c09801a8b6919fd9df95 7da3210b8da221718054af45ca5384a1b3c5a654 M README.md
|
@@ -35,4 +35,32 @@ describe JenkinsTracker::Base do
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
describe '#parse_changelog' do
|
39
|
+
it 'returns an array of ChangelogItems' do
|
40
|
+
changelog_file = fixture_file_path('git_changelog.txt')
|
41
|
+
|
42
|
+
results = described_class.new(:changelog_file => changelog_file).parse_changelog
|
43
|
+
expect(results.size).to eq(4)
|
44
|
+
|
45
|
+
expect(results.first.story_id).to eq(123)
|
46
|
+
expect(results.first.commit_message).to eq('[#123 #456] added more test')
|
47
|
+
|
48
|
+
expect(results.last.story_id).to eq(789)
|
49
|
+
expect(results.last.commit_message).to eq('[Fixes #456 #789] added test 1 to readme')
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'does not return duplicate ChangelogItems' do
|
53
|
+
changelog_file = fixture_file_path('git_changelog_with_duplicates.txt')
|
54
|
+
|
55
|
+
results = described_class.new(:changelog_file => changelog_file).parse_changelog
|
56
|
+
expect(results.size).to eq(4)
|
57
|
+
|
58
|
+
expect(results.first.story_id).to eq(123)
|
59
|
+
expect(results.first.commit_message).to eq('[#123 #456] added more test')
|
60
|
+
|
61
|
+
expect(results.last.story_id).to eq(789)
|
62
|
+
expect(results.last.commit_message).to eq('[Fixes #456 #789] added test 1 to readme')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
38
66
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe JenkinsTracker::ChangelogItem do
|
4
|
+
|
5
|
+
describe '#story_id' do
|
6
|
+
it 'accessor methods' do
|
7
|
+
expect(described_class.new).to respond_to('story_id')
|
8
|
+
expect(described_class.new).to respond_to('story_id=')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#commit_message' do
|
13
|
+
it 'accessor methods' do
|
14
|
+
expect(described_class.new).to respond_to('commit_message')
|
15
|
+
expect(described_class.new).to respond_to('commit_message=')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '==(other)' do
|
20
|
+
it 'is equal to other when its story_id & commit_message are equal' do
|
21
|
+
item1 = described_class.new(:story_id => 1, :commit_message => '123abc')
|
22
|
+
item2 = described_class.new(:story_id => 1, :commit_message => '123abc')
|
23
|
+
item3 = item1
|
24
|
+
|
25
|
+
expect(item1).to eq(item2)
|
26
|
+
expect(item3).to eq(item2)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'is not equal to other when its story_id are not equal' do
|
30
|
+
item1 = described_class.new(:story_id => 1, :commit_message => '123abc')
|
31
|
+
item2 = described_class.new(:story_id => 2, :commit_message => '123abc')
|
32
|
+
|
33
|
+
expect(item1).to_not eq(item2)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'is not equal to other when its commit_message are not equal' do
|
37
|
+
item1 = described_class.new(:story_id => 1, :commit_message => '123abc')
|
38
|
+
item2 = described_class.new(:story_id => 1, :commit_message => 'xyz')
|
39
|
+
|
40
|
+
expect(item1).to_not eq(item2)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'eql?(other)' do
|
45
|
+
let(:fake_changelog_class) { Struct.new(:story_id, :commit_message) }
|
46
|
+
|
47
|
+
it 'is equal to other when its class and attributes are equal' do
|
48
|
+
item1 = described_class.new(:story_id => 1, :commit_message => '123abc')
|
49
|
+
item2 = fake_changelog_class.new(1, '123abc')
|
50
|
+
item3 = item1
|
51
|
+
|
52
|
+
expect(item1).to_not eql(item2)
|
53
|
+
expect(item3).to eql(item1)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe 'an array of ChangelogItems' do
|
58
|
+
it 'correctly removes duplicates when uniq is called' do
|
59
|
+
item1 = described_class.new(:story_id => 1, :commit_message => '123abc')
|
60
|
+
item2 = described_class.new(:story_id => 1, :commit_message => '123abc')
|
61
|
+
item3 = described_class.new(:story_id => 1, :commit_message => 'xyz')
|
62
|
+
item4 = described_class.new(:story_id => 2, :commit_message => '123abc')
|
63
|
+
|
64
|
+
expect([item1, item2].uniq.size).to eq(1)
|
65
|
+
expect([item1, item3].uniq.size).to eq(2)
|
66
|
+
expect([item1, item4].uniq.size).to eq(2)
|
67
|
+
expect([item1, item3, item4].uniq.size).to eq(3)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -7,7 +7,7 @@ end
|
|
7
7
|
|
8
8
|
|
9
9
|
describe JenkinsTracker::Util do
|
10
|
-
let!(:class_instance) { UtilModuleTester.new }
|
10
|
+
#let!(:class_instance) { UtilModuleTester.new }
|
11
11
|
|
12
12
|
#describe '#parse_json' do
|
13
13
|
# let(:json_str) { load_fixture_as_str('job.json') }
|
@@ -19,17 +19,4 @@ describe JenkinsTracker::Util do
|
|
19
19
|
#
|
20
20
|
#end
|
21
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
22
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jenkins_tracker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -94,14 +94,17 @@ files:
|
|
94
94
|
- jenkins_tracker.gemspec
|
95
95
|
- lib/jenkins_tracker.rb
|
96
96
|
- lib/jenkins_tracker/base.rb
|
97
|
+
- lib/jenkins_tracker/changelog_item.rb
|
97
98
|
- lib/jenkins_tracker/cli.rb
|
98
99
|
- lib/jenkins_tracker/exceptions.rb
|
99
100
|
- lib/jenkins_tracker/tracker_client.rb
|
100
101
|
- lib/jenkins_tracker/util.rb
|
101
102
|
- lib/jenkins_tracker/version.rb
|
102
103
|
- spec/fixtures/git_changelog.txt
|
104
|
+
- spec/fixtures/git_changelog_with_duplicates.txt
|
103
105
|
- spec/fixtures/job.json
|
104
106
|
- spec/jenkins_tracker/base_spec.rb
|
107
|
+
- spec/jenkins_tracker/changelog_item_spec.rb
|
105
108
|
- spec/jenkins_tracker/tracker_client_spec.rb
|
106
109
|
- spec/jenkins_tracker/util_spec.rb
|
107
110
|
- spec/spec_helper.rb
|
@@ -120,7 +123,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
120
123
|
version: '0'
|
121
124
|
segments:
|
122
125
|
- 0
|
123
|
-
hash: -
|
126
|
+
hash: -4233350795122730482
|
124
127
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
128
|
none: false
|
126
129
|
requirements:
|
@@ -129,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
132
|
version: '0'
|
130
133
|
segments:
|
131
134
|
- 0
|
132
|
-
hash: -
|
135
|
+
hash: -4233350795122730482
|
133
136
|
requirements: []
|
134
137
|
rubyforge_project:
|
135
138
|
rubygems_version: 1.8.24
|
@@ -139,8 +142,10 @@ summary: Integrate Jenkins build information as notes in the relevant Pivotal Tr
|
|
139
142
|
stories based on its post commit message
|
140
143
|
test_files:
|
141
144
|
- spec/fixtures/git_changelog.txt
|
145
|
+
- spec/fixtures/git_changelog_with_duplicates.txt
|
142
146
|
- spec/fixtures/job.json
|
143
147
|
- spec/jenkins_tracker/base_spec.rb
|
148
|
+
- spec/jenkins_tracker/changelog_item_spec.rb
|
144
149
|
- spec/jenkins_tracker/tracker_client_spec.rb
|
145
150
|
- spec/jenkins_tracker/util_spec.rb
|
146
151
|
- spec/spec_helper.rb
|