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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +55 -0
- data/lib/new_relic/agent/audit_logger.rb +10 -0
- data/lib/new_relic/agent/configuration/default_source.rb +15 -1
- data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +2 -2
- data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +4 -5
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +16 -37
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +3 -11
- data/lib/new_relic/agent/instrumentation/net.rb +66 -59
- data/lib/new_relic/agent/instrumentation/net_prepend.rb +72 -0
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rack.rb +8 -18
- data/lib/new_relic/agent/instrumentation/redis.rb +1 -1
- data/lib/new_relic/agent/method_tracer.rb +6 -16
- data/lib/new_relic/agent/new_relic_service.rb +1 -0
- data/lib/new_relic/agent/samplers/memory_sampler.rb +1 -1
- data/lib/new_relic/agent/stats_engine/gc_profiler.rb +1 -1
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +12 -6
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +1 -0
- data/lib/new_relic/constants.rb +4 -0
- data/lib/new_relic/environment_report.rb +7 -1
- data/lib/new_relic/supportability_helper.rb +1 -0
- data/lib/new_relic/version.rb +2 -2
- data/newrelic_rpm.gemspec +1 -1
- metadata +3 -27
- data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
- data/.github/ISSUE_TEMPLATE/config.yml +0 -5
- data/.github/ISSUE_TEMPLATE/feature_request.md +0 -24
- data/.github/actions/annotate/README.md +0 -79
- data/.github/actions/annotate/action.yml +0 -6
- data/.github/actions/annotate/dist/index.js +0 -433
- data/.github/actions/annotate/index.js +0 -25
- data/.github/actions/annotate/package-lock.json +0 -172
- data/.github/actions/annotate/package.json +0 -30
- data/.github/actions/annotate/pre-commit +0 -5
- data/.github/actions/build-ruby/README.md +0 -79
- data/.github/actions/build-ruby/action.yml +0 -15
- data/.github/actions/build-ruby/dist/index.js +0 -52683
- data/.github/actions/build-ruby/index.js +0 -514
- data/.github/actions/build-ruby/package-lock.json +0 -581
- data/.github/actions/build-ruby/package.json +0 -32
- data/.github/actions/build-ruby/pre-commit +0 -5
- data/.github/pull_request_template.md +0 -16
- data/.github/workflows/ci.yml +0 -212
- data/.github/workflows/pr_review_checklist.yml +0 -22
- data/.github/workflows/release.yml +0 -78
- data/.github/workflows/scripts/rubygems-authenticate.py +0 -13
- data/.github/workflows/scripts/rubygems-publish.rb +0 -32
- data/.github/workflows/snyk.yml +0 -27
- 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()
|