ndr_dev_support 4.2.0 → 4.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +66 -0
- data/code_safety.yml +6 -6
- data/lib/ndr_dev_support/daemon/ci_server.rb +20 -8
- data/lib/ndr_dev_support/version.rb +1 -1
- data/lib/tasks/ci/minitest.rake +0 -1
- data/lib/tasks/ci/redmine.rake +2 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07b63ea8d81ee459134b9050fe9de402b50f79b0ad32139d73d90e6e26b7053c
|
4
|
+
data.tar.gz: 3479a5ccbd481bae7528036b8ba0cf20aba3676c99ca0f4c4b68f20920df35d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: feee00d50b38a0e07f7f2817b580d9236b177a85ff949f18662e5dcd90488b8a85b8d3851655a922356f35f8e78f0fcab0aeea0a9d9a8c99c9cc89c7d2b71e51
|
7
|
+
data.tar.gz: 1f12d9c909139011e27e6c185289d97189d63c7bf8949e09b49767aeee3edef302f33385528a8a301775361799308fcc73d7d7b0193015d493b5b2eae2dde40c
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
*no unreleased changes*
|
3
3
|
|
4
|
+
## 4.2.1 / 2018-12-18
|
5
|
+
### Fixed
|
6
|
+
* ci_server: improve logging and error handling (#44)
|
7
|
+
|
4
8
|
## 4.2.0 / 2018-11-28
|
5
9
|
### Added
|
6
10
|
* Improve `Stoppable` integration within a Rails project, adding configurable logger.
|
data/README.md
CHANGED
@@ -7,6 +7,7 @@ providing:
|
|
7
7
|
2. rake tasks to limit Rubocop's output to changed (and related) code
|
8
8
|
3. integration testing support, which can be required from a project's `test_helper.rb`
|
9
9
|
4. Deployment support, through Capistrano.
|
10
|
+
5. a rake task based Continuous Integration (CI) server.
|
10
11
|
|
11
12
|
## Installation
|
12
13
|
|
@@ -140,6 +141,71 @@ require 'ndr_dev_support/capistrano/ndr_model'
|
|
140
141
|
|
141
142
|
This will pull in the majority of behaviour needed to deploy in our preferred style.
|
142
143
|
|
144
|
+
## Rake CI server
|
145
|
+
|
146
|
+
ndr_dev_support provides a rake based continuous integration server that runs on a `git` or `git svn` working copy of your application.
|
147
|
+
It polls for changes to the respository and, unlike some CI servers, it checks out and tests every commit; enabling full and comparative analysis of code quality and other statistical trends.
|
148
|
+
|
149
|
+
Out of the box it does nothing, but does provide a number of rake tasks that you can opt to use.
|
150
|
+
Those rake tasks utilise the concepts of metrics and attachments (messages) and tasks tend to either generate them or publish them.
|
151
|
+
|
152
|
+
NOTE: As the way tests are run across applications differs, the `:default` rake task must be able to run your full suite of tests.
|
153
|
+
|
154
|
+
CI rake tasks have been written for:
|
155
|
+
|
156
|
+
* `ci:brakeman` - [brakeman](https://brakemanscanner.org/) vulnerability scanner metrics are generated for warning counts and "danger" messages for new warnings and "good" messages for fixed warnings.
|
157
|
+
* `ci:bundle_audit` - generates "danger" messages for high criticality [bundle audit](https://github.com/rubysec/bundler-audit) advisories and "warning" messages for all others.
|
158
|
+
* `ci:commit_cop` - Runs a number of commit "Cops" which create messages when common commit mistakes occur. Current cops look for a Rails migration added without a structure dump file, modified Rails migrations and renamed Rails migrations.
|
159
|
+
* `ci:dependencies:process` - generates a line of pipe delimited markup showing system dependencies (that could be used in a wiki page on Redmine)
|
160
|
+
* `ci:housekeep` - runs `rake log:clear` and `rake tmp:clear` if defined
|
161
|
+
* `ci:linguist` - generates project programming language metrics for languages over 1% of codebase.
|
162
|
+
* `ci:minitest` - sets up Minitest and SimpleCov to capture metrics and messages and runs the `default` rake task and `ci:simplecov:process` before running `ci:redmine:update_tickets` if all tests pass.
|
163
|
+
* `ci:notes` - runs the Rails `rake notes` task (if using Rails) and converts annotation counts into metrics.
|
164
|
+
* `ci:prometheus:publish` - sends all metrics to specified [Prometheus](https://prometheus.io/) push gateway.
|
165
|
+
* `ci:redmine:update_tickets` - if all tests pass, this will parse the commit message and resolve associated [Redmine](https://www.redmine.org/) tickets.
|
166
|
+
* `ci:rugged:commit_details` - if there are messages, then it prepends message list with commit details.
|
167
|
+
* `ci:simplecov:process` - generates metrics for [SimpleCov](https://github.com/colszowka/simplecov) measured test covered lines, test coverage percentage and total lines of code.
|
168
|
+
* `ci:slack:publish` - sends all messages to specified [Slack](https://slack.com/) channel.
|
169
|
+
* `ci:stats` - runs the Rails `rake stats` task (if using Rails) and converts counts into metrics
|
170
|
+
|
171
|
+
To start the server, `cd` to the working copy and execute:
|
172
|
+
|
173
|
+
$ rake ci:server
|
174
|
+
|
175
|
+
Configuration is managed within your application by implementing the `ci:all` rake task. When a new commit is detected, it checks it out and runs `rake ci:all`.
|
176
|
+
|
177
|
+
An example Rails application rake task might look like:
|
178
|
+
|
179
|
+
```ruby
|
180
|
+
namespace :ci do
|
181
|
+
desc 'Setup CI stack, integrations, etc up front'
|
182
|
+
task setup: [
|
183
|
+
'ci:rugged:setup',
|
184
|
+
'ci:slack:setup',
|
185
|
+
'ci:prometheus:setup'
|
186
|
+
]
|
187
|
+
|
188
|
+
desc 'all'
|
189
|
+
task all: [
|
190
|
+
# Setup
|
191
|
+
'ci:setup',
|
192
|
+
'ci:housekeep',
|
193
|
+
'db:migrate',
|
194
|
+
# Test and Analyse
|
195
|
+
'ci:minitest',
|
196
|
+
'ci:brakeman',
|
197
|
+
'ci:bundle_audit',
|
198
|
+
'ci:linguist',
|
199
|
+
'ci:notes',
|
200
|
+
'ci:stats',
|
201
|
+
# Report
|
202
|
+
'ci:publish'
|
203
|
+
]
|
204
|
+
end
|
205
|
+
```
|
206
|
+
|
207
|
+
NOTE: Defining the `ci:setup` rake tasks up front is not necessary, but will prompt for missing server credentials at the start of the first CI run.
|
208
|
+
|
143
209
|
## Development
|
144
210
|
|
145
211
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/code_safety.yml
CHANGED
@@ -19,7 +19,7 @@ file safety:
|
|
19
19
|
CHANGELOG.md:
|
20
20
|
comments:
|
21
21
|
reviewed_by: josh.pencheon
|
22
|
-
safe_revision:
|
22
|
+
safe_revision: a73717bdeb9f48c257aec4fa41a19735e99555c8
|
23
23
|
CODE_OF_CONDUCT.md:
|
24
24
|
comments:
|
25
25
|
reviewed_by: timgentry
|
@@ -35,7 +35,7 @@ file safety:
|
|
35
35
|
README.md:
|
36
36
|
comments:
|
37
37
|
reviewed_by: josh.pencheon
|
38
|
-
safe_revision:
|
38
|
+
safe_revision: dd220d1cd30d878bf8a35495efe474f08c5c0971
|
39
39
|
Rakefile:
|
40
40
|
comments:
|
41
41
|
reviewed_by: josh.pencheon
|
@@ -95,7 +95,7 @@ file safety:
|
|
95
95
|
lib/ndr_dev_support/daemon/ci_server.rb:
|
96
96
|
comments:
|
97
97
|
reviewed_by: josh.pencheon
|
98
|
-
safe_revision:
|
98
|
+
safe_revision: 0677afc93b0a64d56383e80fa1247e5be64bfb24
|
99
99
|
lib/ndr_dev_support/daemon/stoppable.rb:
|
100
100
|
comments:
|
101
101
|
reviewed_by: josh.pencheon
|
@@ -191,7 +191,7 @@ file safety:
|
|
191
191
|
lib/ndr_dev_support/version.rb:
|
192
192
|
comments:
|
193
193
|
reviewed_by: josh.pencheon
|
194
|
-
safe_revision:
|
194
|
+
safe_revision: a73717bdeb9f48c257aec4fa41a19735e99555c8
|
195
195
|
lib/tasks/audit_code.rake:
|
196
196
|
comments: Identical to the version reviewed by josh.pencheon when contained within
|
197
197
|
ndr_support
|
@@ -224,7 +224,7 @@ file safety:
|
|
224
224
|
lib/tasks/ci/minitest.rake:
|
225
225
|
comments:
|
226
226
|
reviewed_by: josh.pencheon
|
227
|
-
safe_revision:
|
227
|
+
safe_revision: 0677afc93b0a64d56383e80fa1247e5be64bfb24
|
228
228
|
lib/tasks/ci/notes.rake:
|
229
229
|
comments:
|
230
230
|
reviewed_by: timgentry
|
@@ -236,7 +236,7 @@ file safety:
|
|
236
236
|
lib/tasks/ci/redmine.rake:
|
237
237
|
comments:
|
238
238
|
reviewed_by: josh.pencheon
|
239
|
-
safe_revision:
|
239
|
+
safe_revision: ba171e9460b57d2d9932f6c0c0bdc3a5b282af80
|
240
240
|
lib/tasks/ci/rugged.rake:
|
241
241
|
comments:
|
242
242
|
reviewed_by: timgentry
|
@@ -44,39 +44,49 @@ module NdrDevSupport
|
|
44
44
|
private
|
45
45
|
|
46
46
|
def run_once
|
47
|
+
log('running once...')
|
48
|
+
|
47
49
|
git_fetch
|
48
50
|
git_checkout(MASTER_BRANCH_NAME)
|
49
51
|
|
50
52
|
objectids_between_master_and_remote.each do |oid|
|
53
|
+
log("testing #{oid}...")
|
51
54
|
git_rebase(oid)
|
52
55
|
|
53
56
|
WithCleanRbenv.with_clean_rbenv do
|
54
57
|
# TODO: rbenv_install
|
55
58
|
bundle_install
|
56
|
-
|
59
|
+
system('rbenv exec bundle exec rake ci:all')
|
57
60
|
git_discard_changes
|
58
61
|
end
|
59
62
|
end
|
63
|
+
|
64
|
+
log('completed single run.')
|
65
|
+
rescue => exception
|
66
|
+
log(<<~MSG)
|
67
|
+
Unhandled exception! #{exception.class}: #{exception.message}
|
68
|
+
#{(exception.backtrace || []).join("\n")}
|
69
|
+
MSG
|
70
|
+
|
71
|
+
raise exception
|
60
72
|
end
|
61
73
|
|
62
74
|
def git_fetch
|
63
|
-
svn_remote? ?
|
75
|
+
system(svn_remote? ? 'git svn fetch' : 'git fetch')
|
64
76
|
end
|
65
77
|
|
66
78
|
def git_checkout(oid)
|
67
79
|
Open3.popen3('git', 'checkout', oid) do |_stdin, _stdout, stderr, wait_thr|
|
68
80
|
msg = stderr.read.strip
|
69
|
-
|
70
|
-
# has been resolved, use logging instead of puts
|
71
|
-
puts msg unless msg == "Already on '#{oid}'"
|
81
|
+
log(msg) unless msg == "Already on '#{oid}'"
|
72
82
|
|
73
83
|
process_status = wait_thr.value
|
74
|
-
raise
|
84
|
+
raise msg unless process_status.exited?
|
75
85
|
end
|
76
86
|
end
|
77
87
|
|
78
88
|
def git_rebase(oid)
|
79
|
-
|
89
|
+
system("git rebase #{Shellwords.escape(oid)}") || raise('Unable to rebase!')
|
80
90
|
end
|
81
91
|
|
82
92
|
def git_discard_changes
|
@@ -122,7 +132,7 @@ module NdrDevSupport
|
|
122
132
|
return unless File.file?('Gemfile')
|
123
133
|
return if system('bundle check')
|
124
134
|
|
125
|
-
|
135
|
+
system('rbenv exec bundle install --local --jobs=3')
|
126
136
|
return if $CHILD_STATUS.exitstatus.zero? || ENV['SLACK_WEBHOOK_URL'].nil?
|
127
137
|
|
128
138
|
slack_publisher = NdrDevSupport::SlackMessagePublisher.new(ENV['SLACK_WEBHOOK_URL'],
|
@@ -138,6 +148,8 @@ module NdrDevSupport
|
|
138
148
|
}
|
139
149
|
|
140
150
|
slack_publisher.post(attachments: [attachment])
|
151
|
+
|
152
|
+
raise 'Failure running `bundle install --local`'
|
141
153
|
end
|
142
154
|
end
|
143
155
|
end
|
data/lib/tasks/ci/minitest.rake
CHANGED
data/lib/tasks/ci/redmine.rake
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ndr_dev_support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.2.
|
4
|
+
version: 4.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NCRS Development Team
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|