Skip to content

Commit 2824dcc

Browse files
committed
Add options --reach-concurrency and --reach-disable-analysis-splitting
1 parent 245c1e8 commit 2824dcc

File tree

7 files changed

+86
-1
lines changed

7 files changed

+86
-1
lines changed

src/commands/ci/handle-ci.mts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ export async function handleCi(autoManifest: boolean): Promise<void> {
5353
reach: {
5454
reachAnalysisTimeout: 0,
5555
reachAnalysisMemoryLimit: 0,
56+
reachConcurrency: 1,
5657
reachDisableAnalytics: false,
58+
reachDisableAnalysisSplitting: false,
5759
reachEcosystems: [],
5860
reachExcludePaths: [],
5961
reachSkipCache: false,

src/commands/scan/cmd-scan-create.mts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,8 @@ async function run(
238238
reach,
239239
reachAnalysisMemoryLimit,
240240
reachAnalysisTimeout,
241+
reachConcurrency,
242+
reachDisableAnalysisSplitting,
241243
reachDisableAnalytics,
242244
reachSkipCache,
243245
readOnly,
@@ -263,7 +265,9 @@ async function run(
263265
reach: boolean
264266
reachAnalysisTimeout: number
265267
reachAnalysisMemoryLimit: number
268+
reachConcurrency: number
266269
reachDisableAnalytics: boolean
270+
reachDisableAnalysisSplitting: boolean
267271
reachSkipCache: boolean
268272
}
269273

@@ -430,17 +434,22 @@ async function run(
430434
const isUsingNonDefaultTimeout =
431435
reachAnalysisTimeout !== reachabilityFlags['reachAnalysisTimeout']?.default
432436

437+
const isUsingNonDefaultConcurrency =
438+
reachConcurrency !== reachabilityFlags['reachConcurrency']?.default
439+
433440
const isUsingNonDefaultAnalytics =
434441
reachDisableAnalytics !==
435442
reachabilityFlags['reachDisableAnalytics']?.default
436443

437444
const isUsingAnyReachabilityFlags =
438445
isUsingNonDefaultMemoryLimit ||
439446
isUsingNonDefaultTimeout ||
447+
isUsingNonDefaultConcurrency ||
440448
isUsingNonDefaultAnalytics ||
441449
hasReachEcosystems ||
442450
hasReachExcludePaths ||
443-
reachSkipCache
451+
reachSkipCache ||
452+
reachDisableAnalysisSplitting
444453

445454
const wasValidInput = checkCommandInput(
446455
outputKind,
@@ -513,6 +522,8 @@ async function run(
513522
reachDisableAnalytics: Boolean(reachDisableAnalytics),
514523
reachAnalysisTimeout: Number(reachAnalysisTimeout),
515524
reachAnalysisMemoryLimit: Number(reachAnalysisMemoryLimit),
525+
reachConcurrency: Number(reachConcurrency),
526+
reachDisableAnalysisSplitting: Boolean(reachDisableAnalysisSplitting),
516527
reachEcosystems,
517528
reachExcludePaths,
518529
reachSkipCache: Boolean(reachSkipCache),

src/commands/scan/cmd-scan-reach.mts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ async function run(
111111
org: orgFlag,
112112
reachAnalysisMemoryLimit,
113113
reachAnalysisTimeout,
114+
reachConcurrency,
115+
reachDisableAnalysisSplitting,
114116
reachDisableAnalytics,
115117
reachSkipCache,
116118
} = cli.flags as {
@@ -121,7 +123,9 @@ async function run(
121123
org: string
122124
reachAnalysisTimeout: number
123125
reachAnalysisMemoryLimit: number
126+
reachConcurrency: number
124127
reachDisableAnalytics: boolean
128+
reachDisableAnalysisSplitting: boolean
125129
reachSkipCache: boolean
126130
}
127131

@@ -202,7 +206,9 @@ async function run(
202206
reachabilityOptions: {
203207
reachAnalysisTimeout: Number(reachAnalysisTimeout),
204208
reachAnalysisMemoryLimit: Number(reachAnalysisMemoryLimit),
209+
reachConcurrency: Number(reachConcurrency),
205210
reachDisableAnalytics: Boolean(reachDisableAnalytics),
211+
reachDisableAnalysisSplitting: Boolean(reachDisableAnalysisSplitting),
206212
reachEcosystems,
207213
reachExcludePaths,
208214
reachSkipCache: Boolean(reachSkipCache),

src/commands/scan/cmd-scan-reach.test.mts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ describe('socket scan reach', async () => {
3838
Reachability Options
3939
--reach-analysis-memory-limit The maximum memory in MB to use for the reachability analysis. The default is 8192MB.
4040
--reach-analysis-timeout Set timeout for the reachability analysis. Split analysis runs may cause the total scan time to exceed this timeout significantly.
41+
--reach-concurrency Set the maximum number of concurrent reachability analysis runs. It is recommended to choose a concurrency level that ensures each analysis run has at least the --reach-analysis-memory-limit amount of memory available. NPM reachability analysis does not support concurrent execution, so the concurrency level is ignored for NPM.
4142
--reach-disable-analytics Disable reachability analytics sharing with Socket. Also disables caching-based optimizations.
43+
--reach-disable-analysis-splitting Limits Coana to at most 1 reachability analysis run per workspace.
4244
--reach-ecosystems List of ecosystems to conduct reachability analysis on, as either a comma separated value or as multiple flags. Defaults to all ecosystems.
4345
--reach-exclude-paths List of paths to exclude from reachability analysis, as either a comma separated value or as multiple flags.
4446
--reach-skip-cache Skip caching-based optimizations. By default, the reachability analysis will use cached configurations from previous runs to speed up the analysis.
@@ -155,6 +157,45 @@ describe('socket scan reach', async () => {
155157
},
156158
)
157159

160+
cmdit(
161+
[
162+
'scan',
163+
'reach',
164+
FLAG_DRY_RUN,
165+
'--reach-concurrency',
166+
'4',
167+
'--org',
168+
'fakeOrg',
169+
FLAG_CONFIG,
170+
'{"apiToken":"fakeToken"}',
171+
],
172+
'should accept --reach-concurrency flag',
173+
async cmd => {
174+
const { code, stdout } = await spawnSocketCli(binCliPath, cmd)
175+
expect(stdout).toMatchInlineSnapshot(`"[DryRun]: Bailing now"`)
176+
expect(code, 'should exit with code 0').toBe(0)
177+
},
178+
)
179+
180+
cmdit(
181+
[
182+
'scan',
183+
'reach',
184+
FLAG_DRY_RUN,
185+
'--reach-disable-analysis-splitting',
186+
'--org',
187+
'fakeOrg',
188+
FLAG_CONFIG,
189+
'{"apiToken":"fakeToken"}',
190+
],
191+
'should accept --reach-disable-analysis-splitting flag',
192+
async cmd => {
193+
const { code, stdout } = await spawnSocketCli(binCliPath, cmd)
194+
expect(stdout).toMatchInlineSnapshot(`"[DryRun]: Bailing now"`)
195+
expect(code, 'should exit with code 0').toBe(0)
196+
},
197+
)
198+
158199
cmdit(
159200
[
160201
'scan',
@@ -269,6 +310,9 @@ describe('socket scan reach', async () => {
269310
'4096',
270311
'--reach-analysis-timeout',
271312
'3600',
313+
'--reach-concurrency',
314+
'2',
315+
'--reach-disable-analysis-splitting',
272316
'--reach-ecosystems',
273317
'npm,pypi',
274318
'--reach-exclude-paths',

src/commands/scan/create-scan-from-github.mts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,8 @@ async function scanOneRepo(
253253
reachDisableAnalytics: false,
254254
reachAnalysisTimeout: 0,
255255
reachAnalysisMemoryLimit: 0,
256+
reachConcurrency: 1,
257+
reachDisableAnalysisSplitting: false,
256258
reachEcosystems: [],
257259
reachExcludePaths: [],
258260
reachSkipCache: false,

src/commands/scan/perform-reachability-analysis.mts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ import type { Spinner } from '@socketsecurity/registry/lib/spinner'
1616
export type ReachabilityOptions = {
1717
reachAnalysisTimeout: number
1818
reachAnalysisMemoryLimit: number
19+
reachConcurrency: number
1920
reachDisableAnalytics: boolean
21+
reachDisableAnalysisSplitting: boolean
2022
reachEcosystems: PURL_Type[]
2123
reachExcludePaths: string[]
2224
reachSkipCache: boolean
@@ -146,9 +148,15 @@ export async function performReachabilityAnalysis(
146148
...(reachabilityOptions.reachAnalysisMemoryLimit
147149
? ['--memory-limit', `${reachabilityOptions.reachAnalysisMemoryLimit}`]
148150
: []),
151+
...(reachabilityOptions.reachConcurrency
152+
? ['--concurrency', `${reachabilityOptions.reachConcurrency}`]
153+
: []),
149154
...(reachabilityOptions.reachDisableAnalytics
150155
? ['--disable-analytics-sharing']
151156
: []),
157+
...(reachabilityOptions.reachDisableAnalysisSplitting
158+
? ['--disable-analysis-splitting']
159+
: []),
152160
...(tarHash
153161
? ['--run-without-docker', '--manifests-tar-hash', tarHash]
154162
: []),

src/commands/scan/reachability-flags.mts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,24 @@ export const reachabilityFlags: MeowFlags = {
1313
description:
1414
'Set timeout for the reachability analysis. Split analysis runs may cause the total scan time to exceed this timeout significantly.',
1515
},
16+
reachConcurrency: {
17+
type: 'number',
18+
default: 1,
19+
description:
20+
'Set the maximum number of concurrent reachability analysis runs. It is recommended to choose a concurrency level that ensures each analysis run has at least the --reach-analysis-memory-limit amount of memory available. NPM reachability analysis does not support concurrent execution, so the concurrency level is ignored for NPM.',
21+
},
1622
reachDisableAnalytics: {
1723
type: 'boolean',
1824
default: false,
1925
description:
2026
'Disable reachability analytics sharing with Socket. Also disables caching-based optimizations.',
2127
},
28+
reachDisableAnalysisSplitting: {
29+
type: 'boolean',
30+
default: false,
31+
description:
32+
'Limits Coana to at most 1 reachability analysis run per workspace.',
33+
},
2234
reachEcosystems: {
2335
type: 'string',
2436
isMultiple: true,

0 commit comments

Comments
 (0)