newrelic_rpm 6.13.1 → 7.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +247 -0
  4. data/CONTRIBUTING.md +13 -2
  5. data/README.md +2 -2
  6. data/lib/new_relic/agent.rb +6 -8
  7. data/lib/new_relic/agent/agent.rb +4 -5
  8. data/lib/new_relic/agent/audit_logger.rb +10 -0
  9. data/lib/new_relic/agent/autostart.rb +1 -2
  10. data/lib/new_relic/agent/configuration/default_source.rb +462 -221
  11. data/lib/new_relic/agent/configuration/manager.rb +3 -3
  12. data/lib/new_relic/agent/connect/request_builder.rb +4 -2
  13. data/lib/new_relic/agent/database_adapter.rb +33 -0
  14. data/lib/new_relic/agent/datastores/redis.rb +0 -4
  15. data/lib/new_relic/agent/distributed_tracing.rb +0 -66
  16. data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +2 -2
  17. data/lib/new_relic/agent/error_collector.rb +52 -37
  18. data/lib/new_relic/agent/error_filter.rb +167 -0
  19. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +4 -5
  20. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +21 -68
  21. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +0 -16
  22. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +23 -57
  23. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +1 -3
  24. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -15
  25. data/lib/new_relic/agent/instrumentation/bunny.rb +10 -196
  26. data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
  27. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +152 -0
  28. data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
  29. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +1 -0
  30. data/lib/new_relic/agent/instrumentation/curb.rb +9 -259
  31. data/lib/new_relic/agent/instrumentation/curb/chain.rb +93 -0
  32. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +222 -0
  33. data/lib/new_relic/agent/instrumentation/curb/prepend.rb +63 -0
  34. data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +38 -0
  35. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +53 -0
  36. data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +34 -0
  37. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +8 -84
  38. data/lib/new_relic/agent/instrumentation/excon.rb +2 -1
  39. data/lib/new_relic/agent/instrumentation/grape.rb +13 -113
  40. data/lib/new_relic/agent/instrumentation/grape/chain.rb +25 -0
  41. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
  42. data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
  43. data/lib/new_relic/agent/instrumentation/httpclient.rb +8 -30
  44. data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +25 -0
  45. data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +38 -0
  46. data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +17 -0
  47. data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
  48. data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
  49. data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
  50. data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
  51. data/lib/new_relic/agent/instrumentation/memcache.rb +54 -69
  52. data/lib/new_relic/agent/instrumentation/memcache/chain.rb +16 -0
  53. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +38 -121
  54. data/lib/new_relic/agent/instrumentation/memcache/helper.rb +56 -0
  55. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +88 -0
  56. data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +88 -0
  57. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +4 -10
  58. data/lib/new_relic/agent/instrumentation/mongo.rb +7 -0
  59. data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
  60. data/lib/new_relic/agent/instrumentation/net_http/chain.rb +25 -0
  61. data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +40 -0
  62. data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
  63. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +1 -1
  64. data/lib/new_relic/agent/instrumentation/padrino.rb +18 -75
  65. data/lib/new_relic/agent/instrumentation/padrino/chain.rb +34 -0
  66. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +27 -0
  67. data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
  68. data/lib/new_relic/agent/instrumentation/rack.rb +29 -160
  69. data/lib/new_relic/agent/instrumentation/rack/chain.rb +58 -0
  70. data/lib/new_relic/agent/instrumentation/rack/helpers.rb +32 -0
  71. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +73 -0
  72. data/lib/new_relic/agent/instrumentation/rack/prepend.rb +37 -0
  73. data/lib/new_relic/agent/instrumentation/rake.rb +13 -188
  74. data/lib/new_relic/agent/instrumentation/rake/chain.rb +25 -0
  75. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +144 -0
  76. data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
  77. data/lib/new_relic/agent/instrumentation/redis.rb +12 -186
  78. data/lib/new_relic/agent/instrumentation/redis/chain.rb +34 -0
  79. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +65 -0
  80. data/lib/new_relic/agent/instrumentation/redis/prepend.rb +24 -0
  81. data/lib/new_relic/agent/instrumentation/resque.rb +21 -32
  82. data/lib/new_relic/agent/instrumentation/resque/chain.rb +22 -0
  83. data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
  84. data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +35 -0
  85. data/lib/new_relic/agent/instrumentation/resque/prepend.rb +16 -0
  86. data/lib/new_relic/agent/instrumentation/sidekiq.rb +1 -1
  87. data/lib/new_relic/agent/instrumentation/sinatra.rb +20 -198
  88. data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
  89. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +29 -34
  90. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +124 -0
  91. data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
  92. data/lib/new_relic/agent/instrumentation/typhoeus.rb +10 -89
  93. data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
  94. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +82 -0
  95. data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
  96. data/lib/new_relic/agent/javascript_instrumentor.rb +12 -7
  97. data/lib/new_relic/agent/method_tracer.rb +6 -16
  98. data/lib/new_relic/agent/new_relic_service.rb +16 -13
  99. data/lib/new_relic/agent/samplers/memory_sampler.rb +1 -1
  100. data/lib/new_relic/agent/span_event_primitive.rb +10 -8
  101. data/lib/new_relic/agent/sql_sampler.rb +3 -3
  102. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +1 -1
  103. data/lib/new_relic/agent/transaction.rb +1 -4
  104. data/lib/new_relic/agent/transaction/abstract_segment.rb +1 -1
  105. data/lib/new_relic/agent/transaction/distributed_tracer.rb +12 -6
  106. data/lib/new_relic/agent/transaction/message_broker_segment.rb +1 -0
  107. data/lib/new_relic/agent/vm/mri_vm.rb +6 -4
  108. data/lib/new_relic/cli/commands/deployments.rb +0 -1
  109. data/lib/new_relic/constants.rb +4 -0
  110. data/lib/new_relic/control/frameworks/rails.rb +11 -9
  111. data/lib/new_relic/control/instance_methods.rb +1 -0
  112. data/lib/new_relic/dependency_detection.rb +119 -9
  113. data/lib/new_relic/environment_report.rb +1 -7
  114. data/lib/new_relic/noticed_error.rb +4 -8
  115. data/lib/new_relic/supportability_helper.rb +3 -2
  116. data/lib/new_relic/version.rb +3 -3
  117. data/lib/tasks/config.html.erb +14 -25
  118. data/lib/tasks/config.rake +8 -7
  119. data/newrelic_rpm.gemspec +2 -2
  120. data/test/agent_helper.rb +1 -0
  121. metadata +56 -32
  122. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
  123. data/.github/ISSUE_TEMPLATE/config.yml +0 -5
  124. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -24
  125. data/.github/actions/annotate/README.md +0 -79
  126. data/.github/actions/annotate/action.yml +0 -6
  127. data/.github/actions/annotate/dist/index.js +0 -433
  128. data/.github/actions/annotate/index.js +0 -25
  129. data/.github/actions/annotate/package-lock.json +0 -172
  130. data/.github/actions/annotate/package.json +0 -30
  131. data/.github/actions/annotate/pre-commit +0 -5
  132. data/.github/actions/build-ruby/README.md +0 -79
  133. data/.github/actions/build-ruby/action.yml +0 -15
  134. data/.github/actions/build-ruby/dist/index.js +0 -52683
  135. data/.github/actions/build-ruby/index.js +0 -514
  136. data/.github/actions/build-ruby/package-lock.json +0 -581
  137. data/.github/actions/build-ruby/package.json +0 -32
  138. data/.github/actions/build-ruby/pre-commit +0 -5
  139. data/.github/pull_request_template.md +0 -16
  140. data/.github/workflows/ci.yml +0 -212
  141. data/.github/workflows/pr_review_checklist.yml +0 -22
  142. data/.github/workflows/release.yml +0 -78
  143. data/.github/workflows/scripts/rubygems-authenticate.py +0 -13
  144. data/.github/workflows/scripts/rubygems-publish.rb +0 -32
  145. data/.github/workflows/snyk.yml +0 -27
  146. data/.github/workflows/stale.yml +0 -21
  147. data/cert/cacert.pem +0 -1177
  148. data/lib/new_relic/agent/instrumentation/http.rb +0 -49
  149. data/lib/new_relic/agent/instrumentation/net.rb +0 -87
@@ -1,514 +0,0 @@
1
- //
2
- // NOTE: This action script is Ubuntu specific!
3
- //
4
-
5
- const os = require('os')
6
- const fs = require('fs')
7
- const path = require('path')
8
- const crypto = require('crypto')
9
-
10
- const core = require('@actions/core')
11
- const exec = require('@actions/exec')
12
- const cache = require('@actions/cache')
13
- const io = require('@actions/io')
14
-
15
- let aptUpdated = false; // only `sudo apt-get update` once!
16
-
17
-
18
- // removes trailing newlines and linefeeds from the given text string
19
- function chomp(text) {
20
- return text.replace(/(\n|\r)+$/, '')
21
- }
22
-
23
- // invokes the @actions/exec exec function with listeners to capture the
24
- // output stream as the return result.
25
- async function execute(command) {
26
- try {
27
- let outputStr = ''
28
-
29
- const options = {}
30
- options.listeners = {
31
- stdout: (data) => { outputStr += data.toString() },
32
- stderr: (data) => { core.error(data.toString()) }
33
- }
34
-
35
- await exec.exec(command, [], options)
36
-
37
- return chomp(outputStr);
38
-
39
- } catch (error) {
40
- console.error(error.toString())
41
- }
42
- }
43
-
44
- // given one or more space-separated (not comma-delimited) dependency
45
- // names, invokes the package manager to install them.
46
- async function installDependencies(kind, dependencyList) {
47
- if (dependencyList === '') { return }
48
- core.startGroup(`Installing ${kind} dependencies`)
49
-
50
- core.info(`installing ${kind} dependencies ${dependencyList}`)
51
-
52
- // only update package list once per workflow invocation.
53
- if (!aptUpdated) {
54
- await exec.exec(`sudo apt-get update`)
55
- aptUpdated = true
56
- }
57
- await exec.exec(`sudo apt-get install -y --no-install-recommends ${dependencyList}`)
58
-
59
- core.endGroup()
60
- }
61
-
62
- // installs system dependencies needed to successfully build the ruby executables
63
- async function installBuildDependencies() {
64
- const dependencyList = 'libyaml-dev libgdbm-dev libreadline-dev libncurses5-dev zlib1g-dev libffi-dev'
65
-
66
- await installDependencies('ruby-build', dependencyList);
67
- }
68
-
69
- // Returns if Ruby version is <= 2.3
70
- function usesOldOpenSsl(rubyVersion) {
71
- return rubyVersion.match(/^2\.[0123]/);
72
- }
73
-
74
- // ruby-build is used to compile Ruby and it's various executables
75
- // rbenv's ruby-build doesn't fully support EOL rubies (< 2.4 at time of this writing).
76
- // setup-ruby also doesn't correctly build the older rubies with openssl support.
77
- // long story short, openssl library for these older ruby need to be 1.0 variant.
78
- async function installRubyBuild(rubyVersion) {
79
- core.startGroup(`Installing ruby-build`)
80
-
81
- const buildDir = `${process.env.HOME}/ruby-build`
82
- var repoPath
83
-
84
- // Rubies 2.0 ... 2.3 (these need OpenSSL 1.0 and eregon provides it for us)
85
- if (usesOldOpenSsl(rubyVersion)) {
86
- core.info('cloning eregon/ruby-build')
87
- repoPath = '--branch ruby23-openssl-linux https://github.com/eregon/ruby-build.git'
88
-
89
- // all the other Rubies
90
- } else {
91
- core.info('cloning rbenv/ruby-build')
92
- repoPath = 'https://github.com/rbenv/ruby-build.git'
93
- }
94
-
95
- await exec.exec(`git clone ${repoPath} ${buildDir}`)
96
- await exec.exec(`sudo ${buildDir}/install.sh`)
97
-
98
- core.endGroup()
99
- }
100
-
101
- // Add the environment variables needed to correctly build ruby and later run ruby tests.
102
- // this function is invoked even if ruby is cached and compile step is skipped.
103
- async function setupRubyEnvironment(rubyVersion) {
104
-
105
- // LANG environment must be set or Ruby will default external_encoding to US-ASCII i
106
- // instead of UTF-8 and this will fail many tests.
107
- core.exportVariable('LANG', 'C.UTF-8')
108
-
109
- // https://github.com/actions/virtual-environments/issues/267
110
- core.exportVariable('CPPFLAGS', '-DENABLE_PATH_CHECK=0')
111
-
112
- // Ensures Bundler retries failed attempts before giving up
113
- core.exportVariable('BUNDLE_RETRY', 1)
114
-
115
- // Number of jobs in parallel
116
- core.exportVariable('BUNDLE_JOBS', 4)
117
-
118
- // Where to keep the gem files
119
- core.exportVariable('BUNDLE_PATH', gemspecFilePath(rubyVersion))
120
-
121
- // enable-shared prevents native extension gems from breaking if they're cached
122
- // independently of the ruby binaries
123
- core.exportVariable('RUBY_CONFIGURE_OPTS', '--enable-shared --disable-install-doc')
124
-
125
- // many multiverse suite tests end up in resource contention when run in parallel
126
- core.exportVariable('SERIALIZE', 1)
127
- }
128
-
129
- // Sets up any options at the bundler level so that when gems that
130
- // need specific settings are installed, their specific flags are relayed.
131
- async function configureBundleOptions(rubyVersion) {
132
- if (!usesOldOpenSsl(rubyVersion)) { return }
133
-
134
- const openSslPath = rubyOpenSslPath(rubyVersion);
135
-
136
- // https://stackoverflow.com/questions/30834421/error-when-trying-to-install-app-with-mysql2-gem
137
- await exec.exec('bundle', [
138
- 'config', '--global', 'build.mysql2',
139
- `"--with-ldflags=-L${openSslPath}/lib"`,
140
- `"--with-cppflags=-I${openSslPath}/include"`
141
- ]);
142
- }
143
-
144
- // prepends the given value to the environment variable
145
- function prependEnv(envName, envValue, divider=' ') {
146
- let existingValue = process.env[envName];
147
- if (existingValue) {
148
- envValue += `${divider}${existingValue}`
149
- }
150
- core.exportVariable(envName, envValue);
151
- }
152
-
153
- // The older Rubies also need older MySQL that was built against the older OpenSSL libraries.
154
- // Otherwise mysql adapter will segfault in Ruby because it attempts to dynamically link
155
- // to the 1.1 series while Ruby links against the 1.0 series.
156
- async function downgradeMySQL() {
157
- core.startGroup(`Downgrade MySQL`)
158
-
159
- const pkgDir = `${process.env.HOME}/packages`
160
- const pkgOption = `--directory-prefix=${pkgDir}/`
161
- const mirrorUrl = 'https://mirrors.mediatemple.net/debian-security/pool/updates/main/m/mysql-5.5'
162
-
163
- // executes the following all in parallel
164
- const promise1 = exec.exec('sudo', ['apt-get', 'remove', 'mysql-client'])
165
- const promise2 = exec.exec('wget', [pkgOption, `${mirrorUrl}/libmysqlclient18_5.5.62-0%2Bdeb8u1_amd64.deb`])
166
- const promise3 = exec.exec('wget', [pkgOption, `${mirrorUrl}/libmysqlclient-dev_5.5.62-0%2Bdeb8u1_amd64.deb`])
167
-
168
- // wait for the parallel processes to finish
169
- await Promise.all([promise1, promise2, promise3])
170
-
171
- // executes serially
172
- await exec.exec('sudo', ['dpkg', '-i', `${pkgDir}/libmysqlclient18_5.5.62-0+deb8u1_amd64.deb`])
173
- await exec.exec('sudo', ['dpkg', '-i', `${pkgDir}/libmysqlclient-dev_5.5.62-0+deb8u1_amd64.deb`])
174
-
175
- core.endGroup()
176
- }
177
-
178
- // mySQL (and others) must be downgraded for EOL rubies for native extension
179
- // gems to install correctly and against the right openSSL libraries.
180
- async function downgradeSystemPackages(rubyVersion) {
181
- if (!usesOldOpenSsl(rubyVersion)) { return }
182
-
183
- await downgradeMySQL();
184
- }
185
-
186
- // any settings needed in all Ruby environments from EOL'd rubies to current
187
- async function setupAllRubyEnvironments() {
188
- // core.startGroup("Setup for all Ruby Environments")
189
-
190
- // // No-Op
191
-
192
- // core.endGroup()
193
- }
194
-
195
- // any settings needed specifically for the EOL'd rubies
196
- async function setupOldRubyEnvironments(rubyVersion) {
197
- if (!usesOldOpenSsl(rubyVersion)) { return }
198
-
199
- core.startGroup("Setup for EOL Ruby Environments")
200
-
201
- const openSslPath = rubyOpenSslPath(rubyVersion);
202
-
203
- core.exportVariable('OPENSSL_DIR', openSslPath)
204
-
205
- prependEnv('LDFLAGS', `-L${openSslPath}/lib`)
206
- prependEnv('CPPFLAGS', `-I${openSslPath}/include`)
207
- prependEnv('PKG_CONFIG_PATH', `${openSslPath}/lib/pkgconfig`, ':')
208
-
209
- openSslOption = `--with-openssl-dir=${openSslPath}`
210
- core.exportVariable('CONFIGURE_OPTS', openSslOption)
211
- prependEnv('RUBY_CONFIGURE_OPTS', openSslOption)
212
-
213
- // required for some versions of nokogiri
214
- gemInstall('pkg-config', '~> 1.1.7')
215
-
216
- core.endGroup()
217
- }
218
-
219
- // setup the Ruby environment settings after Ruby has been built
220
- // or restored from cache.
221
- async function setupRubyEnvironmentAfterBuild(rubyVersion) {
222
- await setupAllRubyEnvironments()
223
- await setupOldRubyEnvironments(rubyVersion)
224
- }
225
-
226
- // Shows some version love!
227
- async function showVersions() {
228
- core.startGroup("Show Versions")
229
-
230
- await exec.exec('ruby', ['--version'])
231
- await exec.exec('ruby', ['-ropenssl', '-e', "puts OpenSSL::OPENSSL_LIBRARY_VERSION"])
232
- await exec.exec('gem', ['--version'])
233
- await exec.exec('bundle', ['--version'])
234
- await exec.exec('openssl', ['version'])
235
-
236
- core.endGroup()
237
- }
238
-
239
- // Just one place to define the ruby binaries path and that is here
240
- // NOTE: the cache step in the workflow .yml file must match this path
241
- function rubyPath(rubyVersion) {
242
- return `${process.env.HOME}/.rubies/ruby-${rubyVersion}`
243
- }
244
-
245
- // Returns the path to openSSL that this version of Ruby was compiled with.
246
- // NOTE: throws an error if called for Rubies that are compiled against the system OpenSSL
247
- function rubyOpenSslPath(rubyVersion) {
248
- if (usesOldOpenSsl(rubyVersion)) {
249
- return `${rubyPath(rubyVersion)}/openssl`;
250
- }
251
- else {
252
- throw `custom OpenSSL path not needed for this version of Ruby ${rubyVersion}`;
253
- }
254
- }
255
-
256
- // This "activates" our newly built ruby so it comes first in the path
257
- function addRubyToPath(rubyVersion) {
258
- core.addPath(`${rubyPath(rubyVersion)}/bin`);
259
-
260
- if (usesOldOpenSsl(rubyVersion)) {
261
- core.addPath(`${rubyPath(rubyVersion)}/openssl/bin`);
262
- }
263
- }
264
-
265
- // kicks off the ruby build process.
266
- async function buildRuby(rubyVersion) {
267
- core.startGroup(`Build Ruby ${rubyVersion}`)
268
- await exec.exec(`ruby-build --verbose ${rubyVersion} ${rubyPath(rubyVersion)}`)
269
- core.endGroup()
270
- }
271
-
272
- // Older rubies come with Ruby gems 2.5.x and we need 3.0.6 minimum to
273
- // correctly install Bundler and do anything else within the multiverse test suite
274
- async function upgradeRubyGems(rubyVersion) {
275
- core.startGroup(`Upgrade RubyGems`)
276
-
277
- await execute('gem --version').then(res => { gemVersionStr = res; });
278
-
279
- core.info(`Current RubyGems is "${gemVersionStr}"`)
280
-
281
- if (parseFloat(rubyVersion) < 2.7) {
282
-
283
- if (parseFloat(gemVersionStr) < 3.0) {
284
- core.info(`Ruby < 2.7, upgrading RubyGems from ${gemVersionStr}`)
285
-
286
- await exec.exec('gem', ['update', '--system', '3.0.6', '--force']).then(res => { exitCode = res });
287
- if (exitCode != 0) {
288
- gemInstall('rubygems-update', '<3')
289
- await exec.exec('update_rubygems')
290
- };
291
-
292
- }
293
- else {
294
- core.info(`Ruby < 2.7, but RubyGems already at ${gemVersionStr}`)
295
- }
296
- }
297
-
298
- else {
299
- core.info(`Ruby >= 2.7, keeping RubyGems at ${gemVersionStr}`)
300
- }
301
-
302
- await execute('which gem').then(res => { core.info("which gem: " + res) });
303
- await execute('gem --version').then(res => { core.info("New RubyGems is: " + res) });
304
-
305
- core.endGroup()
306
- }
307
-
308
- // utility function to standardize installing ruby gems.
309
- async function gemInstall(name, version = undefined, binPath = undefined) {
310
- let options = ['install', name, '--no-document']
311
-
312
- if (version) { options.push('-v', version) }
313
- if (binPath) { options.push('--bindir', binPath) }
314
-
315
- await exec.exec('gem', options)
316
- }
317
-
318
- // install Bundler 1.17.3 (or thereabouts)
319
- // Ruby 2.6 is first major Ruby to ship with bundle, but it also ships
320
- // with incompatible 1.17.2 version that must be upgraded to 1.17.3
321
- // for some test environments/suites to function correctly.
322
- async function installBundler(rubyVersion) {
323
- core.startGroup(`Install bundler`)
324
-
325
- const rubyBinPath = `${rubyPath(rubyVersion)}/bin`
326
-
327
- if (!fs.existsSync(`${rubyBinPath}/bundle`)) {
328
- await gemInstall('bundler', '~> 1.17.3', rubyBinPath)
329
- }
330
- else {
331
- await execute('bundle --version').then(res => { bundleVersionStr = res; });
332
- if (bundleVersionStr.match(/1\.17\.2/)) {
333
- core.info(`found bundle ${bundleVersionStr}. Upgrading to 1.17.3`)
334
- await gemInstall('bundler', '~> 1.17.3', rubyBinPath)
335
- }
336
- }
337
-
338
- core.endGroup()
339
- }
340
-
341
- function rubyCachePaths(rubyVersion) {
342
- return [ `${process.env.HOME}/.rubies/ruby-${rubyVersion}` ]
343
- }
344
-
345
- function rubyCacheKey(rubyVersion) {
346
- return `v8-ruby-cache-${rubyVersion}`
347
- }
348
-
349
- // will attempt to restore the previously built Ruby environment if one exists.
350
- async function restoreRubyFromCache(rubyVersion) {
351
- core.startGroup(`Restore Ruby from Cache`)
352
-
353
- const key = rubyCacheKey(rubyVersion)
354
- await cache.restoreCache(rubyCachePaths(rubyVersion), key, [key])
355
-
356
- core.endGroup()
357
- }
358
-
359
- // Causes current Ruby environment to be archived and cached.
360
- async function saveRubyToCache(rubyVersion) {
361
- core.startGroup(`Save Ruby to Cache`)
362
-
363
- const key = rubyCacheKey(rubyVersion)
364
- await cache.saveCache(rubyCachePaths(rubyVersion), key)
365
-
366
- core.endGroup()
367
- }
368
-
369
- // Ensures working, properly configured environment for running test suites.
370
- async function postBuildSetup(rubyVersion) {
371
- await downgradeSystemPackages(rubyVersion)
372
- await setupRubyEnvironmentAfterBuild(rubyVersion)
373
- await configureBundleOptions(rubyVersion)
374
- await showVersions()
375
- }
376
-
377
- // Premable steps necessary for building/running the correct Ruby
378
- async function setupEnvironment(rubyVersion, dependencyList) {
379
- const systemDependencyList = "libcurl4-nss-dev build-essential libsasl2-dev libxslt1-dev libxml2-dev"
380
-
381
- await installDependencies('system', systemDependencyList)
382
- await installDependencies('workflow', dependencyList)
383
- await setupRubyEnvironment(rubyVersion)
384
- await addRubyToPath(rubyVersion)
385
- }
386
-
387
- async function setupRuby(rubyVersion){
388
- // skip build process and just setup environment if successfully restored
389
- if (isRubyBuilt(rubyVersion)) {
390
- core.info("Ruby already built. Skipping the build process!")
391
- }
392
-
393
- // otherwise, build Ruby, cache it, then setup environment
394
- else {
395
- await installRubyBuild(rubyVersion)
396
- await installBuildDependencies()
397
- await buildRuby(rubyVersion)
398
- await upgradeRubyGems(rubyVersion)
399
- await installBundler(rubyVersion)
400
-
401
- await saveRubyToCache(rubyVersion)
402
- }
403
-
404
- await postBuildSetup(rubyVersion)
405
- }
406
-
407
- // fingerprints the given filename, returning hex string representation
408
- function fileHash(filename) {
409
- let sum = crypto.createHash('md5')
410
- sum.update(fs.readFileSync(filename))
411
- return sum.digest('hex')
412
- }
413
-
414
- function bundleCacheKey(rubyVersion) {
415
- const keyHash = fileHash(`${process.env.GITHUB_WORKSPACE}/newrelic_rpm.gemspec`)
416
- return `v2-bundle-cache-${rubyVersion}-${keyHash}`
417
- }
418
-
419
- function gemspecFilePath(rubyVersion) {
420
- return `${rubyPath(rubyVersion)}/.bundle-cache`
421
- }
422
-
423
- function bundleCachePaths(rubyVersion) {
424
- return [ gemspecFilePath(rubyVersion) ]
425
- }
426
-
427
- // will attempt to restore the previously built Ruby environment if one exists.
428
- async function restoreBundleFromCache(rubyVersion) {
429
- core.startGroup(`Restore Bundle from Cache`)
430
-
431
- const key = bundleCacheKey(rubyVersion)
432
- core.info(`restore using ${key}`)
433
- await cache.restoreCache(bundleCachePaths(rubyVersion), key, [key])
434
-
435
- core.endGroup()
436
- }
437
-
438
- // Causes current Ruby environment to be archived and cached.
439
- async function saveBundleToCache(rubyVersion) {
440
- core.startGroup(`Save Bundle to Cache`)
441
-
442
- const key = bundleCacheKey(rubyVersion)
443
- await cache.saveCache(bundleCachePaths(rubyVersion), key)
444
-
445
- core.endGroup()
446
- }
447
-
448
- async function setupTestEnvironment(rubyVersion) {
449
- core.startGroup('Setup Test Environment')
450
-
451
- const filePath = gemspecFilePath(rubyVersion)
452
- const workspacePath = process.env.GITHUB_WORKSPACE
453
-
454
- await restoreBundleFromCache(rubyVersion)
455
-
456
- // restore the Gemfile.lock to working folder if cache-hit
457
- if (fs.existsSync(`${filePath}/Gemfile.lock`)) {
458
- await io.cp(`${filePath}/Gemfile.lock`, `${workspacePath}/Gemfile.lock`)
459
- await exec.exec('bundle', ['install'])
460
- }
461
-
462
- // otherwise, bundle install and cache it
463
- else {
464
- await exec.exec('bundle', ['install'])
465
- await io.cp(`${workspacePath}/Gemfile.lock`, `${filePath}/Gemfile.lock`)
466
- try {
467
- await saveBundleToCache(rubyVersion)
468
- }
469
- catch (error) {
470
- console.log('Failed to save cache' + error.toString())
471
- }
472
- }
473
-
474
- core.endGroup()
475
- }
476
-
477
- // Detects if we're expected to build Ruby vs. running the test suite
478
- // This conditional controls whether we go through pain of setting up the
479
- // environment when Ruby was previously built and cached.
480
- function isBuildJob() {
481
- return process.env.GITHUB_JOB.match(/build/)
482
- }
483
-
484
- // Returns true if Ruby was restored from cache
485
- function isRubyBuilt(rubyVersion) {
486
- const rubyBinPath = `${rubyPath(rubyVersion)}/bin`
487
-
488
- return fs.existsSync(`${rubyBinPath}/ruby`)
489
- }
490
-
491
- // Will set up the Ruby environment so the desired Ruby binaries are used in the unit tests
492
- // If Ruby hasn't been built and cached, yet, we also compile the Ruby binaries.
493
- async function main() {
494
- const dependencyList = core.getInput('dependencies')
495
- const rubyVersion = core.getInput('ruby-version')
496
-
497
- try {
498
- // restores from cache if this ruby version was previously built and cached
499
- await restoreRubyFromCache(rubyVersion)
500
-
501
- // skip setting up environment when we're only building and Ruby's already built!
502
- if (isRubyBuilt(rubyVersion) && isBuildJob()) { return }
503
-
504
- await setupEnvironment(rubyVersion, dependencyList)
505
- await setupRuby(rubyVersion)
506
- await setupTestEnvironment(rubyVersion)
507
- }
508
- catch (error) {
509
- core.setFailed(`Action failed with error ${error}`)
510
- }
511
-
512
- }
513
-
514
- main()