newrelic_rpm 6.13.1 → 6.14.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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +55 -0
  4. data/lib/new_relic/agent/audit_logger.rb +10 -0
  5. data/lib/new_relic/agent/configuration/default_source.rb +15 -1
  6. data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +2 -2
  7. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +4 -5
  8. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +16 -37
  9. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +3 -11
  10. data/lib/new_relic/agent/instrumentation/net.rb +66 -59
  11. data/lib/new_relic/agent/instrumentation/net_prepend.rb +72 -0
  12. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +1 -1
  13. data/lib/new_relic/agent/instrumentation/rack.rb +8 -18
  14. data/lib/new_relic/agent/instrumentation/redis.rb +1 -1
  15. data/lib/new_relic/agent/method_tracer.rb +6 -16
  16. data/lib/new_relic/agent/new_relic_service.rb +1 -0
  17. data/lib/new_relic/agent/samplers/memory_sampler.rb +1 -1
  18. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +1 -1
  19. data/lib/new_relic/agent/transaction/distributed_tracer.rb +12 -6
  20. data/lib/new_relic/agent/transaction/message_broker_segment.rb +1 -0
  21. data/lib/new_relic/constants.rb +4 -0
  22. data/lib/new_relic/environment_report.rb +7 -1
  23. data/lib/new_relic/supportability_helper.rb +1 -0
  24. data/lib/new_relic/version.rb +2 -2
  25. data/newrelic_rpm.gemspec +1 -1
  26. metadata +3 -27
  27. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
  28. data/.github/ISSUE_TEMPLATE/config.yml +0 -5
  29. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -24
  30. data/.github/actions/annotate/README.md +0 -79
  31. data/.github/actions/annotate/action.yml +0 -6
  32. data/.github/actions/annotate/dist/index.js +0 -433
  33. data/.github/actions/annotate/index.js +0 -25
  34. data/.github/actions/annotate/package-lock.json +0 -172
  35. data/.github/actions/annotate/package.json +0 -30
  36. data/.github/actions/annotate/pre-commit +0 -5
  37. data/.github/actions/build-ruby/README.md +0 -79
  38. data/.github/actions/build-ruby/action.yml +0 -15
  39. data/.github/actions/build-ruby/dist/index.js +0 -52683
  40. data/.github/actions/build-ruby/index.js +0 -514
  41. data/.github/actions/build-ruby/package-lock.json +0 -581
  42. data/.github/actions/build-ruby/package.json +0 -32
  43. data/.github/actions/build-ruby/pre-commit +0 -5
  44. data/.github/pull_request_template.md +0 -16
  45. data/.github/workflows/ci.yml +0 -212
  46. data/.github/workflows/pr_review_checklist.yml +0 -22
  47. data/.github/workflows/release.yml +0 -78
  48. data/.github/workflows/scripts/rubygems-authenticate.py +0 -13
  49. data/.github/workflows/scripts/rubygems-publish.rb +0 -32
  50. data/.github/workflows/snyk.yml +0 -27
  51. data/.github/workflows/stale.yml +0 -21
@@ -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()