squally-reporter 0.10.2 → 0.12.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.
- package/README.md +145 -42
- package/dist/index.d.ts +155 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +518 -62
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -17,21 +17,30 @@ npm install -D squally-reporter
|
|
|
17
17
|
|
|
18
18
|
## Config
|
|
19
19
|
|
|
20
|
-
Set
|
|
20
|
+
Set one env var (e.g. as a CI secret):
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
-
SQUALLY_INGEST_URL=https://app.squally.dev
|
|
24
23
|
SQUALLY_INGEST_KEY=your-project-ingest-key
|
|
25
24
|
```
|
|
26
25
|
|
|
27
|
-
Find your ingest key
|
|
26
|
+
Find your ingest key in the Squally dashboard under **Settings › Project ›
|
|
27
|
+
Ingest key**.
|
|
28
|
+
|
|
29
|
+
**Since 0.12.0 the URL defaults to `https://app.squally.dev`.** Set
|
|
30
|
+
`SQUALLY_INGEST_URL` only to report to another Squally. Without a key the
|
|
31
|
+
reporter sends nothing and says so once.
|
|
28
32
|
|
|
29
33
|
**Renamed in 0.9.0.** These were `SQUALLY_API_URL` and `SQUALLY_API_KEY`. The
|
|
30
34
|
old names still work for now, with a deprecation warning in the CI log - but
|
|
31
|
-
they belong to Squally's read API now, so rename them.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
they belong to Squally's read API now, so rename them. `SQUALLY_API_URL` is
|
|
36
|
+
only used together with `SQUALLY_API_KEY`, never on its own - and when it is
|
|
37
|
+
set but not used, the reporter sends nothing rather than falling back to the
|
|
38
|
+
default URL, since the variable says you meant another target.
|
|
39
|
+
|
|
40
|
+
**A read key is never sent.** A key starting with `sqly_ro_` is a read API key,
|
|
41
|
+
for scripts and agents; reporting needs the ingest key. Since 0.12.0 the
|
|
42
|
+
reporter refuses one in any of `SQUALLY_INGEST_KEY`, `SQUALLY_API_KEY` or the
|
|
43
|
+
`apiKey` option before sending anything, and says which one to fix.
|
|
35
44
|
|
|
36
45
|
Then add the reporter to `playwright.config.ts`:
|
|
37
46
|
|
|
@@ -61,8 +70,8 @@ reporter: [
|
|
|
61
70
|
],
|
|
62
71
|
```
|
|
63
72
|
|
|
64
|
-
That's it - run your tests as usual (`npx playwright test`)
|
|
65
|
-
|
|
73
|
+
That's it - run your tests as usual (`npx playwright test`); results stream
|
|
74
|
+
to Squally while the suite runs (see *How results reach Squally* below).
|
|
66
75
|
|
|
67
76
|
## Artifact upload (screenshot, trace, browser console)
|
|
68
77
|
|
|
@@ -119,12 +128,14 @@ reporter prints. The numbers below are therefore Squally's current ones rather
|
|
|
119
128
|
than anything this package guarantees, and can change server-side without a new
|
|
120
129
|
release of it:
|
|
121
130
|
|
|
122
|
-
- **50 MB per
|
|
123
|
-
|
|
124
|
-
`console.warn` naming the file and moves on.
|
|
125
|
-
reported as usual, and the run's outcome and exit
|
|
126
|
-
dashboard that artifact is shown as skipped, with
|
|
127
|
-
silently missing.
|
|
131
|
+
- **50 MB per screenshot or trace, 4 MB per browser console**, the same on
|
|
132
|
+
every plan. A larger file is rejected before any bytes are uploaded; the
|
|
133
|
+
reporter logs a `console.warn` naming the file and its limit and moves on.
|
|
134
|
+
The test result itself is reported as usual, and the run's outcome and exit
|
|
135
|
+
code are untouched. In the dashboard that artifact is shown as skipped, with
|
|
136
|
+
the reason, rather than silently missing.
|
|
137
|
+
- **At most 250 artifacts per shard.** Squally keeps the first 250 and skips
|
|
138
|
+
the rest with the reason `limit`, which the reporter explains in one line.
|
|
128
139
|
- **A total storage cap per organization, depending on your Squally plan.**
|
|
129
140
|
Once it is reached, further uploads are rejected the same way until you free
|
|
130
141
|
up space or upgrade. Note that a fully instrumented suite now produces up to
|
|
@@ -151,15 +162,19 @@ dashboard stays close to real time even for a long suite. A batch goes out on
|
|
|
151
162
|
whichever of these comes first:
|
|
152
163
|
|
|
153
164
|
- **25 results.** Fixed, and the same whether you shard or not.
|
|
154
|
-
- **A timer
|
|
155
|
-
|
|
156
|
-
every
|
|
165
|
+
- **A timer: 2 seconds, or 0.4 seconds × the number of shards when that is
|
|
166
|
+
longer, capped at 30 seconds** (0.12.0). Up to five shards every shard
|
|
167
|
+
flushes every 2 seconds; eight shards every 3.2; sixteen every 6.4; from 75
|
|
168
|
+
shards the cap holds it at 30.
|
|
157
169
|
|
|
158
170
|
Only the timer scales. All shards of a run share one rate budget on Squally's
|
|
159
|
-
side
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
171
|
+
side (300 requests a minute per key), and the timer keeps all of them
|
|
172
|
+
together at about half of it. The 25-result threshold is left alone
|
|
173
|
+
deliberately: it bounds how long a *fast* suite waits, and stretching it would
|
|
174
|
+
delay results without bounding the burst any better.
|
|
175
|
+
|
|
176
|
+
A batch also stays under 3 MB (0.12.0): results with long error texts or many
|
|
177
|
+
steps simply go out in more, smaller requests.
|
|
163
178
|
|
|
164
179
|
There is no longer a single-request size limit that could discard a whole run -
|
|
165
180
|
a very large suite simply takes more, smaller requests. As a courtesy the
|
|
@@ -171,6 +186,23 @@ If Squally is unreachable partway through, results already sent stay in the
|
|
|
171
186
|
dashboard; only what could not be delivered is lost, and your test run's exit
|
|
172
187
|
code is never affected either way.
|
|
173
188
|
|
|
189
|
+
## Steps (0.12.0)
|
|
190
|
+
|
|
191
|
+
For an attempt that **failed, or needed a retry**, the reporter also sends the
|
|
192
|
+
steps Playwright recorded - hooks, fixtures, actions, assertions and your own
|
|
193
|
+
`test.step`s, with their durations and `file:line`. Squally shows them on the
|
|
194
|
+
attempt page, the failing step marked. An attempt that passed on its first try
|
|
195
|
+
sends none.
|
|
196
|
+
|
|
197
|
+
- **Typed values never leave your runner.** The value of a `fill`, `type` or
|
|
198
|
+
`pressSequentially` is replaced: `Fill "•••" getByLabel('Password')`. Every
|
|
199
|
+
title also goes through the same secret masking as error texts.
|
|
200
|
+
- **At most 300 steps per attempt, 200 characters per title.** A longer list
|
|
201
|
+
keeps the failing step and the steps it sits in, then the rest in order, and
|
|
202
|
+
tells Squally how many were left out.
|
|
203
|
+
- Nothing to configure: steps come from Playwright's own report, with or
|
|
204
|
+
without tracing.
|
|
205
|
+
|
|
174
206
|
**Only actual test runs appear.** A run shows up in Squally once your first
|
|
175
207
|
test starts, so commands that never run a test create nothing: `--list`,
|
|
176
208
|
a `globalSetup` or `webServer` that fails to start, a `--grep` that matches
|
|
@@ -187,6 +219,11 @@ count against the test.
|
|
|
187
219
|
|
|
188
220
|
## Cancelled runs
|
|
189
221
|
|
|
222
|
+
**Cancelled in Squally.** An admin can cancel a running run from its page in
|
|
223
|
+
Squally. That marks the run there; it does not stop your CI job. What the job
|
|
224
|
+
sends afterwards is discarded, and from 0.12.0 the reporter says so in one
|
|
225
|
+
line - "This run was cancelled in Squally" - instead of advice about job keys.
|
|
226
|
+
|
|
190
227
|
A run stopped with SIGINT - Ctrl+C, or a cancelled CI job - shows in Squally
|
|
191
228
|
as **Cancelled**: the reporter sends what finished and tells Squally the run
|
|
192
229
|
was interrupted. Your exit code stays Playwright's own (130). This needs
|
|
@@ -208,7 +245,7 @@ runners). Other CI systems deliver a cancel in their own way - check that
|
|
|
208
245
|
Playwright is the process that receives it.
|
|
209
246
|
|
|
210
247
|
Without that - or after any hard kill (SIGKILL) - the reporter never gets to
|
|
211
|
-
report the end: the run stays *running* until Squally's
|
|
248
|
+
report the end: the run stays *running* until Squally's hourly check marks it
|
|
212
249
|
**incomplete** once the project's run timeout (60 minutes by default) has
|
|
213
250
|
passed. A run stopped before its first test starts sends nothing, like any
|
|
214
251
|
run that never ran a test, and `globalTimeout` running out is not a cancel -
|
|
@@ -236,8 +273,11 @@ which CI system it is running on from that system's own environment:
|
|
|
236
273
|
|
|
237
274
|
- **`CI` counts only as `true` or `1`.** `CI=false` or `CI=0` is a local run -
|
|
238
275
|
unless one of the providers above is recognised, which always wins. A run
|
|
239
|
-
that is none of these is local
|
|
240
|
-
|
|
276
|
+
that is none of these is local. Local runs are listed with all other runs,
|
|
277
|
+
and have numbers of their own: Squally's figures count CI runs by default,
|
|
278
|
+
and the **All · CI · Local** switch shows local runs on their own, or both.
|
|
279
|
+
A local run never posts a GitHub check, a pull-request comment or a Slack
|
|
280
|
+
message.
|
|
241
281
|
- **Pull requests are reported under their own head commit and source
|
|
242
282
|
branch**, not the merge commit CI checks out - that is the commit Squally's
|
|
243
283
|
GitHub check and pull-request comment have to find. The commit message and
|
|
@@ -256,6 +296,22 @@ which CI system it is running on from that system's own environment:
|
|
|
256
296
|
`SQUALLY_DISABLE_HEAD_COMMIT_FETCH=true` turns the fetch off.
|
|
257
297
|
- **A tag build has no branch.** A detached checkout never reports `HEAD` as a
|
|
258
298
|
branch name, and `refs/heads/` or `origin/` prefixes are removed.
|
|
299
|
+
- **A link to the CI run (0.11.0).** The reporter sends the page of the CI run,
|
|
300
|
+
so Squally can link a run to it. It is read from each provider's own
|
|
301
|
+
variable, sent only as an `https://` URL of at most 2,048 characters, and
|
|
302
|
+
never opened by Squally - only shown as a link:
|
|
303
|
+
|
|
304
|
+
| Provider | Link |
|
|
305
|
+
|---|---|
|
|
306
|
+
| GitHub Actions | `GITHUB_SERVER_URL`/`GITHUB_REPOSITORY`/actions/runs/`GITHUB_RUN_ID`/attempts/`GITHUB_RUN_ATTEMPT` |
|
|
307
|
+
| GitLab CI | `CI_PIPELINE_URL` |
|
|
308
|
+
| Jenkins | `BUILD_URL` (only with Jenkins served over https) |
|
|
309
|
+
| Buildkite | `BUILDKITE_BUILD_URL` |
|
|
310
|
+
| Travis CI | `TRAVIS_BUILD_WEB_URL` |
|
|
311
|
+
| Drone | `DRONE_BUILD_LINK` |
|
|
312
|
+
|
|
313
|
+
Other providers send no link. It is the run's page, never one job's, and it
|
|
314
|
+
is the same with `SQUALLY_CI_RUN_ID` set.
|
|
259
315
|
|
|
260
316
|
## Tests marked with `test.fail()`
|
|
261
317
|
|
|
@@ -302,24 +358,70 @@ invocations, set `SQUALLY_CI_RUN_ID` to the same value for every shard of one
|
|
|
302
358
|
run - anything unique per CI run and shared by its shards works, e.g. a build
|
|
303
359
|
number your CI system already exposes.
|
|
304
360
|
|
|
305
|
-
**Several jobs in one CI run need their own
|
|
306
|
-
everything in one CI run, so two jobs that are *not* shards of each other -
|
|
307
|
-
|
|
308
|
-
into the same Squally run
|
|
309
|
-
|
|
310
|
-
more for that job. Give each job its own id, shared only by its own shards:
|
|
361
|
+
**Several jobs in one CI run need their own key (0.11.0).** The id is shared
|
|
362
|
+
by everything in one CI run, so two jobs that are *not* shards of each other -
|
|
363
|
+
a GitHub Actions matrix over browsers run without `--shard`, or an `api` and a
|
|
364
|
+
`ui` suite - would report into the same Squally run. Give each job its own
|
|
365
|
+
`SQUALLY_CI_JOB_KEY`, shared only by that job's own shards:
|
|
311
366
|
|
|
312
367
|
```yaml
|
|
313
|
-
|
|
314
|
-
|
|
368
|
+
jobs:
|
|
369
|
+
test:
|
|
370
|
+
strategy:
|
|
371
|
+
matrix:
|
|
372
|
+
browser: [chromium, firefox]
|
|
373
|
+
env:
|
|
374
|
+
SQUALLY_CI_JOB_KEY: ${{ matrix.browser }}
|
|
375
|
+
steps:
|
|
376
|
+
- run: exec ./node_modules/.bin/playwright test --project=${{ matrix.browser }}
|
|
315
377
|
```
|
|
316
378
|
|
|
317
|
-
The
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
379
|
+
The reporter puts the key into the id - `<GITHUB_RUN_ID>-<key>-<GITHUB_RUN_ATTEMPT>`
|
|
380
|
+
on GitHub Actions, `<provider id>-<key>` elsewhere - so each job is its own run
|
|
381
|
+
in Squally, and a re-run of one job links to that job's own earlier attempt.
|
|
382
|
+
The key may hold letters, digits, `.`, `_` and `-`, at most 64 characters; an
|
|
383
|
+
invalid key is reported once and ignored, and your test run is unaffected.
|
|
384
|
+
Without a key the id is exactly what it was before 0.11.0. A suite that is
|
|
385
|
+
sharded *and* split into jobs uses the same key for all shards of one job:
|
|
386
|
+
`SQUALLY_CI_JOB_KEY: ${{ matrix.suite }}` beside `--shard=${{ matrix.shard }}/2`.
|
|
387
|
+
|
|
388
|
+
**Replaces the hand-built id.** Until 0.11.0 this section suggested
|
|
389
|
+
`SQUALLY_CI_RUN_ID: ${{ github.run_id }}-${{ github.run_attempt }}-${{ matrix.browser }}`.
|
|
390
|
+
It still groups each job correctly, but Squally cannot tell its attempts apart,
|
|
391
|
+
so a re-run is never linked to the attempt before it. Switch to
|
|
392
|
+
`SQUALLY_CI_JOB_KEY`. An explicit `SQUALLY_CI_RUN_ID` still wins for the id;
|
|
393
|
+
the key is then only sent alongside it.
|
|
394
|
+
|
|
395
|
+
**When two jobs collide anyway, Squally refuses the second one at the start**
|
|
396
|
+
(squally-app with block 1b, reporter 0.11.0). The reporter prints one block,
|
|
397
|
+
sends nothing more for that job, and leaves your test run and its exit code
|
|
398
|
+
alone:
|
|
399
|
+
|
|
400
|
+
- `ci_run_collision` - another job already reports under this CI run id (and
|
|
401
|
+
shard). Give every job its own `SQUALLY_CI_JOB_KEY`.
|
|
402
|
+
- `ci_run_mixed` - the id would put a sharded job and an unsharded one, or
|
|
403
|
+
shards of different totals, into one run. The same fix.
|
|
404
|
+
|
|
405
|
+
Before 0.11.0 the second job was handed the first job's run instead, and its
|
|
406
|
+
results were refused once that run completed; a reporter older than 0.11.0
|
|
407
|
+
still behaves that way, and prints "Squally has already completed run …".
|
|
408
|
+
|
|
409
|
+
**Re-runs.** On GitHub Actions every re-run attempt is its own run in Squally,
|
|
410
|
+
linked to the attempt before it ("Re-run of #N"). "Re-run failed jobs" runs only
|
|
411
|
+
the shards that did not pass; that attempt waits only for those shards,
|
|
412
|
+
completes once they have reported, and passes or fails on the tests they ran -
|
|
413
|
+
the reused shards are neither waited for nor counted, and the run page shows
|
|
414
|
+
them as "passed in #N · not re-run". A re-run shard that never reports still
|
|
415
|
+
leaves the run incomplete after the run timeout.
|
|
416
|
+
|
|
417
|
+
Other CI systems re-run a job under the id of the run it belongs to - a GitLab
|
|
418
|
+
job retry, an Azure Pipelines re-run, a Bitbucket re-run of failed steps, a
|
|
419
|
+
Buildkite retry, a Travis CI restart. Since 0.11.0 Squally refuses such a
|
|
420
|
+
retry at the start with `ci_run_collision`: the slot is taken by the first
|
|
421
|
+
attempt. **`SQUALLY_CI_JOB_KEY` does not help here** - the retry is the same
|
|
422
|
+
job - so a retry on these systems is not reported; the first attempt stays the
|
|
423
|
+
run. A Drone restart is a new build with a new number, and so a new run in
|
|
424
|
+
Squally, not linked to the one it repeats.
|
|
323
425
|
|
|
324
426
|
**`playwright merge-reports` is not part of this and is not recommended** for
|
|
325
427
|
getting a single run in Squally - the automatic correlation above is the
|
|
@@ -389,9 +491,10 @@ happens, so a value that looks different in the dashboard is not a mystery.
|
|
|
389
491
|
|
|
390
492
|
## Troubleshooting
|
|
391
493
|
|
|
392
|
-
Set `SQUALLY_DEBUG=1` to print detail that is otherwise kept quiet -
|
|
393
|
-
|
|
394
|
-
|
|
494
|
+
Set `SQUALLY_DEBUG=1` to print detail that is otherwise kept quiet - the
|
|
495
|
+
browser-console extraction (how many messages were found, or that an attempt's
|
|
496
|
+
trace held none) and, since 0.11.0, a CI run link that was not sent because it
|
|
497
|
+
was not an `https://` URL. Everything that is *not* ordinary (a trace that
|
|
395
498
|
cannot be read, an unsupported schema version, a rejected upload) is printed
|
|
396
499
|
without it.
|
|
397
500
|
|
package/dist/index.d.ts
CHANGED
|
@@ -43,15 +43,33 @@ interface AppendResultEntry {
|
|
|
43
43
|
errors?: AppendErrorEntry[];
|
|
44
44
|
consoleOutput: string | null;
|
|
45
45
|
tags?: string[];
|
|
46
|
+
/**
|
|
47
|
+
* Playwright's steps of this attempt (0.12.0), flat, the parent by index -
|
|
48
|
+
* only for an attempt that did not pass on its first try (stepsForAttempt).
|
|
49
|
+
* Omitted otherwise, and by squally-app before 19.10.2026, which ignores
|
|
50
|
+
* fields it does not know.
|
|
51
|
+
*/
|
|
52
|
+
steps?: StepEntry[];
|
|
53
|
+
/** How many steps were left out to stay within MAX_STEPS. Omitted when none. */
|
|
54
|
+
stepsOmitted?: number;
|
|
46
55
|
browserName: string | null;
|
|
47
56
|
errorContext: string | null;
|
|
48
57
|
}
|
|
49
58
|
type ArtifactType = "screenshot" | "trace" | "console";
|
|
59
|
+
/** One step on the wire: title, category, parent index, duration, "file:line", failed. */
|
|
60
|
+
interface StepEntry {
|
|
61
|
+
t: string;
|
|
62
|
+
c: string;
|
|
63
|
+
p: number | null;
|
|
64
|
+
d: number | null;
|
|
65
|
+
l?: string;
|
|
66
|
+
e?: true;
|
|
67
|
+
}
|
|
50
68
|
declare function truncate(value: string, max: number): string;
|
|
51
69
|
declare function truncateOrNull(value: string | null, max: number): string | null;
|
|
52
70
|
/**
|
|
53
|
-
* This shard's flush interval: the base cadence stretched
|
|
54
|
-
* share the rate budget
|
|
71
|
+
* This shard's flush interval: the base cadence, stretched once enough shards
|
|
72
|
+
* share the rate budget to need it.
|
|
55
73
|
*
|
|
56
74
|
* Only the TIMER is scaled. FLUSH_THRESHOLD_RESULTS is not, and that is
|
|
57
75
|
* deliberate: it is a latency bound on a fast suite, not a rate control, and
|
|
@@ -160,7 +178,66 @@ declare function resolveGitContext(env: NodeJS.ProcessEnv, io?: GitContextIo): G
|
|
|
160
178
|
* to hold it - at actions/checkout's default depth of 1 it does not.
|
|
161
179
|
*/
|
|
162
180
|
declare function resolveGitContextForRun(env: NodeJS.ProcessEnv, io?: GitContextIo): Promise<GitContext>;
|
|
163
|
-
declare function detectCiRunId(env: NodeJS.ProcessEnv, generateFallback: () => string): string;
|
|
181
|
+
declare function detectCiRunId(env: NodeJS.ProcessEnv, generateFallback: () => string, jobKey?: string | null): string;
|
|
182
|
+
/**
|
|
183
|
+
* SQUALLY_CI_JOB_KEY, checked by squally-app's own rule (letters, digits,
|
|
184
|
+
* '.', '_' and '-', at most 64). An invalid key is a warning, never a failed
|
|
185
|
+
* test run: the reporter continues WITHOUT a key - the id it would have built
|
|
186
|
+
* without one, and no ciJobKey - rather than send a value the server refuses
|
|
187
|
+
* or guess a cleaned-up one. Unset or empty: no key, no warning.
|
|
188
|
+
*/
|
|
189
|
+
declare function resolveCiJobKey(env: NodeJS.ProcessEnv): {
|
|
190
|
+
key: string | null;
|
|
191
|
+
warning: string | null;
|
|
192
|
+
};
|
|
193
|
+
/**
|
|
194
|
+
* The attempt to send as ciRunAttempt (0.11.0) - only when THIS reporter built
|
|
195
|
+
* the CI run id from GITHUB_RUN_ATTEMPT, so the id ends in "-<attempt>" and
|
|
196
|
+
* squally-app can link a re-run to the attempt before it (detectCiAttempt
|
|
197
|
+
* there reads the stem off that suffix). Never with SQUALLY_CI_RUN_ID: only
|
|
198
|
+
* the reporter knows the id is GitHub's, and an id the user wrote proves
|
|
199
|
+
* nothing about its suffix.
|
|
200
|
+
*
|
|
201
|
+
* GITHUB ONLY, by the providers' documentation: GitHub's attempt counts runs
|
|
202
|
+
* of the whole workflow run and is part of its id. GitLab's
|
|
203
|
+
* CI_JOB_RETRY_COUNT, Buildkite's BUILDKITE_RETRY_COUNT and Azure's job
|
|
204
|
+
* attempt count retries of ONE JOB inside a build whose id stays the same - not
|
|
205
|
+
* an attempt of the run squally-app groups - and Jenkins, Travis and Drone
|
|
206
|
+
* document no counter at all.
|
|
207
|
+
*/
|
|
208
|
+
declare function detectCiRunAttempt(env: NodeJS.ProcessEnv): number | null;
|
|
209
|
+
/** An absolute https: URL with a host - squally-app's isHttpsUrl. */
|
|
210
|
+
declare function isHttpsUrl(value: string): boolean;
|
|
211
|
+
/**
|
|
212
|
+
* The CI run's page, sent as ciRunUrl (0.11.0) so Squally can link a run to
|
|
213
|
+
* its CI run. One builder per provider, from each provider's documented
|
|
214
|
+
* variable:
|
|
215
|
+
* - GitHub Actions: GITHUB_SERVER_URL/GITHUB_REPOSITORY/actions/runs/
|
|
216
|
+
* GITHUB_RUN_ID - the URL GitHub's own docs give - and /attempts/
|
|
217
|
+
* GITHUB_RUN_ATTEMPT when set, the page of exactly this attempt;
|
|
218
|
+
* - GitLab CI: CI_PIPELINE_URL ("The URL for the pipeline details");
|
|
219
|
+
* - Jenkins: BUILD_URL ("The URL where the results of this build can be
|
|
220
|
+
* found");
|
|
221
|
+
* - Buildkite: BUILDKITE_BUILD_URL ("The url for this build on Buildkite");
|
|
222
|
+
* - Travis CI: TRAVIS_BUILD_WEB_URL ("URL to the build log");
|
|
223
|
+
* - Drone: DRONE_BUILD_LINK ("a deep link the Drone build results").
|
|
224
|
+
* The run, never the job: the id groups a whole build's jobs, so its link is
|
|
225
|
+
* the build's. Independent of SQUALLY_CI_RUN_ID - the page is the same.
|
|
226
|
+
*
|
|
227
|
+
* ONLY HTTPS, AT MOST 2048 CHARACTERS (squally-app's rule). Anything else - a
|
|
228
|
+
* Jenkins without TLS, a value that is not a URL - is left out silently, with
|
|
229
|
+
* a debug line: a missing link is no reason to warn on every run.
|
|
230
|
+
*/
|
|
231
|
+
declare function detectCiRunUrl(env: NodeJS.ProcessEnv): string | null;
|
|
232
|
+
declare function beginRefusalMessage(refusal: {
|
|
233
|
+
code: string | null;
|
|
234
|
+
message: string | null;
|
|
235
|
+
detail: string;
|
|
236
|
+
}, where: {
|
|
237
|
+
ciRunId: string;
|
|
238
|
+
shardIndex: number | null;
|
|
239
|
+
jobKey: string | null;
|
|
240
|
+
}): string;
|
|
164
241
|
interface ProjectSuiteLike {
|
|
165
242
|
project(): {
|
|
166
243
|
name: string;
|
|
@@ -176,6 +253,54 @@ declare function resolveTestedRevision(env?: NodeJS.ProcessEnv, io?: GitContextI
|
|
|
176
253
|
declare function toPosixPath(p: string): string;
|
|
177
254
|
declare function stripAnsi(value: string): string;
|
|
178
255
|
declare function maskSecrets(value: string): string;
|
|
256
|
+
/** The step fields this reporter reads - a structural subset of Playwright's TestStep. */
|
|
257
|
+
interface StepLike {
|
|
258
|
+
title: string;
|
|
259
|
+
category: string;
|
|
260
|
+
duration: number;
|
|
261
|
+
error?: unknown;
|
|
262
|
+
location?: {
|
|
263
|
+
file: string;
|
|
264
|
+
line: number;
|
|
265
|
+
};
|
|
266
|
+
steps?: StepLike[];
|
|
267
|
+
}
|
|
268
|
+
declare function stripTypedValue(title: string): string;
|
|
269
|
+
/** Whether this attempt sends its steps: a failure, a timeout, or any retry. */
|
|
270
|
+
declare function attemptSendsSteps(result: {
|
|
271
|
+
status: string;
|
|
272
|
+
retry: number;
|
|
273
|
+
}): boolean;
|
|
274
|
+
/**
|
|
275
|
+
* The attempt's steps for the wire, at most MAX_STEPS, and how many were left
|
|
276
|
+
* out. Null when there are none.
|
|
277
|
+
*
|
|
278
|
+
* FAILED IS MARKED ON THE DEEPEST STEP ONLY: Playwright puts the error on a
|
|
279
|
+
* failing expect AND on every test.step around it, and the page should point
|
|
280
|
+
* at the one that broke, not paint its whole ancestry red.
|
|
281
|
+
*
|
|
282
|
+
* THE CUT KEEPS THE FAILING PATH (decision 4): every marked step and its
|
|
283
|
+
* ancestors first, then the rest in order until MAX_STEPS. A kept step whose
|
|
284
|
+
* parent was cut hangs from its nearest kept ancestor.
|
|
285
|
+
*/
|
|
286
|
+
declare function stepsForAttempt(steps: readonly StepLike[] | undefined, rootDir: string): {
|
|
287
|
+
steps: StepEntry[];
|
|
288
|
+
omitted: number;
|
|
289
|
+
} | null;
|
|
290
|
+
/** The result entry's step fields: none at all when there are no steps, no stepsOmitted when nothing was cut. */
|
|
291
|
+
declare function stepFields(payload: {
|
|
292
|
+
steps: StepEntry[];
|
|
293
|
+
omitted: number;
|
|
294
|
+
} | null): {
|
|
295
|
+
steps?: StepEntry[];
|
|
296
|
+
stepsOmitted?: number;
|
|
297
|
+
};
|
|
298
|
+
/**
|
|
299
|
+
* How many of the buffered results go into the next request: up to
|
|
300
|
+
* BATCH_MAX_RESULTS and BATCH_MAX_BYTES, and always at least one - a single
|
|
301
|
+
* result is bounded far below the byte limit by its own field limits.
|
|
302
|
+
*/
|
|
303
|
+
declare function takeBatch(buffer: readonly unknown[], maxResults: number, maxBytes: number): number;
|
|
179
304
|
/** One piece of free text as it goes on the wire: masked, then cut to maxChars. */
|
|
180
305
|
declare function outgoingText(value: string, maxChars: number): string;
|
|
181
306
|
/**
|
|
@@ -232,6 +357,9 @@ declare function outgoingResultText(raw: {
|
|
|
232
357
|
};
|
|
233
358
|
declare function attemptQualifiesForArtifacts(mappedStatus: AppendResultEntry["status"], retryCount: number): boolean;
|
|
234
359
|
declare function artifactKey(testName: string, filePath: string, retryCount: number, repeatIndex: number, type: ArtifactType): string;
|
|
360
|
+
/** Why the app skipped an artifact, as a sentence (0.12.0: the limit per kind, and `limit`). */
|
|
361
|
+
declare function skipReasonMessage(reason: string, type: ArtifactType): string;
|
|
362
|
+
declare function artifactLabel(type: ArtifactType): string;
|
|
235
363
|
declare function parseRetryAfterMs(headerValue: string | null, nowMs: number): number | null;
|
|
236
364
|
declare function computeBackoffMs(retryNumber: number): number;
|
|
237
365
|
declare function resolveConnection(options: SquallyReporterOptions, env: NodeJS.ProcessEnv, warned?: Set<string>): {
|
|
@@ -248,6 +376,14 @@ export default class SquallyReporter implements Reporter {
|
|
|
248
376
|
private dispatcher;
|
|
249
377
|
private ciRunId;
|
|
250
378
|
private shardIndex;
|
|
379
|
+
/**
|
|
380
|
+
* 0.11.0: one per reporter process, the same on every retry of begin - a
|
|
381
|
+
* retried begin is the same job, another process with the same CI run id
|
|
382
|
+
* and shard is not (squally-app answers that one 409 ci_run_collision).
|
|
383
|
+
*/
|
|
384
|
+
private readonly beginToken;
|
|
385
|
+
/** SQUALLY_CI_JOB_KEY, validated (resolveCiJobKey) - or null. */
|
|
386
|
+
private ciJobKey;
|
|
251
387
|
private shardTotal;
|
|
252
388
|
private projectName;
|
|
253
389
|
private runTags;
|
|
@@ -335,6 +471,11 @@ export declare const __internal: {
|
|
|
335
471
|
toPosixPath: typeof toPosixPath;
|
|
336
472
|
detectCiRunId: typeof detectCiRunId;
|
|
337
473
|
detectCiProvider: typeof detectCiProvider;
|
|
474
|
+
resolveCiJobKey: typeof resolveCiJobKey;
|
|
475
|
+
detectCiRunAttempt: typeof detectCiRunAttempt;
|
|
476
|
+
detectCiRunUrl: typeof detectCiRunUrl;
|
|
477
|
+
isHttpsUrl: typeof isHttpsUrl;
|
|
478
|
+
beginRefusalMessage: typeof beginRefusalMessage;
|
|
338
479
|
resolveGitContext: typeof resolveGitContext;
|
|
339
480
|
resolveGitContextForRun: typeof resolveGitContextForRun;
|
|
340
481
|
fetchCommitFromOrigin: typeof fetchCommitFromOrigin;
|
|
@@ -357,6 +498,17 @@ export declare const __internal: {
|
|
|
357
498
|
flushIntervalFor: typeof flushIntervalFor;
|
|
358
499
|
attemptQualifiesForArtifacts: typeof attemptQualifiesForArtifacts;
|
|
359
500
|
artifactKey: typeof artifactKey;
|
|
501
|
+
stepsForAttempt: typeof stepsForAttempt;
|
|
502
|
+
stepFields: typeof stepFields;
|
|
503
|
+
stripTypedValue: typeof stripTypedValue;
|
|
504
|
+
attemptSendsSteps: typeof attemptSendsSteps;
|
|
505
|
+
takeBatch: typeof takeBatch;
|
|
506
|
+
skipReasonMessage: typeof skipReasonMessage;
|
|
507
|
+
artifactLabel: typeof artifactLabel;
|
|
508
|
+
MAX_STEPS: number;
|
|
509
|
+
MAX_STEP_TITLE: number;
|
|
510
|
+
BATCH_MAX_BYTES: number;
|
|
511
|
+
DEFAULT_INGEST_URL: string;
|
|
360
512
|
};
|
|
361
513
|
export {};
|
|
362
514
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACX,MAAM,2BAA2B,CAAC;AAcnC,UAAU,sBAAsB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|