etherpad-lite/.github/workflows/rate-limit.yml
John McLear 3113c5096f
ci(rate-limit): wait for etherpad readiness before running test (#7726)
* ci(rate-limit): wait for etherpad to be ready before running the test

The workflow starts the etherpad container in the background, then runs
`pnpm install`, then runs the test. On a warm pnpm-store the install can
finish before etherpad is listening on 9001, at which point nginx returns
502 for the test request and the run fails. Recent README-only commits
on develop hit this race on three consecutive runs.

Poll the nginx-proxied endpoint (port 8081 — also what the test uses)
until it stops returning 5xx, with a 2-minute timeout and `docker logs
etherpad-docker` on giving up to make diagnosis straightforward.

* ci(rate-limit): address Qodo review (nginx logs, tighter timeout)

- Name the nginx container so its logs can be captured when the readiness
  poll times out — previously nginx was started anonymously and a
  502 caused by nginx itself (rather than etherpad) would have been
  hard to diagnose from the workflow log alone.
- On timeout also dump `docker ps -a` for container-state visibility.
- Tighten the readiness wait: 30 iterations × (1s curl timeout + 1s
  sleep) gives ~60s budget instead of ~240s, which is still well above
  observed cold-start time and keeps the failure-fast contract.
2026-05-11 16:01:29 +01:00

95 lines
3.2 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: "rate limit"
# any branch is useful for testing before a PR is submitted
on:
push:
paths-ignore:
- "doc/**"
pull_request:
paths-ignore:
- "doc/**"
permissions:
contents: read
env:
PNPM_HOME: ~/.pnpm-store
jobs:
ratelimit:
# run on pushes to any branch
# run on PRs from external forks
if: |
(github.event_name != 'pull_request')
|| (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id)
name: test
runs-on: ubuntu-latest
steps:
-
name: Checkout repository
uses: actions/checkout@v6
- uses: actions/cache@v5
name: Cache pnpm store
with:
path: ${{ env.PNPM_HOME }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- uses: pnpm/action-setup@v6
name: Install pnpm
with:
run_install: false
- name: Use Node.js
uses: actions/setup-node@v6
with:
node-version: 22
cache: pnpm
-
name: docker network
run: docker network create --subnet=172.23.0.0/16 ep_net
-
name: build docker image
run: |
docker build -f Dockerfile -t epl-debian-slim --build-arg NODE_ENV=develop .
docker build -f src/tests/ratelimit/Dockerfile.nginx -t nginx-latest .
docker build -f src/tests/ratelimit/Dockerfile.anotherip -t anotherip .
-
name: run docker images
run: |
docker run --name etherpad-docker -p 9000:9001 --rm --network ep_net --ip 172.23.42.2 -e 'TRUST_PROXY=true' epl-debian-slim &
docker run --name nginx-docker -p 8081:80 --rm --network ep_net --ip 172.23.42.1 -d nginx-latest
docker run --rm --network ep_net --ip 172.23.42.3 --name anotherip -dt anotherip
-
name: install dependencies and create symlink for ep_etherpad-lite
run: pnpm install --frozen-lockfile
-
# The etherpad container is started in the background above; without
# this wait the test step can hit nginx before etherpad is listening
# and nginx returns 502, failing the run on a cold cache. Poll the
# nginx-proxied endpoint (which is also what the test hits) until it
# stops returning 5xx.
name: Wait for etherpad behind nginx to be ready
run: |
# ~60s budget: 30 iterations × (1s curl timeout + 1s sleep).
# Cold-start of the etherpad container is well under that.
for i in $(seq 1 30); do
if curl -fsS -o /dev/null --max-time 1 http://127.0.0.1:8081/; then
echo "etherpad is ready behind nginx"
exit 0
fi
sleep 1
done
echo "ERROR: etherpad behind nginx did not become ready in time"
echo "--- docker ps ---"
docker ps -a || true
echo "--- nginx-docker logs ---"
docker logs nginx-docker || true
echo "--- etherpad-docker logs ---"
docker logs etherpad-docker || true
exit 1
-
name: run rate limit test
run: |
cd src/tests/ratelimit
./testlimits.sh