codeclimate_circle_ci_coverage 0.1.2 → 0.2.0
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.
- checksums.yaml +4 -4
- data/lib/codeclimate_circle_ci_coverage.rb +2 -0
- data/lib/codeclimate_circle_ci_coverage/circle_ci_1.rb +39 -0
- data/lib/codeclimate_circle_ci_coverage/circle_ci_2.rb +23 -0
- data/lib/codeclimate_circle_ci_coverage/coverage_reporter.rb +12 -36
- data/lib/codeclimate_circle_ci_coverage/version.rb +1 -1
- data/spec/coverage_reporter_spec.rb +16 -1
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1f80a30163ec1777ca121cec35b8930a20e5b1d
|
4
|
+
data.tar.gz: 183493acb07b5c5117a68f5034fe8a60780da247
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d84f3fb2ac10bfcd37a1239a8d5c89591f51e82d756ce395ec13d81ce2a80c45d7902b8a705bca9cb144a1f312e25445807f5a88547d8d63953a02cf8d766219
|
7
|
+
data.tar.gz: a7c54ff1fd50f9d29f4c45e4fe4e5148e93f4241e843142147aaebf609bbc3a8f106d0336100fb64a4665943b5feea21c9c375b673444f191eb41f3961026ec0
|
@@ -1,3 +1,5 @@
|
|
1
1
|
require "codeclimate_circle_ci_coverage/version"
|
2
2
|
require "codeclimate_circle_ci_coverage/patch_simplecov"
|
3
3
|
require "codeclimate_circle_ci_coverage/coverage_reporter"
|
4
|
+
require "codeclimate_circle_ci_coverage/circle_ci_1"
|
5
|
+
require "codeclimate_circle_ci_coverage/circle_ci_2"
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class CircleCi1
|
5
|
+
# Public: Download the .resultset.json files from each of the nodes
|
6
|
+
# and store them in the `target_directory`.
|
7
|
+
#
|
8
|
+
# return: an array of JSON parsed contents of these files.
|
9
|
+
#
|
10
|
+
# They will be numbered 0.resultset.json, 1.resultset.json, etc.
|
11
|
+
def download_files
|
12
|
+
node_total = ENV['CIRCLE_NODE_TOTAL'].to_i
|
13
|
+
target_directory = File.join("all_coverage")
|
14
|
+
|
15
|
+
# Create directory if it doesn't exist
|
16
|
+
FileUtils.mkdir_p target_directory
|
17
|
+
|
18
|
+
if node_total > 0
|
19
|
+
# Copy coverage results from all nodes to circle artifacts directory
|
20
|
+
0.upto(node_total - 1) do |i|
|
21
|
+
node = "node#{i}"
|
22
|
+
# Modified because circleCI doesn't appear to deal with artifacts in the expected manner
|
23
|
+
node_project_dir = `ssh #{node} 'printf $CIRCLE_PROJECT_REPONAME'`
|
24
|
+
from = File.join("~/", node_project_dir, 'coverage', ".resultset.json")
|
25
|
+
to = File.join(target_directory, "#{i}.resultset.json")
|
26
|
+
command = "scp #{node}:#{from} #{to}"
|
27
|
+
|
28
|
+
puts "running command: #{command}"
|
29
|
+
`#{command}`
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Load coverage results from all nodes
|
34
|
+
files = Dir.glob(File.join(target_directory, "*.resultset.json"))
|
35
|
+
files.map do |file, i|
|
36
|
+
JSON.load(File.read(file))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class CircleCi2
|
5
|
+
ARTIFACT_PREFIX = "coverage"
|
6
|
+
|
7
|
+
def download_files
|
8
|
+
if ENV["CIRCLE_TOKEN"].nil?
|
9
|
+
puts "You must create a Circle CI API token to use this on Circle CI 2.0"
|
10
|
+
puts "Please create that, and store the key as CIRCLE_TOKEN"
|
11
|
+
return []
|
12
|
+
end
|
13
|
+
|
14
|
+
api_url = "https://circleci.com/api/v1.1/project/github/#{ENV['CIRCLE_PROJECT_USERNAME']}/#{ENV['CIRCLE_PROJECT_REPONAME']}/#{ENV['CIRCLE_BUILD_NUM']}/artifacts?circle-token=#{ENV['CIRCLE_TOKEN']}"
|
15
|
+
artifacts = open(api_url)
|
16
|
+
|
17
|
+
JSON.load(artifacts).select do |artifact|
|
18
|
+
artifact['path'] == "home/circleci/project/#{ARTIFACT_PREFIX}/.resultset.json"
|
19
|
+
end.map do |artifact|
|
20
|
+
JSON.load(open("#{artifact['url']}?circle-token=#{ENV['CIRCLE_TOKEN']}"))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -8,7 +8,6 @@
|
|
8
8
|
# - Why aren't artifacts stored in the $CIRCLE_ARTIFACTS directory when doing SSH login?
|
9
9
|
require "codeclimate-test-reporter"
|
10
10
|
require "simplecov"
|
11
|
-
require 'fileutils'
|
12
11
|
|
13
12
|
# This packages up the code coverage metrics from multiple servers and
|
14
13
|
# sends them to CodeClimate via the CodeClimate Test Reporter Gem
|
@@ -40,51 +39,28 @@ class CoverageReporter
|
|
40
39
|
# Only run on node0
|
41
40
|
return true unless current_node.zero?
|
42
41
|
|
43
|
-
|
44
|
-
|
45
|
-
final_coverage_dir = File.join("combined_coverage")
|
42
|
+
json_result_files = download_files
|
43
|
+
merged_result = merge_files(json_result_files)
|
46
44
|
|
47
|
-
merged_result = load_and_merge_files(all_coverage_dir, final_coverage_dir)
|
48
45
|
output_result_html(merged_result)
|
49
46
|
upload_result_file(merged_result)
|
50
47
|
store_code_climate_payload(merged_result)
|
51
48
|
true
|
52
49
|
end
|
53
50
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
node_total = ENV['CIRCLE_NODE_TOTAL'].to_i
|
60
|
-
|
61
|
-
# Create directory if it doesn't exist
|
62
|
-
FileUtils.mkdir_p target_directory
|
63
|
-
|
64
|
-
if node_total > 0
|
65
|
-
# Copy coverage results from all nodes to circle artifacts directory
|
66
|
-
0.upto(node_total - 1) do |i|
|
67
|
-
node = "node#{i}"
|
68
|
-
# Modified because circleCI doesn't appear to deal with artifacts in the expected manner
|
69
|
-
node_project_dir = `ssh #{node} 'printf $CIRCLE_PROJECT_REPONAME'`
|
70
|
-
from = File.join("~/", node_project_dir, 'coverage', ".resultset.json")
|
71
|
-
to = File.join(target_directory, "#{i}.resultset.json")
|
72
|
-
command = "scp #{node}:#{from} #{to}"
|
73
|
-
|
74
|
-
puts "running command: #{command}"
|
75
|
-
`#{command}`
|
76
|
-
end
|
51
|
+
def download_files
|
52
|
+
if ENV["CIRCLE_JOB"].nil?
|
53
|
+
CircleCi1.new.download_files
|
54
|
+
else
|
55
|
+
CircleCi2.new.download_files
|
77
56
|
end
|
78
57
|
end
|
79
58
|
|
80
|
-
def
|
81
|
-
|
82
|
-
SimpleCov.coverage_dir(target_directory)
|
59
|
+
def merge_files(json_files)
|
60
|
+
SimpleCov.coverage_dir('/tmp/coverage')
|
83
61
|
|
84
62
|
# Merge coverage results from all nodes
|
85
|
-
|
86
|
-
files.each_with_index do |file, i|
|
87
|
-
resultset = JSON.load(File.read(file))
|
63
|
+
json_files.each_with_index do |resultset, i|
|
88
64
|
resultset.each do |_command_name, data|
|
89
65
|
result = SimpleCov::Result.from_hash(['command', i].join => data)
|
90
66
|
check_and_fix_result_time(result)
|
@@ -118,7 +94,7 @@ class CoverageReporter
|
|
118
94
|
def upload_result_file(merged_result)
|
119
95
|
# Post merged coverage result to codeclimate
|
120
96
|
codeclimate_formatter = CodeClimate::TestReporter::Formatter.new
|
121
|
-
codeclimate_formatter.format(merged_result)
|
97
|
+
codeclimate_formatter.format(merged_result.to_hash)
|
122
98
|
end
|
123
99
|
|
124
100
|
# Internal: Debug function, in use to log the exact file which is sent to codeclimate
|
@@ -126,7 +102,7 @@ class CoverageReporter
|
|
126
102
|
def store_code_climate_payload(merged_result)
|
127
103
|
ENV["CODECLIMATE_TO_FILE"] = "true"
|
128
104
|
codeclimate_formatter = CodeClimate::TestReporter::Formatter.new
|
129
|
-
codeclimate_formatter.format(merged_result)
|
105
|
+
codeclimate_formatter.format(merged_result.to_hash)
|
130
106
|
ensure
|
131
107
|
ENV["CODECLIMATE_TO_FILE"] = nil
|
132
108
|
end
|
@@ -4,6 +4,19 @@ describe CoverageReporter do
|
|
4
4
|
let(:reporter) { described_class.new("master") }
|
5
5
|
|
6
6
|
describe "#run" do
|
7
|
+
let(:sample_coverage) do
|
8
|
+
[
|
9
|
+
{
|
10
|
+
"RSpec" => {
|
11
|
+
"coverage" => {
|
12
|
+
"#{SimpleCov.root}/spec/fixtures/fake_project/fake_project.rb" => [5,3,nil,0]
|
13
|
+
},
|
14
|
+
"timestamp" => Time.now.to_i,
|
15
|
+
}
|
16
|
+
}
|
17
|
+
]
|
18
|
+
end
|
19
|
+
|
7
20
|
it "returns true on mismatch branch names" do
|
8
21
|
allow(reporter).to receive(:current_branch).and_return("develop")
|
9
22
|
expect(reporter.run).to be_truthy
|
@@ -15,10 +28,12 @@ describe CoverageReporter do
|
|
15
28
|
expect(reporter.run).to be_truthy
|
16
29
|
end
|
17
30
|
|
18
|
-
|
31
|
+
xit "returns true when branch and node are correct" do
|
19
32
|
allow(reporter).to receive(:current_branch).and_return("master")
|
20
33
|
allow(reporter).to receive(:current_node).and_return(0)
|
34
|
+
allow_any_instance_of(CircleCi1).to receive(:download_files).and_return(sample_coverage)
|
21
35
|
expect(reporter.run).to be_truthy
|
36
|
+
# failing because creating a believable SimpleCov Result is more difficult than I thought
|
22
37
|
end
|
23
38
|
end
|
24
39
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: codeclimate_circle_ci_coverage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robin Dunlop
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: codeclimate-test-reporter
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "<"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "<"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: simplecov
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -104,12 +104,14 @@ extra_rdoc_files: []
|
|
104
104
|
files:
|
105
105
|
- bin/report_coverage
|
106
106
|
- lib/codeclimate_circle_ci_coverage.rb
|
107
|
+
- lib/codeclimate_circle_ci_coverage/circle_ci_1.rb
|
108
|
+
- lib/codeclimate_circle_ci_coverage/circle_ci_2.rb
|
107
109
|
- lib/codeclimate_circle_ci_coverage/coverage_reporter.rb
|
108
110
|
- lib/codeclimate_circle_ci_coverage/patch_simplecov.rb
|
109
111
|
- lib/codeclimate_circle_ci_coverage/version.rb
|
110
112
|
- spec/coverage_reporter_spec.rb
|
111
113
|
- spec/spec_helper.rb
|
112
|
-
homepage:
|
114
|
+
homepage: https://github.com/rdunlop/codeclimate_circle_ci_coverage
|
113
115
|
licenses:
|
114
116
|
- MIT
|
115
117
|
metadata: {}
|
@@ -129,7 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
131
|
version: '0'
|
130
132
|
requirements: []
|
131
133
|
rubyforge_project:
|
132
|
-
rubygems_version: 2.
|
134
|
+
rubygems_version: 2.6.13
|
133
135
|
signing_key:
|
134
136
|
specification_version: 4
|
135
137
|
summary: CodeClimate Code Coverage reporting script for CircleCI
|