* Read the collapsed-threads key through getJsonItem `getFromLocalStorage` parsed the stored string directly, so anything malformed under `__remarkCollapsed` threw out of `restoreCollapsedThreads`. That call sits in `remark.tsx` ahead of the `render`, so the throw took the whole widget with it: the reader was left on the preloader, over a view preference. `getJsonItem` in `common/local-storage.ts` already wraps a parse of a localStorage key and returns null on failure, and null is a shape the check below already reads as empty. The rest of that function is total against whatever the browser holds, and the bare parse was the one way in. * Stop retrying a failed e2e test in CI The suite went in with one gotestsum rerun. It has no failures on record to justify that: 31 CI runs since it landed, all green, and no rerun report has ever been produced. A retry is what turns an intermittent regression into a green build, and while the suite is this young its own failures are the evidence worth keeping. `E2E_RUN_ID` stays. It stamps the threads a run works on with the CI run id, so a thread url in a trace or a log names the run it came from. It carries no data across: the stack is disposable, and a local run under the same id gets those urls on an empty database. * Stop two chooseUnusedPort comments claiming collisions cannot happen All four copies listen on :0, read the assigned port, close the listener and bind later, so nothing holds the number across that gap and another binary can take it. The copies in app/cmd and app/rest/api call a collision very unlikely, which is accurate; the ones in app and the example module said binaries never land on the same number, which is not, and a comment ruling out a port collision is what would send the next person chasing one somewhere else. All four now read the same. Closing the window rather than describing it means the server binding :0 itself and reporting the address it got, which is a larger change.
116 lines
3.3 KiB
YAML
116 lines
3.3 KiB
YAML
name: e2e
|
|
|
|
on:
|
|
push:
|
|
branches: [master]
|
|
paths:
|
|
- ".github/workflows/e2e-tests.yml"
|
|
- "backend/**"
|
|
- "frontend/**"
|
|
- "e2e/**"
|
|
- "compose-e2e-test.yml"
|
|
- "Dockerfile"
|
|
|
|
pull_request:
|
|
branches: [master]
|
|
paths:
|
|
- ".github/workflows/e2e-tests.yml"
|
|
- "backend/**"
|
|
- "frontend/**"
|
|
- "e2e/**"
|
|
- "compose-e2e-test.yml"
|
|
- "Dockerfile"
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
# cheap gate: catches a compile break or a lint regression in the build-tagged suite
|
|
# without paying for the docker build and the browser download
|
|
vet:
|
|
name: Vet
|
|
timeout-minutes: 10
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Set up Go
|
|
uses: actions/setup-go@v7
|
|
with:
|
|
go-version-file: e2e/go.mod
|
|
cache-dependency-path: e2e/go.sum
|
|
|
|
- name: Vet
|
|
run: cd e2e && go vet -tags=e2e ./...
|
|
|
|
- name: Lint
|
|
uses: golangci/golangci-lint-action@v9
|
|
with:
|
|
version: v2.13.1
|
|
working-directory: e2e
|
|
args: --build-tags=e2e --config ../backend/.golangci.yml
|
|
|
|
tests:
|
|
name: Tests
|
|
needs: vet
|
|
# generous against the docker build plus one 8m go test: a job cancelled on timeout skips
|
|
# its own failure steps, so the run would end with neither logs nor traces
|
|
timeout-minutes: 45
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Set up Go
|
|
uses: actions/setup-go@v7
|
|
with:
|
|
go-version-file: e2e/go.mod
|
|
cache-dependency-path: e2e/go.sum
|
|
|
|
# two directories: the driver (node plus the npm package) and the browser builds,
|
|
# which include firefox and webkit for the rendering tests
|
|
- name: Cache playwright driver and browsers
|
|
uses: actions/cache@v6
|
|
with:
|
|
path: |
|
|
~/.cache/ms-playwright
|
|
~/.cache/ms-playwright-go
|
|
key: playwright-${{ hashFiles('e2e/go.sum') }}
|
|
restore-keys: playwright-
|
|
|
|
- name: Build & start the stack
|
|
run: COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker compose -f compose-e2e-test.yml up -d --build --quiet-pull --wait
|
|
|
|
# no retry: a failure here is evidence about a suite too young to have a flake rate,
|
|
# and a rerun is how an intermittent regression becomes invisible. revisit when there
|
|
# are failures on record to look at
|
|
- name: Run e2e
|
|
# stamps this run's comment threads with the CI run, so a thread url in a trace or a
|
|
# log names the run it came from
|
|
env:
|
|
E2E_RUN_ID: ${{ github.run_id }}-${{ github.run_attempt }}
|
|
run: cd e2e && go test -tags=e2e -count 1 -timeout 8m -v ./...
|
|
|
|
- name: Server logs on failure
|
|
if: failure()
|
|
run: docker compose -f compose-e2e-test.yml logs --tail=200
|
|
|
|
- name: Upload browser traces
|
|
if: always()
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: playwright-traces
|
|
path: e2e/traces/
|
|
retention-days: 30
|
|
if-no-files-found: ignore
|