chore(ci): fix flakey integration tests#7958
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThis pull request refactors integration test infrastructure for deploy commands and GitHub Actions workflows. It introduces a Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes 🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
tests/integration/commands/deploy/deploy.test.ts (1)
44-58:⚠️ Potential issue | 🔴 CriticalAdd
source_zip_filenameto Deploy type to resolve TS2339Typecheck is failing at Line 1483 because
source_zip_filenamedoesn’t exist onDeployafter the parseDeploy refactor. Make it optional to reflect the API’s conditional presence.🛠️ Proposed fix
type Deploy = { summary: { messages: { title: string description: string }[] } site_id: string site_name: string deploy_url: string deploy_id: string logs: string function_logs: string edge_function_logs: string + source_zip_filename?: string }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/integration/commands/deploy/deploy.test.ts` around lines 44 - 58, The Deploy type used by parseDeploy is missing the optional property source_zip_filename which causes TS2339; update the Deploy type definition (the Deploy type in tests/integration/commands/deploy/deploy.test.ts) to include source_zip_filename?: string so the type reflects the API’s conditional presence, then re-run typechecks and adjust any code that reads source_zip_filename to handle it possibly being undefined.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Outside diff comments:
In `@tests/integration/commands/deploy/deploy.test.ts`:
- Around line 44-58: The Deploy type used by parseDeploy is missing the optional
property source_zip_filename which causes TS2339; update the Deploy type
definition (the Deploy type in tests/integration/commands/deploy/deploy.test.ts)
to include source_zip_filename?: string so the type reflects the API’s
conditional presence, then re-run typechecks and adjust any code that reads
source_zip_filename to handle it possibly being undefined.
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
tests/integration/commands/deploy/deploy.test.ts (1)
32-33: Harden URL construction to avoid double-slash and missing-slash edge cases.String concatenation can yield
https://...//pathorhttps://...path. UsingURLkeeps behavior consistent whensiteUrlhas/doesn’t have a trailing slash.♻️ Proposed fix
- const url = `${siteUrl}${pathname}` + const url = pathname ? new URL(pathname, siteUrl).toString() : siteUrl🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/integration/commands/deploy/deploy.test.ts` around lines 32 - 33, Construct the request URL using the URL API instead of string concatenation to avoid double- or missing-slash edge cases: replace the concatenation that builds `url` from `siteUrl` and `pathname` with creating a `new URL(pathname, siteUrl)` (or equivalent) and use its string/href when calling `fetch` with the existing `headers`; update occurrences of the `url` variable to use the URL object's string representation so tests for `fetch` always get a well-formed URL.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@tests/integration/commands/deploy/deploy.test.ts`:
- Around line 109-113: The afterAll cleanup currently logs and skips deleting
the test site; restore deletion as the default by re-enabling the await
callCli(['sites:delete', siteId, '--force']) inside afterAll and gate skipping
only when an explicit env var is set (e.g., process.env.SKIP_SITE_DELETION or
SKIP_CLEANUP). Locate the afterAll block that references context, SITE_NAME and
callCli, change it so it checks the env flag and if not set runs
callCli(['sites:delete', siteId, '--force']); wrap the deletion call in a
try/catch to log any errors (using the existing test logger or console) so
cleanup failures don’t crash the test run but are visible.
---
Nitpick comments:
In `@tests/integration/commands/deploy/deploy.test.ts`:
- Around line 32-33: Construct the request URL using the URL API instead of
string concatenation to avoid double- or missing-slash edge cases: replace the
concatenation that builds `url` from `siteUrl` and `pathname` with creating a
`new URL(pathname, siteUrl)` (or equivalent) and use its string/href when
calling `fetch` with the existing `headers`; update occurrences of the `url`
variable to use the URL object's string representation so tests for `fetch`
always get a well-formed URL.
| afterAll(async () => { | ||
| const { siteId } = context | ||
| console.log(`deleting test site "${SITE_NAME}". ${siteId}`) | ||
| await callCli(['sites:delete', siteId, '--force']) | ||
| // TODO: temporarily disabled to debug deploy test failures — re-enable after investigation | ||
| console.log(`skipping deletion of test site "${SITE_NAME}". ${siteId}`) | ||
| // await callCli(['sites:delete', siteId, '--force']) |
There was a problem hiding this comment.
Don’t skip site deletion by default — it will leak resources in CI.
Leaving test sites undeleted can accumulate and hit quotas or clutter shared accounts. Gate the skip behind an explicit env flag and keep deletion as the default behavior.
🧹 Suggested safeguard
afterAll(async () => {
const { siteId } = context
- // TODO: temporarily disabled to debug deploy test failures — re-enable after investigation
- console.log(`skipping deletion of test site "${SITE_NAME}". ${siteId}`)
- // await callCli(['sites:delete', siteId, '--force'])
+ if (process.env.NETLIFY_TEST_SKIP_SITE_DELETE === 'true') {
+ console.log(`skipping deletion of test site "${SITE_NAME}". ${siteId}`)
+ return
+ }
+ await callCli(['sites:delete', siteId, '--force'])
})📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| afterAll(async () => { | |
| const { siteId } = context | |
| console.log(`deleting test site "${SITE_NAME}". ${siteId}`) | |
| await callCli(['sites:delete', siteId, '--force']) | |
| // TODO: temporarily disabled to debug deploy test failures — re-enable after investigation | |
| console.log(`skipping deletion of test site "${SITE_NAME}". ${siteId}`) | |
| // await callCli(['sites:delete', siteId, '--force']) | |
| afterAll(async () => { | |
| const { siteId } = context | |
| if (process.env.NETLIFY_TEST_SKIP_SITE_DELETE === 'true') { | |
| console.log(`skipping deletion of test site "${SITE_NAME}". ${siteId}`) | |
| return | |
| } | |
| await callCli(['sites:delete', siteId, '--force']) | |
| }) |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@tests/integration/commands/deploy/deploy.test.ts` around lines 109 - 113, The
afterAll cleanup currently logs and skips deleting the test site; restore
deletion as the default by re-enabling the await callCli(['sites:delete',
siteId, '--force']) inside afterAll and gate skipping only when an explicit env
var is set (e.g., process.env.SKIP_SITE_DELETION or SKIP_CLEANUP). Locate the
afterAll block that references context, SITE_NAME and callCli, change it so it
checks the env flag and if not set runs callCli(['sites:delete', siteId,
'--force']); wrap the deletion call in a try/catch to log any errors (using the
existing test logger or console) so cleanup failures don’t crash the test run
but are visible.
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
tests/integration/commands/deploy/deploy.test.ts (1)
20-41: Avoid ambiguouspathvspathnameand use URL-safe joining.The type allows
pathname, but the function only consumespath. A caller passingpathnamewould get${siteUrl}undefined. Also, string concatenation can yield double slashes. Tighten the type and useURLfor safe joining.♻️ Suggested fix
}:{ content?: string | undefined headers?: Record<string, string> path: string - pathname?: string | undefined siteUrl: string }) => { - const url = `${siteUrl}${pathname}` + const url = new URL(pathname, siteUrl).toString() const response = await fetch(url, { headers })🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/integration/commands/deploy/deploy.test.ts` around lines 20 - 41, The validateContent helper has an ambiguous parameter pair (path vs pathname) and builds URLs by string concatenation which can produce "undefined" or double slashes; update the function signature to accept a single required pathname (rename/remove `path`), change the callers to pass that pathname, and construct the request URL using the URL API (e.g. new URL(pathname, siteUrl).toString()) before calling fetch; ensure you also adjust the local variable references (url, pathname) and types so body/header checks remain the same.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@scripts/clean-test-sites.js`:
- Around line 1-26: The script currently constructs SITE_IDS_FILE using
process.cwd(), which triggers the lint rule that prefers command.workingDir; fix
by either (A) matching the pattern used in scripts/prepublishOnly.js and add a
one-line eslint suppression for the specific rule above the SITE_IDS_FILE
declaration so process.cwd() can remain, or (B) accept a working directory via
an environment variable (e.g., read process.env.WORKING_DIR or
process.env.INIT_CWD) and use that value when building SITE_IDS_FILE (fall back
to process.cwd() only if the env var is absent); update the SITE_IDS_FILE
constant and the script’s README/CI invocation accordingly.
In `@tests/integration/utils/create-live-test-site.ts`:
- Line 7: The constant SITE_IDS_FILE uses process.cwd() which violates the lint
rule; change SITE_IDS_FILE to derive the working directory from the approved
source (e.g., the test helper that exposes command.workingDir) or accept the
working directory as a parameter to the create-live-test-site utility and use
that value instead of process.cwd(); update the constant definition referencing
SITE_IDS_FILE and any callers of the createLiveTestSite helper so they pass the
approved workingDir (or use the helper's command.workingDir) to construct
join(workingDir, '.netlify-test-site-ids').
---
Nitpick comments:
In `@tests/integration/commands/deploy/deploy.test.ts`:
- Around line 20-41: The validateContent helper has an ambiguous parameter pair
(path vs pathname) and builds URLs by string concatenation which can produce
"undefined" or double slashes; update the function signature to accept a single
required pathname (rename/remove `path`), change the callers to pass that
pathname, and construct the request URL using the URL API (e.g. new
URL(pathname, siteUrl).toString()) before calling fetch; ensure you also adjust
the local variable references (url, pathname) and types so body/header checks
remain the same.
|
|
||
| import { callCli } from './call-cli.js' | ||
|
|
||
| const SITE_IDS_FILE = join(process.cwd(), '.netlify-test-site-ids') |
There was a problem hiding this comment.
Replace process.cwd() to satisfy lint rule.
Lint already flags this usage; CI will fail unless the working directory is sourced from the approved helper (the rule mentions command.workingDir). Please switch to the allowed path source or pass it in from the caller.
🧰 Tools
🪛 GitHub Check: Lint
[failure] 7-7:
'process.cwd' is restricted from being used. process.cwd is not permitted; use command.workingDir instead
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@tests/integration/utils/create-live-test-site.ts` at line 7, The constant
SITE_IDS_FILE uses process.cwd() which violates the lint rule; change
SITE_IDS_FILE to derive the working directory from the approved source (e.g.,
the test helper that exposes command.workingDir) or accept the working directory
as a parameter to the create-live-test-site utility and use that value instead
of process.cwd(); update the constant definition referencing SITE_IDS_FILE and
any callers of the createLiveTestSite helper so they pass the approved
workingDir (or use the helper's command.workingDir) to construct
join(workingDir, '.netlify-test-site-ids').
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
scripts/clean-test-sites.js (1)
12-41: Potential issue:unlinkSyncexecutes even when file is empty.When the file exists but contains no valid site IDs (lines 20-21), the code logs "No test sites to clean up" but still proceeds to
unlinkSyncat line 39. This is fine behavior-wise, but there's a minor risk: if the file was externally deleted between theexistsSynccheck andunlinkSync, the script will throw an unhandled exception.🛡️ Optional: wrap unlinkSync in try-catch for robustness
- unlinkSync(SITE_IDS_FILE) - console.log('Cleanup complete.') + try { + unlinkSync(SITE_IDS_FILE) + console.log('Cleanup complete.') + } catch (err) { + // File may have been removed externally; not a fatal error + console.log('Cleanup complete (file already removed).') + }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@scripts/clean-test-sites.js` around lines 12 - 41, The unlinkSync call at the end can throw if the file was removed after the initial existsSync check; update the cleanup flow around unlinkSync (in scripts/clean-test-sites.js) to handle that race by either re-checking existence with existsSync before calling unlinkSync or wrapping unlinkSync in a try/catch that logs a harmless warning on ENOENT and rethrows other errors; adjust the code near the block that reads SITE_IDS_FILE (readFileSync, split/map/filter, and the for loop) so unlinkSync is invoked safely and does not crash the script if the file was deleted concurrently.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@tests/integration/utils/create-live-test-site.ts`:
- Line 31: The template literal uses raw numeric expressions causing a lint
error; update the two console.log calls in createLiveTestSite to explicitly
convert the duration numbers to strings (e.g., use String(Date.now() -
listStart) and String(Date.now() - someOtherStart)) so the template
interpolation no longer contains an unconverted number—locate the console.log
lines in createLiveTestSite and replace the numeric expressions with explicit
string conversions.
---
Nitpick comments:
In `@scripts/clean-test-sites.js`:
- Around line 12-41: The unlinkSync call at the end can throw if the file was
removed after the initial existsSync check; update the cleanup flow around
unlinkSync (in scripts/clean-test-sites.js) to handle that race by either
re-checking existence with existsSync before calling unlinkSync or wrapping
unlinkSync in a try/catch that logs a harmless warning on ENOENT and rethrows
other errors; adjust the code near the block that reads SITE_IDS_FILE
(readFileSync, split/map/filter, and the for loop) so unlinkSync is invoked
safely and does not crash the script if the file was deleted concurrently.
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
tests/integration/utils/create-live-test-site.ts (1)
1-67:⚠️ Potential issue | 🟡 MinorLine 26 exceeds Prettier's printWidth limit and must be wrapped.
Line 26 is 127 characters, which exceeds the configured printWidth of 120. Break this console.log statement across multiple lines to comply with formatting standards before merging.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/integration/utils/create-live-test-site.ts` around lines 1 - 67, The long console.log in createLiveTestSite that prints the accounts timing (uses listStart and accounts.length) exceeds Prettier's printWidth; split the message into shorter parts (e.g., use multiple console.log arguments or a template literal broken across lines) so the resulting call is wrapped under 120 chars while preserving the same runtime values (Date.now() - listStart and accounts.length) and message text; update the console.log that starts with `[createLiveTestSite] Listed accounts in` to a wrapped/multi-line form to satisfy formatting.
🧹 Nitpick comments (1)
.github/workflows/integration-tests.yml (1)
146-161: Consider adding error visibility for cleanup failures.The
curl -sfflags will silently fail if the delete request fails. While this won't block the workflow, cleanup failures may go unnoticed, potentially leaving orphaned test sites.🧹 Optional: Add visibility for cleanup failures
- name: Delete site run: | echo "Deleting test site ${{ needs.setup.outputs.site-id }}" - curl -sf -X DELETE \ + HTTP_CODE=$(curl -s -o /dev/null -w '%{http_code}' -X DELETE \ -H "Authorization: Bearer $NETLIFY_AUTH_TOKEN" \ - "https://api.netlify.com/api/v1/sites/${{ needs.setup.outputs.site-id }}" - echo "Deleted successfully" + "https://api.netlify.com/api/v1/sites/${{ needs.setup.outputs.site-id }}") + if [ "$HTTP_CODE" -ne 204 ] && [ "$HTTP_CODE" -ne 200 ]; then + echo "::warning::Failed to delete site. HTTP $HTTP_CODE" + else + echo "Deleted successfully" + fi🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.github/workflows/integration-tests.yml around lines 146 - 161, In the cleanup job's "Delete site" step (job name "cleanup", step "Delete site"), the curl invocation uses -sf which silences failures; change the flags to -fsS (or remove -s and keep -f) so curl still returns non-zero on HTTP errors but prints error details, and ensure the script logs the response and non-zero exit code (capture curl output/exit status and echo an error message if the delete failed) to make cleanup failures visible.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@tests/integration/commands/deploy/deploy.test.ts`:
- Around line 1094-1100: The test fails because the shared Deploy type and
parseDeploy function expect a summary field but the getDeploy API JSON (JsonData
in deploy.ts) doesn't include it; update the test to either (a) add a new
API-specific type (e.g., ApiDeploy or GetDeployResponse) and a small transformer
that maps the Netlify API response to the existing Deploy shape before calling
parseDeploy, or (b) create a separate parser (e.g., parseApiDeploy) that
consumes the getDeploy output shape; change references in the test from
parseDeploy to the new transformer/parser and ensure parseDeploy remains used
only for the CLI deploy output shape.
---
Outside diff comments:
In `@tests/integration/utils/create-live-test-site.ts`:
- Around line 1-67: The long console.log in createLiveTestSite that prints the
accounts timing (uses listStart and accounts.length) exceeds Prettier's
printWidth; split the message into shorter parts (e.g., use multiple console.log
arguments or a template literal broken across lines) so the resulting call is
wrapped under 120 chars while preserving the same runtime values (Date.now() -
listStart and accounts.length) and message text; update the console.log that
starts with `[createLiveTestSite] Listed accounts in` to a wrapped/multi-line
form to satisfy formatting.
---
Nitpick comments:
In @.github/workflows/integration-tests.yml:
- Around line 146-161: In the cleanup job's "Delete site" step (job name
"cleanup", step "Delete site"), the curl invocation uses -sf which silences
failures; change the flags to -fsS (or remove -s and keep -f) so curl still
returns non-zero on HTTP errors but prints error details, and ensure the script
logs the response and non-zero exit code (capture curl output/exit status and
echo an error message if the delete failed) to make cleanup failures visible.
| const fullDeploy = await callCli( | ||
| ['api', 'getDeploy', '--data', JSON.stringify({ deploy_id: deploy.deploy_id })], | ||
| { | ||
| cwd: builder.directory, | ||
| env: { NETLIFY_SITE_ID: context.siteId }, | ||
| }, | ||
| true, | ||
| )) as unknown as Deploy | ||
| ).then(parseDeploy) |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
rg -n "getDeploy" --type ts -C 3Repository: netlify/cli
Length of output: 6885
🏁 Script executed:
rg -n "parseDeploy" --type ts -C 5Repository: netlify/cli
Length of output: 27567
🏁 Script executed:
rg -n "getDeploy" --type ts -A 10 src/commands/apiRepository: netlify/cli
Length of output: 37
🏁 Script executed:
rg -n "getDeploy|api.*command" --type ts src/commands | head -50Repository: netlify/cli
Length of output: 3804
🏁 Script executed:
cat -n src/commands/api/api.ts | head -100Repository: netlify/cli
Length of output: 2224
🏁 Script executed:
cat -n tests/integration/commands/deploy/deploy.test.ts | head -100Repository: netlify/cli
Length of output: 3564
🏁 Script executed:
rg -n "logJson|--json" src/commands/deploy/deploy.ts -B 3 -A 3 | head -50Repository: netlify/cli
Length of output: 950
🏁 Script executed:
rg -n "jsonData\s*=" src/commands/deploy/deploy.ts -B 5 -A 15 | head -100Repository: netlify/cli
Length of output: 37
🏁 Script executed:
sed -n '800,850p' src/commands/deploy/deploy.tsRepository: netlify/cli
Length of output: 1965
🏁 Script executed:
rg -n "type JsonData|interface JsonData" src/commands/deploy/deploy.ts -B 2 -A 15Repository: netlify/cli
Length of output: 419
🏁 Script executed:
sed -n '1094,1115p' tests/integration/commands/deploy/deploy.test.tsRepository: netlify/cli
Length of output: 1079
🏁 Script executed:
rg -n "summary" tests/integration/commands/deploy/deploy.test.ts | head -20Repository: netlify/cli
Length of output: 194
🏁 Script executed:
rg -n "const deploy = await callCli\(\['deploy'" tests/integration/commands/deploy/deploy.test.ts -A 3 | head -40Repository: netlify/cli
Length of output: 1735
🏁 Script executed:
rg -n "@netlify/api" src/commands/api/api.tsRepository: netlify/cli
Length of output: 112
🏁 Script executed:
sed -n '44,59p' tests/integration/commands/deploy/deploy.test.tsRepository: netlify/cli
Length of output: 337
The Deploy type and parseDeploy are incompatible with the getDeploy API response structure.
The test's Deploy type includes a summary field (lines 45-49), and the test expects it in the API response (line 1102). However, the deploy command's JSON output (JsonData type in deploy.ts) doesn't include a summary field. The getDeploy API response from the Netlify API has a different structure than the deploy command's output, making the shared parseDeploy parser and type definition insufficient for both use cases.
Consider defining a separate type for the API response or transforming the API response to match the expected structure.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@tests/integration/commands/deploy/deploy.test.ts` around lines 1094 - 1100,
The test fails because the shared Deploy type and parseDeploy function expect a
summary field but the getDeploy API JSON (JsonData in deploy.ts) doesn't include
it; update the test to either (a) add a new API-specific type (e.g., ApiDeploy
or GetDeployResponse) and a small transformer that maps the Netlify API response
to the existing Deploy shape before calling parseDeploy, or (b) create a
separate parser (e.g., parseApiDeploy) that consumes the getDeploy output shape;
change references in the test from parseDeploy to the new transformer/parser and
ensure parseDeploy remains used only for the CLI deploy output shape.
| - name: Install Dependencies | ||
| run: npm install @commitlint/config-conventional | ||
| - uses: JulienKode/pull-request-name-linter-action@v19.0.0 | ||
| - uses: amannn/action-semantic-pull-request@v5 |
There was a problem hiding this comment.
No idea why, but the previous action started failing. Trying this one to see if it helps.
serhalp
left a comment
There was a problem hiding this comment.
Thank you for digging into this and fixing!
Approving to unblock CI but I'm not sure I love quietly skipping deploy tests in failure cases
| if [ "$HTTP_CODE" -ne 201 ]; then | ||
| echo "::warning::Failed to create site. HTTP $HTTP_CODE. Live tests will be skipped." | ||
| exit 0 |
There was a problem hiding this comment.
This will just quietly skip all the live tests if it fails? Is that really what we want?
There was a problem hiding this comment.
The Create test site step will still fail, so we can block the PR from being merged. The alternative is that we block the entire test suite from running. Do we prefer that?
There was a problem hiding this comment.
Ah, that would be fine, but would it fail? We're exiting with code 0 🤔.
| SITE_NAME="netlify-test-deploy-$(openssl rand -hex 4)" | ||
| echo "Creating test site: $SITE_NAME" | ||
| HTTP_CODE=$(curl -s -o response.json -w '%{http_code}' -X POST \ | ||
| -H "Authorization: Bearer $NETLIFY_AUTH_TOKEN" \ | ||
| -H "Content-Type: application/json" \ | ||
| -d "{\"name\": \"$SITE_NAME\"}" \ | ||
| "https://api.netlify.com/api/v1/netlify-integration-testing/sites") |
There was a problem hiding this comment.
Since we already have NETLIFY_AUTH_TOKEN, is there any particular reason we aren't using netlify sites:create for this? Is it to avoid using netlify-cli in the test setup for netlify-cli?
There was a problem hiding this comment.
Yeah it feels overkill to install Node.js and the CLI to do something we can solve with an HTTP call.
No description provided.