codecov 0.3.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9e12456ff8c7c83f307db7b999f8ab58e9f294142c35912b97134a54f088470a
4
- data.tar.gz: 24ff939b59a8281286af266a35968315815610edb4b98dfe4123fbc2e39b3c28
3
+ metadata.gz: c3ac8f8595023909dff3989e3b5026a2f3959a1b5264f64abcbef36373535ec9
4
+ data.tar.gz: dc49c63c9cf98c9052f558c1556bd00963086947580d2eb00deaef201ec31aa3
5
5
  SHA512:
6
- metadata.gz: c9385b7a818d1d7ca477175226834801a6bc4603703242dfdecc8dd55e33f9cf1930cedca5b0dcb6741e1db34a08034f8076315d257de1942fdfa774263b04fa
7
- data.tar.gz: 931e870cd82918f6b598cabbdba2259054d2e8475b0fadf7df3aab4c77daa6b2588896ee1fec0ce72e0c95555f74f669cfba879b22d14e4545c0c84bfa81d0b9
6
+ metadata.gz: bcec7277a8f503f2db6365c1233075d0ecb6727acf2d97e557b40725e0a097735749f64470ea120071e65a6488794875309c19759d7297431f43ea5f6c61100a
7
+ data.tar.gz: fb195f5011e4baa21f01a1c9131628d009b69ba500b499188bdf8c48b29b8630792307d955dedf4215e1f8ad16478bb5ef4a92cad011cf00e413e847a551153e
data/CHANGELOG.md ADDED
@@ -0,0 +1,127 @@
1
+ ### `0.5.0`
2
+ - #137 Place uploader in try/rescue block and add pass_ci_if_error flag
3
+
4
+ ### `0.4.3`
5
+ - #135 Shorten coverage message on formatter
6
+
7
+ ### `0.4.2`
8
+ - #134 Wrap file creation in try/catch
9
+
10
+ ### `0.4.1`
11
+ - #133 Write down to file when using the formatter
12
+
13
+ ### `0.4.0`
14
+ - #130 Split uploader from formatter
15
+
16
+ ### `0.3.0`
17
+ - #124 Ruby 3.0 support
18
+ - #125 open simplecov requirement to 0.21.x
19
+
20
+ ### `0.2.15`
21
+ - #118 Include codecov/version in the gem
22
+
23
+ ### `0.2.14`
24
+ - #107 Add EditorConfig file
25
+ - #113 Return version constant, don't duplicate version value
26
+ - #117 Update simplecov dependency versions
27
+
28
+ ### `0.2.13`
29
+ - [#105](https://github.com/codecov/codecov-ruby/pull/105) Remove unnecessary dependency for ruby standard gem
30
+ - [#110](https://github.com/codecov/codecov-ruby/pull/110) Fix GitHub Actions
31
+ - [#111](https://github.com/codecov/codecov-ruby/pull/111) Fix branch name detection for GitHub Actions CI
32
+
33
+ ### `0.2.12`
34
+ - [#102](https://github.com/codecov/codecov-ruby/pull/102) Fix value of params[:pr] when useing CodeBuild
35
+
36
+ ### `0.2.11`
37
+ - Add vendor/ to invalid directories
38
+
39
+ ### `0.2.10`
40
+ - Adds better logging on error cases
41
+ - Add more invalid directories in the network
42
+
43
+ ### `0.2.9`
44
+ - Remove `String` specific colors
45
+ - Add support for Codebuild CI
46
+
47
+ ### `0.2.8`
48
+ - Remove `colorize` dependency
49
+
50
+ ### `0.2.7`
51
+ - Fix for enterprise users unable to upload using the v4 uploader
52
+
53
+ ### `0.2.6`
54
+ - Fix issue with `push` events on GitHub Actions
55
+
56
+ ### `0.2.5`
57
+ - Revert single use of VERSION
58
+
59
+ ### `0.2.4`
60
+ - Adds support for GitHub Actions CI
61
+
62
+ ### `0.2.3`
63
+ - Support uploads for jruby 9.1 and 9.2
64
+
65
+ ### `0.2.2`
66
+ - Handle SocketError and better error handling of v4 failures
67
+
68
+ ### `0.2.1`
69
+ - Properly handle 400 cases when using the v4 endpoint
70
+
71
+ ### `0.2.0`
72
+ - move to the v4 upload endpoint with the v2 as a fallback
73
+
74
+ ### `0.1.20`
75
+ - fix critical upload issues on V2 endpoint
76
+
77
+ ### `0.1.19`
78
+ - fix colorize
79
+
80
+ ### `0.1.18`
81
+ - refactor and move to use v2 endpoint
82
+ - use Timeout::Error
83
+
84
+ ### `0.1.17`
85
+ - refactor upload method and add more logging
86
+
87
+ ### `0.1.10`
88
+ - update numerous ci environments
89
+ - dont fail if cannot upload to codecov
90
+
91
+ ### `0.1.3`
92
+ - add buildkite
93
+
94
+ ### `0.1.2`
95
+ - add slug argument
96
+ - use slug for uploading
97
+ - add Accept to uploads
98
+
99
+ ### `0.1.1`
100
+ - fix #6, thanks @justmatt
101
+ - add semaphore thread number
102
+
103
+ ### `0.1.0`
104
+ - added more CircleCI env
105
+
106
+ ### `0.0.11`
107
+ - send AppVeyor pr# with reports
108
+
109
+ ### `0.0.10`
110
+ - fix AppVeyor for public repos
111
+
112
+ ### `0.0.9`
113
+ - remove tmp.json creation
114
+
115
+ ### `0.0.8`
116
+ - added more jenkins environment references
117
+
118
+ ### `0.0.7`
119
+ - added GitLab CI Runner support
120
+
121
+ ### `0.0.5`
122
+ - added line messages by @coderanger
123
+ - fixed skip lines during reporting by @coderanger
124
+
125
+ ### `0.0.4`
126
+ - added more test
127
+ - added more CI providers
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Codecov
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,111 @@
1
+ # Codecov Ruby Uploader
2
+
3
+ ## DEPRECATION WARNING
4
+
5
+ All versions of the Ruby uploader prior to `0.2.0` will no longer be supported
6
+ and will be removed from public use on or after *2020-08-17*.
7
+ Please upgrade to the latest versions to continue using this uploader.
8
+
9
+ [![Codecov](https://codecov.io/github/codecov/codecov-ruby/coverage.svg?branch=master)](https://codecov.io/github/codecov/codecov-ruby?branch=master)
10
+ [![Gem Version](https://badge.fury.io/rb/codecov.svg)](https://rubygems.org/gems/codecov)
11
+ [![Build Status](https://secure.travis-ci.org/codecov/codecov-ruby.svg?branch=master)](http://travis-ci.org/codecov/codecov-ruby)
12
+ [![Codecov](https://circleci.com/gh/codecov/codecov-ruby.svg?style=svg)](https://circleci.com/gh/codecov/codecov-ruby)
13
+ [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fcodecov%2Fcodecov-ruby.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fcodecov%2Fcodecov-ruby?ref=badge_shield)
14
+
15
+
16
+ [Codecov.io](https://codecov.io/) upload support for Ruby.
17
+
18
+ ## Quick Start
19
+
20
+ Add to your `Gemfile`:
21
+
22
+ ```ruby
23
+ gem 'codecov', require: false, group: 'test'
24
+ ```
25
+
26
+ Add to the top of your `tests/helper.rb` file:
27
+
28
+ ```ruby
29
+ require 'simplecov'
30
+ SimpleCov.start
31
+
32
+ require 'codecov'
33
+ SimpleCov.formatter = SimpleCov::Formatter::Codecov
34
+ ```
35
+
36
+ Add CI Environment Variable:
37
+
38
+ ```sh
39
+ CODECOV_TOKEN="your repo token"
40
+ ```
41
+
42
+ Find you repo token on your repo page at [codecov.io](https://codecov.io).
43
+ Repo tokens are **not** required for public repos on Travis-Ci, CircleCI, or AppVeyor CI.
44
+
45
+ ## Supported CIs
46
+ | CI/CD |
47
+ | ----- |
48
+ | [AppVeyor CI](https://www.appveyor.com/) |
49
+ | [Azure Pipelines](https://azure.microsoft.com/en-us/services/devops/pipelines/) |
50
+ | [Bitbucket Pipelines](https://bitbucket.org/product/features/pipelines) |
51
+ | [Bitrise CI](https://www.bitrise.io/) |
52
+ | [Buildkite CI](https://buildkite.com/) |
53
+ | [CodeBuild CI](https://aws.amazon.com/codebuild/) |
54
+ | [CodePipeline](https://aws.amazon.com/codepipeline/) |
55
+ | [Circle CI](https://circleci.com/) |
56
+ | [Codeship CI](https://codeship.com/) |
57
+ | [Drone CI](https://drone.io/) |
58
+ | [GitLab CI](https://docs.gitlab.com/ee/ci/) |
59
+ | [Heroku CI](https://www.heroku.com/continuous-integration) |
60
+ | [Jenkins CI](https://www.jenkins.io/) |
61
+ | [Semaphore CI](https://semaphoreci.com/) |
62
+ | [Shippable](https://www.shippable.com/) |
63
+ | [Solano CI](https://xebialabs.com/technology/solano-ci/) |
64
+ | [TeamCity CI](https://www.jetbrains.com/teamcity/) |
65
+ | [Travis CI](https://travis-ci.org/) |
66
+ | [Wercker CI](https://devcenter.wercker.com/) |
67
+
68
+ ## Advanced Usage
69
+
70
+ #### Submit only in CI example
71
+
72
+ ```ruby
73
+ if ENV['CI'] == 'true'
74
+ require 'codecov'
75
+ SimpleCov.formatter = SimpleCov::Formatter::Codecov
76
+ end
77
+ ```
78
+
79
+ ## Useful Links
80
+
81
+ [FAQ](https://docs.codecov.io/docs/frequently-asked-questions)
82
+ [Recipe List](https://docs.codecov.io/docs/common-recipe-list)
83
+ [Error Reference](https://docs.codecov.io/docs/error-reference)
84
+ [Changelog](./CHANGELOG.md)
85
+ [Support](https://codecov.io/support)
86
+ [Community Boards](https://community.codecov.io)
87
+
88
+ ## Caveats
89
+
90
+ 1. There are known issues when `Simplecov.track_files` is enabled. We recommend that you require all code files in your tests so that SimpleCov can provide Codecov with properly mapped coverage report metrics. [codecov/support#133]( https://github.com/codecov/support/issues/133)
91
+ - https://github.com/colszowka/simplecov/blob/master/README.md#default-root-filter-and-coverage-for-things-outside-of-it
92
+ 2. `git` must be installed.
93
+ - https://github.com/codecov/codecov-ruby/blob/5e3dae3/lib/codecov.rb#L284-L295
94
+
95
+ ## Maintainers
96
+
97
+ - [thomasrockhu](https://github.com/thomasrockhu)
98
+
99
+ ## Enterprise
100
+
101
+ For companies using Codecov Enterprise you will need to specify the following parameters:
102
+
103
+ ```sh
104
+ CODECOV_URL="https://codecov.mycompany.com"
105
+ CODECOV_SLUG="owner/repo"
106
+ CODECOV_TOKEN="repository token or global token"
107
+ ```
108
+
109
+
110
+ ## License
111
+ [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fcodecov%2Fcodecov-ruby.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fcodecov%2Fcodecov-ruby?ref=badge_large)
data/lib/codecov.rb CHANGED
@@ -6,621 +6,12 @@ require 'net/http'
6
6
  require 'simplecov'
7
7
  require 'zlib'
8
8
 
9
- require_relative 'codecov/version'
9
+ require_relative 'codecov/formatter'
10
+ require_relative 'codecov/uploader'
10
11
 
11
12
  class SimpleCov::Formatter::Codecov
12
- ### CIs
13
- RECOGNIZED_CIS = [
14
- APPVEYOR = 'Appveyor CI',
15
- AZUREPIPELINES = 'Azure Pipelines',
16
- BITBUCKET = 'Bitbucket',
17
- BITRISE = 'Bitrise CI',
18
- BUILDKITE = 'Buildkite CI',
19
- CIRCLE = 'Circle CI',
20
- CODEBUILD = 'Codebuild CI',
21
- CODESHIP = 'Codeship CI',
22
- DRONEIO = 'Drone CI',
23
- GITHUB = 'GitHub Actions',
24
- GITLAB = 'GitLab CI',
25
- HEROKU = 'Heroku CI',
26
- JENKINS = 'Jenkins CI',
27
- SEMAPHORE = 'Semaphore CI',
28
- SHIPPABLE = 'Shippable',
29
- SOLANO = 'Solano CI',
30
- TEAMCITY = 'TeamCity CI',
31
- TRAVIS = 'Travis CI',
32
- WERCKER = 'Wercker CI'
33
- ].freeze
34
-
35
- def display_header
36
- puts [
37
- '',
38
- ' _____ _',
39
- ' / ____| | |',
40
- '| | ___ __| | ___ ___ _____ __',
41
- '| | / _ \ / _\`|/ _ \/ __/ _ \ \ / /',
42
- '| |___| (_) | (_| | __/ (_| (_) \ V /',
43
- ' \_____\___/ \__,_|\___|\___\___/ \_/',
44
- " Ruby-#{::Codecov::VERSION}",
45
- ''
46
- ].join("\n")
47
- end
48
-
49
- def detect_ci
50
- ci = if (ENV['CI'] == 'True') && (ENV['APPVEYOR'] == 'True')
51
- APPVEYOR
52
- elsif !ENV['TF_BUILD'].nil?
53
- AZUREPIPELINES
54
- elsif (ENV['CI'] == 'true') && !ENV['BITBUCKET_BRANCH'].nil?
55
- BITBUCKET
56
- elsif (ENV['CI'] == 'true') && (ENV['BITRISE_IO'] == 'true')
57
- BITRISE
58
- elsif (ENV['CI'] == 'true') && (ENV['BUILDKITE'] == 'true')
59
- BUILDKITE
60
- elsif (ENV['CI'] == 'true') && (ENV['CIRCLECI'] == 'true')
61
- CIRCLE
62
- elsif ENV['CODEBUILD_CI'] == 'true'
63
- CODEBUILD
64
- elsif (ENV['CI'] == 'true') && (ENV['CI_NAME'] == 'codeship')
65
- CODESHIP
66
- elsif ((ENV['CI'] == 'true') || (ENV['CI'] == 'drone')) && (ENV['DRONE'] == 'true')
67
- DRONEIO
68
- elsif (ENV['CI'] == 'true') && (ENV['GITHUB_ACTIONS'] == 'true')
69
- GITHUB
70
- elsif !ENV['GITLAB_CI'].nil?
71
- GITLAB
72
- elsif ENV['HEROKU_TEST_RUN_ID']
73
- HEROKU
74
- elsif !ENV['JENKINS_URL'].nil?
75
- JENKINS
76
- elsif (ENV['CI'] == 'true') && (ENV['SEMAPHORE'] == 'true')
77
- SEMAPHORE
78
- elsif (ENV['CI'] == 'true') && (ENV['SHIPPABLE'] == 'true')
79
- SHIPPABLE
80
- elsif ENV['TDDIUM'] == 'true'
81
- SOLANO
82
- elsif ENV['CI_SERVER_NAME'] == 'TeamCity'
83
- TEAMCITY
84
- elsif (ENV['CI'] == 'true') && (ENV['TRAVIS'] == 'true')
85
- TRAVIS
86
- elsif (ENV['CI'] == 'true') && !ENV['WERCKER_GIT_BRANCH'].nil?
87
- WERCKER
88
- end
89
-
90
- if !RECOGNIZED_CIS.include?(ci)
91
- puts [red('x>'), 'No CI provider detected.'].join(' ')
92
- else
93
- puts "==> #{ci} detected"
94
- end
95
-
96
- ci
97
- end
98
-
99
- def build_params(ci)
100
- params = {
101
- 'token' => ENV['CODECOV_TOKEN'],
102
- 'flags' => ENV['CODECOV_FLAG'] || ENV['CODECOV_FLAGS'],
103
- 'package' => "ruby-#{::Codecov::VERSION}"
104
- }
105
-
106
- case ci
107
- when APPVEYOR
108
- # http://www.appveyor.com/docs/environment-variables
109
- params[:service] = 'appveyor'
110
- params[:branch] = ENV['APPVEYOR_REPO_BRANCH']
111
- params[:build] = ENV['APPVEYOR_JOB_ID']
112
- params[:pr] = ENV['APPVEYOR_PULL_REQUEST_NUMBER']
113
- params[:job] = ENV['APPVEYOR_ACCOUNT_NAME'] + '/' + ENV['APPVEYOR_PROJECT_SLUG'] + '/' + ENV['APPVEYOR_BUILD_VERSION']
114
- params[:slug] = ENV['APPVEYOR_REPO_NAME']
115
- params[:commit] = ENV['APPVEYOR_REPO_COMMIT']
116
- when AZUREPIPELINES
117
- params[:service] = 'azure_pipelines'
118
- params[:branch] = ENV['BUILD_SOURCEBRANCH']
119
- params[:pull_request] = ENV['SYSTEM_PULLREQUEST_PULLREQUESTNUMBER']
120
- params[:job] = ENV['SYSTEM_JOBID']
121
- params[:build] = ENV['BUILD_BUILDID']
122
- params[:build_url] = "#{ENV['SYSTEM_TEAMFOUNDATIONSERVERURI']}/#{ENV['SYSTEM_TEAMPROJECT']}/_build/results?buildId=#{ENV['BUILD_BUILDID']}"
123
- params[:commit] = ENV['BUILD_SOURCEVERSION']
124
- params[:slug] = ENV['BUILD_REPOSITORY_ID']
125
- when BITBUCKET
126
- # https://confluence.atlassian.com/bitbucket/variables-in-pipelines-794502608.html
127
- params[:service] = 'bitbucket'
128
- params[:branch] = ENV['BITBUCKET_BRANCH']
129
- # BITBUCKET_COMMIT does not always provide full commit sha due to a bug https://jira.atlassian.com/browse/BCLOUD-19393#
130
- params[:commit] = (ENV['BITBUCKET_COMMIT'].length < 40 ? nil : ENV['BITBUCKET_COMMIT'])
131
- params[:build] = ENV['BITBUCKET_BUILD_NUMBER']
132
- when BITRISE
133
- # http://devcenter.bitrise.io/faq/available-environment-variables/
134
- params[:service] = 'bitrise'
135
- params[:branch] = ENV['BITRISE_GIT_BRANCH']
136
- params[:pr] = ENV['BITRISE_PULL_REQUEST']
137
- params[:build] = ENV['BITRISE_BUILD_NUMBER']
138
- params[:build_url] = ENV['BITRISE_BUILD_URL']
139
- params[:commit] = ENV['BITRISE_GIT_COMMIT']
140
- params[:slug] = ENV['BITRISEIO_GIT_REPOSITORY_OWNER'] + '/' + ENV['BITRISEIO_GIT_REPOSITORY_SLUG']
141
- when BUILDKITE
142
- # https://buildkite.com/docs/guides/environment-variables
143
- params[:service] = 'buildkite'
144
- params[:branch] = ENV['BUILDKITE_BRANCH']
145
- params[:build] = ENV['BUILDKITE_BUILD_NUMBER']
146
- params[:job] = ENV['BUILDKITE_JOB_ID']
147
- params[:build_url] = ENV['BUILDKITE_BUILD_URL']
148
- params[:slug] = ENV['BUILDKITE_PROJECT_SLUG']
149
- params[:commit] = ENV['BUILDKITE_COMMIT']
150
- when CIRCLE
151
- # https://circleci.com/docs/environment-variables
152
- params[:service] = 'circleci'
153
- params[:build] = ENV['CIRCLE_BUILD_NUM']
154
- params[:job] = ENV['CIRCLE_NODE_INDEX']
155
- params[:slug] = if !ENV['CIRCLE_PROJECT_REPONAME'].nil?
156
- ENV['CIRCLE_PROJECT_USERNAME'] + '/' + ENV['CIRCLE_PROJECT_REPONAME']
157
- else
158
- ENV['CIRCLE_REPOSITORY_URL'].gsub(/^.*:/, '').gsub(/\.git$/, '')
159
- end
160
- params[:pr] = ENV['CIRCLE_PR_NUMBER']
161
- params[:branch] = ENV['CIRCLE_BRANCH']
162
- params[:commit] = ENV['CIRCLE_SHA1']
163
- when CODEBUILD
164
- # https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html
165
- params[:service] = 'codebuild'
166
- params[:branch] = ENV['CODEBUILD_WEBHOOK_HEAD_REF'].split('/')[2]
167
- params[:build] = ENV['CODEBUILD_BUILD_ID']
168
- params[:commit] = ENV['CODEBUILD_RESOLVED_SOURCE_VERSION']
169
- params[:job] = ENV['CODEBUILD_BUILD_ID']
170
- params[:slug] = ENV['CODEBUILD_SOURCE_REPO_URL'].match(/.*github.com\/(?<slug>.*).git/)['slug']
171
- params[:pr] = if ENV['CODEBUILD_SOURCE_VERSION']
172
- matched = ENV['CODEBUILD_SOURCE_VERSION'].match(%r{pr/(?<pr>.*)})
173
- matched.nil? ? ENV['CODEBUILD_SOURCE_VERSION'] : matched['pr']
174
- end
175
- when CODESHIP
176
- # https://www.codeship.io/documentation/continuous-integration/set-environment-variables/
177
- params[:service] = 'codeship'
178
- params[:branch] = ENV['CI_BRANCH']
179
- params[:commit] = ENV['CI_COMMIT_ID']
180
- params[:build] = ENV['CI_BUILD_NUMBER']
181
- params[:build_url] = ENV['CI_BUILD_URL']
182
- when DRONEIO
183
- # https://semaphoreapp.com/docs/available-environment-variables.html
184
- params[:service] = 'drone.io'
185
- params[:branch] = ENV['DRONE_BRANCH']
186
- params[:commit] = ENV['DRONE_COMMIT_SHA']
187
- params[:job] = ENV['DRONE_JOB_NUMBER']
188
- params[:build] = ENV['DRONE_BUILD_NUMBER']
189
- params[:build_url] = ENV['DRONE_BUILD_LINK'] || ENV['DRONE_BUILD_URL'] || ENV['CI_BUILD_URL']
190
- params[:pr] = ENV['DRONE_PULL_REQUEST']
191
- params[:tag] = ENV['DRONE_TAG']
192
- when GITHUB
193
- # https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables
194
- params[:service] = 'github-actions'
195
- if (ENV['GITHUB_HEAD_REF'] || '').empty?
196
- params[:branch] = ENV['GITHUB_REF'].sub('refs/heads/', '')
197
- else
198
- params[:branch] = ENV['GITHUB_HEAD_REF']
199
- # PR refs are in the format: refs/pull/7/merge for pull_request events
200
- params[:pr] = ENV['GITHUB_REF'].split('/')[2]
201
- end
202
- params[:slug] = ENV['GITHUB_REPOSITORY']
203
- params[:build] = ENV['GITHUB_RUN_ID']
204
- params[:commit] = ENV['GITHUB_SHA']
205
- when GITLAB
206
- # http://doc.gitlab.com/ci/examples/README.html#environmental-variables
207
- # https://gitlab.com/gitlab-org/gitlab-ci-runner/blob/master/lib/build.rb#L96
208
- # GitLab Runner v9 renamed some environment variables, so we check both old and new variable names.
209
- params[:service] = 'gitlab'
210
- params[:branch] = ENV['CI_BUILD_REF_NAME'] || ENV['CI_COMMIT_REF_NAME']
211
- params[:build] = ENV['CI_BUILD_ID'] || ENV['CI_JOB_ID']
212
- slug = ENV['CI_BUILD_REPO'] || ENV['CI_REPOSITORY_URL']
213
- params[:slug] = slug.split('/', 4)[-1].sub('.git', '') if slug
214
- params[:commit] = ENV['CI_BUILD_REF'] || ENV['CI_COMMIT_SHA']
215
- when HEROKU
216
- params[:service] = 'heroku'
217
- params[:branch] = ENV['HEROKU_TEST_RUN_BRANCH']
218
- params[:build] = ENV['HEROKU_TEST_RUN_ID']
219
- params[:commit] = ENV['HEROKU_TEST_RUN_COMMIT_VERSION']
220
- when JENKINS
221
- # https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project
222
- # https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin#GitHubpullrequestbuilderplugin-EnvironmentVariables
223
- params[:service] = 'jenkins'
224
- params[:branch] = ENV['ghprbSourceBranch'] || ENV['GIT_BRANCH']
225
- params[:commit] = ENV['ghprbActualCommit'] || ENV['GIT_COMMIT']
226
- params[:pr] = ENV['ghprbPullId']
227
- params[:build] = ENV['BUILD_NUMBER']
228
- params[:root] = ENV['WORKSPACE']
229
- params[:build_url] = ENV['BUILD_URL']
230
- when SEMAPHORE
231
- # https://semaphoreapp.com/docs/available-environment-variables.html
232
- params[:service] = 'semaphore'
233
- params[:branch] = ENV['BRANCH_NAME']
234
- params[:commit] = ENV['REVISION']
235
- params[:build] = ENV['SEMAPHORE_BUILD_NUMBER']
236
- params[:job] = ENV['SEMAPHORE_CURRENT_THREAD']
237
- params[:slug] = ENV['SEMAPHORE_REPO_SLUG']
238
- when SHIPPABLE
239
- # http://docs.shippable.com/en/latest/config.html#common-environment-variables
240
- params[:service] = 'shippable'
241
- params[:branch] = ENV['BRANCH']
242
- params[:build] = ENV['BUILD_NUMBER']
243
- params[:build_url] = ENV['BUILD_URL']
244
- params[:pull_request] = ENV['PULL_REQUEST']
245
- params[:slug] = ENV['REPO_NAME']
246
- params[:commit] = ENV['COMMIT']
247
- when SOLANO
248
- # http://docs.solanolabs.com/Setup/tddium-set-environment-variables/
249
- params[:service] = 'solano'
250
- params[:branch] = ENV['TDDIUM_CURRENT_BRANCH']
251
- params[:commit] = ENV['TDDIUM_CURRENT_COMMIT']
252
- params[:build] = ENV['TDDIUM_TID']
253
- params[:pr] = ENV['TDDIUM_PR_ID']
254
- when TEAMCITY
255
- # https://confluence.jetbrains.com/display/TCD8/Predefined+Build+Parameters
256
- # Teamcity does not automatically make build parameters available as environment variables.
257
- # Add the following environment parameters to the build configuration
258
- # env.TEAMCITY_BUILD_BRANCH = %teamcity.build.branch%
259
- # env.TEAMCITY_BUILD_ID = %teamcity.build.id%
260
- # env.TEAMCITY_BUILD_URL = %teamcity.serverUrl%/viewLog.html?buildId=%teamcity.build.id%
261
- # env.TEAMCITY_BUILD_COMMIT = %system.build.vcs.number%
262
- # env.TEAMCITY_BUILD_REPOSITORY = %vcsroot.<YOUR TEAMCITY VCS NAME>.url%
263
- params[:service] = 'teamcity'
264
- params[:branch] = ENV['TEAMCITY_BUILD_BRANCH']
265
- params[:build] = ENV['TEAMCITY_BUILD_ID']
266
- params[:build_url] = ENV['TEAMCITY_BUILD_URL']
267
- params[:commit] = ENV['TEAMCITY_BUILD_COMMIT']
268
- params[:slug] = ENV['TEAMCITY_BUILD_REPOSITORY'].split('/', 4)[-1].sub('.git', '')
269
- when TRAVIS
270
- # http://docs.travis-ci.com/user/ci-environment/#Environment-variables
271
- params[:service] = 'travis'
272
- params[:branch] = ENV['TRAVIS_BRANCH']
273
- params[:pull_request] = ENV['TRAVIS_PULL_REQUEST']
274
- params[:job] = ENV['TRAVIS_JOB_ID']
275
- params[:slug] = ENV['TRAVIS_REPO_SLUG']
276
- params[:build] = ENV['TRAVIS_JOB_NUMBER']
277
- params[:commit] = ENV['TRAVIS_COMMIT']
278
- params[:env] = ENV['TRAVIS_RUBY_VERSION']
279
- when WERCKER
280
- # http://devcenter.wercker.com/articles/steps/variables.html
281
- params[:service] = 'wercker'
282
- params[:branch] = ENV['WERCKER_GIT_BRANCH']
283
- params[:build] = ENV['WERCKER_MAIN_PIPELINE_STARTED']
284
- params[:slug] = ENV['WERCKER_GIT_OWNER'] + '/' + ENV['WERCKER_GIT_REPOSITORY']
285
- params[:commit] = ENV['WERCKER_GIT_COMMIT']
286
- end
287
-
288
- if params[:branch].nil?
289
- # find branch, commit, repo from git command
290
- branch = `git rev-parse --abbrev-ref HEAD`.strip
291
- params[:branch] = branch != 'HEAD' ? branch : 'master'
292
- end
293
-
294
- if !ENV['VCS_COMMIT_ID'].nil?
295
- params[:commit] = ENV['VCS_COMMIT_ID']
296
-
297
- elsif params[:commit].nil?
298
- params[:commit] = `git rev-parse HEAD`.strip
299
- end
300
-
301
- slug = ENV['CODECOV_SLUG']
302
- params[:slug] = slug unless slug.nil?
303
-
304
- params[:pr] = params[:pr].sub('#', '') unless params[:pr].nil?
305
-
306
- params
307
- end
308
-
309
- def retry_request(req, https)
310
- retries = 3
311
- begin
312
- response = https.request(req)
313
- rescue Timeout::Error, SocketError => e
314
- retries -= 1
315
-
316
- if retries.zero?
317
- puts 'Timeout or connection error uploading coverage reports to Codecov. Out of retries.'
318
- puts e
319
- return response
320
- end
321
-
322
- puts 'Timeout or connection error uploading coverage reports to Codecov. Retrying...'
323
- puts e
324
- retry
325
- rescue StandardError => e
326
- puts 'Error uploading coverage reports to Codecov. Sorry'
327
- puts e.class.name
328
- puts e
329
- puts "Backtrace:\n\t#{e.backtrace}"
330
- return response
331
- end
332
-
333
- response
334
- end
335
-
336
- def create_report(report)
337
- result = {
338
- 'meta' => {
339
- 'version' => 'codecov-ruby/v' + ::Codecov::VERSION
340
- }
341
- }
342
- result.update(result_to_codecov(report))
343
- result
344
- end
345
-
346
- def gzip_report(report)
347
- puts [green('==>'), 'Gzipping contents'].join(' ')
348
-
349
- io = StringIO.new
350
- gzip = Zlib::GzipWriter.new(io)
351
- gzip << report
352
- gzip.close
353
-
354
- io.string
355
- end
356
-
357
- def upload_to_codecov(ci, report)
358
- url = ENV['CODECOV_URL'] || 'https://codecov.io'
359
- is_enterprise = url != 'https://codecov.io'
360
-
361
- params = build_params(ci)
362
- params_secret_token = params.clone
363
- params_secret_token['token'] = 'secret'
364
-
365
- query = URI.encode_www_form(params)
366
- query_without_token = URI.encode_www_form(params_secret_token)
367
-
368
- gzipped_report = gzip_report(report['codecov'])
369
-
370
- report['params'] = params
371
- report['query'] = query
372
-
373
- puts [green('==>'), 'Uploading reports'].join(' ')
374
- puts " url: #{url}"
375
- puts " query: #{query_without_token}"
376
-
377
- response = false
378
- unless is_enterprise
379
- response = upload_to_v4(url, gzipped_report, query, query_without_token)
380
- return false if response == false
381
- end
382
-
383
- response || upload_to_v2(url, gzipped_report, query, query_without_token)
384
- end
385
-
386
- def upload_to_v4(url, report, query, query_without_token)
387
- uri = URI.parse(url.chomp('/') + '/upload/v4')
388
- https = Net::HTTP.new(uri.host, uri.port)
389
- https.use_ssl = !url.match(/^https/).nil?
390
-
391
- puts [green('-> '), 'Pinging Codecov'].join(' ')
392
- puts "#{url}#{uri.path}?#{query_without_token}"
393
-
394
- req = Net::HTTP::Post.new(
395
- "#{uri.path}?#{query}",
396
- {
397
- 'X-Reduced-Redundancy' => 'false',
398
- 'X-Content-Encoding' => 'application/x-gzip',
399
- 'Content-Type' => 'text/plain'
400
- }
401
- )
402
- response = retry_request(req, https)
403
- if !response&.code || response.code == '400'
404
- puts red(response&.body)
405
- return false
406
- end
407
-
408
- reports_url = response.body.lines[0]
409
- s3target = response.body.lines[1]
410
- puts [green('-> '), 'Uploading to'].join(' ')
411
- puts s3target
412
-
413
- uri = URI(s3target)
414
- https = Net::HTTP.new(uri.host, uri.port)
415
- https.use_ssl = true
416
- req = Net::HTTP::Put.new(
417
- s3target,
418
- {
419
- 'Content-Encoding' => 'gzip',
420
- 'Content-Type' => 'text/plain'
421
- }
422
- )
423
- req.body = report
424
- res = retry_request(req, https)
425
- if res&.body == ''
426
- {
427
- 'uploaded' => true,
428
- 'url' => reports_url,
429
- 'meta' => {
430
- 'status' => res.code
431
- },
432
- 'message' => 'Coverage reports upload successfully'
433
- }.to_json
434
- else
435
- puts [black('-> '), 'Could not upload reports via v4 API, defaulting to v2'].join(' ')
436
- puts red(res&.body || 'nil')
437
- nil
438
- end
439
- end
440
-
441
- def upload_to_v2(url, report, query, query_without_token)
442
- uri = URI.parse(url.chomp('/') + '/upload/v2')
443
- https = Net::HTTP.new(uri.host, uri.port)
444
- https.use_ssl = !url.match(/^https/).nil?
445
-
446
- puts [green('-> '), 'Uploading to Codecov'].join(' ')
447
- puts "#{url}#{uri.path}?#{query_without_token}"
448
-
449
- req = Net::HTTP::Post.new(
450
- "#{uri.path}?#{query}",
451
- {
452
- 'Accept' => 'application/json',
453
- 'Content-Encoding' => 'gzip',
454
- 'Content-Type' => 'text/plain',
455
- 'X-Content-Encoding' => 'gzip'
456
- }
457
- )
458
- req.body = report
459
- res = retry_request(req, https)
460
- res&.body
461
- end
462
-
463
- def handle_report_response(report)
464
- if report['result']['uploaded']
465
- puts " View reports at #{report['result']['url']}"
466
- else
467
- puts red(' X> Failed to upload coverage reports')
468
- end
469
- end
470
-
471
13
  def format(result, disable_net_blockers = true)
472
- net_blockers(:off) if disable_net_blockers
473
-
474
- display_header
475
- ci = detect_ci
476
- report = create_report(result)
477
- response = upload_to_codecov(ci, report)
478
- if response == false
479
- report['result'] = { 'uploaded' => false }
480
- return report
481
- end
482
-
483
- report['result'] = JSON.parse(response)
484
- handle_report_response(report)
485
-
486
- net_blockers(:on) if disable_net_blockers
487
- report
488
- end
489
-
490
- private
491
-
492
- # Format SimpleCov coverage data for the Codecov.io API.
493
- #
494
- # @param result [SimpleCov::Result] The coverage data to process.
495
- # @return [Hash]
496
- def result_to_codecov(result)
497
- {
498
- 'codecov' => result_to_codecov_report(result),
499
- 'coverage' => result_to_codecov_coverage(result),
500
- 'messages' => result_to_codecov_messages(result)
501
- }
502
- end
503
-
504
- def result_to_codecov_report(result)
505
- report = file_network.join("\n").concat("\n")
506
- report = report.concat({ 'coverage' => result_to_codecov_coverage(result) }.to_json)
507
- report
508
- end
509
-
510
- def file_network
511
- invalid_file_types = [
512
- 'woff', 'eot', 'otf', # fonts
513
- 'gif', 'png', 'jpg', 'jpeg', 'psd', # images
514
- 'ptt', 'pptx', 'numbers', 'pages', 'md', 'txt', 'xlsx', 'docx', 'doc', 'pdf', 'csv', # docs
515
- 'yml', 'yaml', '.gitignore'
516
- ].freeze
517
-
518
- invalid_directories = [
519
- 'node_modules/',
520
- 'public/',
521
- 'storage/',
522
- 'tmp/',
523
- 'vendor/'
524
- ]
525
-
526
- puts [green('==>'), 'Appending file network'].join(' ')
527
- network = []
528
- Dir['**/*'].keep_if do |file|
529
- if File.file?(file) && !file.end_with?(*invalid_file_types) && invalid_directories.none? { |dir| file.include?(dir) }
530
- network.push(file)
531
- end
532
- end
533
-
534
- network.push('<<<<<< network')
535
- network
536
- end
537
-
538
- # Format SimpleCov coverage data for the Codecov.io coverage API.
539
- #
540
- # @param result [SimpleCov::Result] The coverage data to process.
541
- # @return [Hash<String, Array>]
542
- def result_to_codecov_coverage(result)
543
- result.files.each_with_object({}) do |file, memo|
544
- memo[shortened_filename(file)] = file_to_codecov(file)
545
- end
546
- end
547
-
548
- # Format SimpleCov coverage data for the Codecov.io messages API.
549
- #
550
- # @param result [SimpleCov::Result] The coverage data to process.
551
- # @return [Hash<String, Hash>]
552
- def result_to_codecov_messages(result)
553
- result.files.each_with_object({}) do |file, memo|
554
- memo[shortened_filename(file)] = file.lines.each_with_object({}) do |line, lines_memo|
555
- lines_memo[line.line_number.to_s] = 'skipped' if line.skipped?
556
- end
557
- end
558
- end
559
-
560
- # Format coverage data for a single file for the Codecov.io API.
561
- #
562
- # @param file [SimpleCov::SourceFile] The file to process.
563
- # @return [Array<nil, Integer>]
564
- def file_to_codecov(file)
565
- # Initial nil is required to offset line numbers.
566
- [nil] + file.lines.map do |line|
567
- if line.skipped?
568
- nil
569
- else
570
- line.coverage
571
- end
572
- end
573
- end
574
-
575
- # Get a filename relative to the project root. Based on
576
- # https://github.com/colszowka/simplecov-html, copyright Christoph Olszowka.
577
- #
578
- # @param file [SimeplCov::SourceFile] The file to use.
579
- # @return [String]
580
- def shortened_filename(file)
581
- file.filename.gsub(/^#{SimpleCov.root}/, '.').gsub(%r{^\./}, '')
582
- end
583
-
584
- # Toggle VCR and WebMock on or off
585
- #
586
- # @param switch Toggle switch for Net Blockers.
587
- # @return [Boolean]
588
- def net_blockers(switch)
589
- throw 'Only :on or :off' unless %i[on off].include? switch
590
-
591
- if defined?(VCR)
592
- case switch
593
- when :on
594
- VCR.turn_on!
595
- when :off
596
- VCR.turn_off!(ignore_cassettes: true)
597
- end
598
- end
599
-
600
- if defined?(WebMock)
601
- # WebMock on by default
602
- # VCR depends on WebMock 1.8.11; no method to check whether enabled.
603
- case switch
604
- when :on
605
- WebMock.enable!
606
- when :off
607
- WebMock.disable!
608
- end
609
- end
610
-
611
- true
612
- end
613
-
614
- # Convenience color methods
615
- def black(str)
616
- str.nil? ? '' : "\e[30m#{str}\e[0m"
617
- end
618
-
619
- def red(str)
620
- str.nil? ? '' : "\e[31m#{str}\e[0m"
621
- end
622
-
623
- def green(str)
624
- str.nil? ? '' : "\e[32m#{str}\e[0m"
14
+ report = Codecov::SimpleCov::Formatter.new.format(result)
15
+ Codecov::Uploader.upload(report, disable_net_blockers)
625
16
  end
626
17
  end