jenkins_tracker 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://travis-ci.org/prashantrajan/jenkins_tracker.png?branch=master)](https://travis-ci.org/prashantrajan/jenkins_tracker)
|
4
4
|
[![Gem Version](https://badge.fury.io/rb/jenkins_tracker.png)](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
|
+
![Jenkins Post Build Action Screenshot](https://raw.github.com/prashantrajan/static_assets/master/jenkins_tracker/images/tracker_comment_2.jpg)
|
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
|
+
![Jenkins Post Build Action Screenshot](https://raw.github.com/prashantrajan/static_assets/master/jenkins_tracker/images/jenkins_post_build_action_2.jpg)
|
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
|