Fejlesztőknek

Akadálymentességi ellenőrzés a CI-ban

Vizsgálja meg minden előnézeti telepítés fő oldalait ugyanazzal a motorral, amely az éles webhelyét felügyeli, és állítsa meg azt a pull requestet, amely súlyos akadálymentességi hibát hozna be.

A Growth (havi 500 ellenőrzött oldal) és az Agency (2000) csomag része.

Így működik

  1. 01

    Hozzon létre kulcsot

    Az irányítópult API és CI fülén. Mentse titkos változóként a CI-ban, például EQUALVIA_API_KEY néven.

  2. 02

    Adjon hozzá egy lépést

    Az előnézeti telepítés után futtassa a szkriptünket legfeljebb 10 oldal címével. Nincs függősége, Node 18 vagy újabb kell hozzá.

  3. 03

    Megkapja az eredményt

    A feladat a választott súlyosságú vagy annál rosszabb hibánál sikertelen lesz, és minden hibát felsorol az elemmel és a WCAG-kritériummal.

A CI beállítása

A szkript (/ci/equalvia-check.mjs) elindít egy ellenőrzést, megvárja az eredményt, és kiírja. GitHub Actionsben hibajelzéseket (annotation) és egy táblázatot is ad a futás összefoglalójához.

GitHub Actions: minden sikeres előnézeti telepítés után

# .github/workflows/accessibility.yml
name: Accessibility
on: deployment_status

jobs:
  equalvia:
    if: github.event.deployment_status.state == 'success'
    runs-on: ubuntu-latest
    steps:
      - name: EqualVia accessibility check
        env:
          EQUALVIA_API_KEY: ${{ secrets.EQUALVIA_API_KEY }}
          URL: ${{ github.event.deployment_status.target_url }}
        run: |
          curl -fsSL https://equalvia.com/ci/equalvia-check.mjs -o equalvia-check.mjs
          node equalvia-check.mjs "$URL/" "$URL/pricing" "$URL/contact" --fail-on serious

A Vercel, a Netlify és a legtöbb tárhely jelenti a GitHubnak az előnézeti telepítéseket, erre figyel a deployment_status esemény. Rögzített verziót szeretne? Töltse le egyszer a szkriptet, és tegye be a repositoryba, ahelyett hogy minden futásnál letöltené.

GitLab CI: a review appot telepítő feladat után

# .gitlab-ci.yml (after the job that deploys the review app)
accessibility:
  stage: test
  image: node:20
  variables:
    EQUALVIA_URLS: "$CI_ENVIRONMENT_URL/ $CI_ENVIRONMENT_URL/pricing"
  script:
    - curl -fsSL https://equalvia.com/ci/equalvia-check.mjs -o equalvia-check.mjs
    - node equalvia-check.mjs --fail-on serious

Bármely más CI (Bitbucket, CircleCI, Jenkins, Azure DevOps) ugyanígy működik: töltse le a szkriptet, és futtassa Node-dal.

A szkript kapcsolói

KapcsolóMit csinál
<url> …Az ellenőrzendő oldalak, legfeljebb 10. Vagy az EQUALVIA_URLS változóban (szóközzel elválasztva).
--fail-on <szint>A legenyhébb súlyosság, amely megállítja a feladatot: critical, serious (alapértelmezett), moderate, minor vagy none (csak jelentés).
--baseline <siteId>Csak azok a hibák számítanak, amelyek ennek a felügyelt webhelynek a legutóbbi vizsgálatában nincsenek benne. Lásd lent.
--label <szöveg>Az irányítópult ellenőrzéslistájában jelenik meg. Alapértelmezés: a CI változóiból az ág és a commit.
--locale <en|hu>A hibák címének nyelve. Alapértelmezés: a fiókjáé.
--timeout <másodperc>Meddig várjon az eredményre. Alapértelmezés: 300.
--jsonÖsszefoglaló helyett a nyers eredményt írja ki JSON-ban.

Kilépési kódok

KódJelentés
0Sikeres.
1Sikertelen: a küszöböt elérő hiba, vagy olyan oldal, amelyet nem tudtunk ellenőrizni.
2Az ellenőrzés nem futott le: hiányzó vagy visszavont kulcs, csomag, elfogyott keret, hálózat.

Csak az új hibák

Ritkán indul hibátlanul egy webhely, és ha a CI-ellenőrzés minden futáskor elbukik, hamar kikapcsolják. Baseline-nal egy oldal hibáit a felügyelt webhely legutóbbi vizsgálatának ugyanazon oldalával vetjük össze (útvonal alapján, így az előnézeti cím megtalálja az éles párját), és csak azok számítanak, amelyek ott még nincsenek meg. A webhelyen figyelmen kívül hagyott szabályokat is kihagyjuk. A webhelyek azonosítóit az irányítópult API és CI fülén vagy a GET /api/v1/sites válaszában találja.

node equalvia-check.mjs "$URL/" "$URL/pricing" --fail-on serious --baseline SITE_ID

Jó tudni

  • Az oldalaknak elérhetőnek kell lenniük az internetről, mert a szervereink töltik be őket. Védett előnézetnél használjon nyilvános staging címet vagy a tárhely megkerülési lehetőségét (Vercelnél a protection-bypass lekérdezési paramétert; ilyenkor az URL az ellenőrzéssel együtt tárolódik).
  • Egy ellenőrzés minden URL-je egy oldalt használ fel a havi keretből, az eredménytől függetlenül. A keret minden hónap elején (UTC) újraindul.
  • Ha egy oldal nem töltődik be, hibakóddal válaszol vagy hibaoldalra irányít át, az ellenőrzés sikertelen: egy hibás telepítés soha ne menjen át.
  • Az ellenőrzések a felügyelettől külön futnak: nem változtatják a webhelyei jelentését, előzményeit és az e-mail-összefoglalókat.
  • Az automatikus vizsgálat az akadálymentességi hibák nagy részét megtalálja, de nem mindet. A kiadási rutinban maradjanak meg az irányított kézi ellenőrzések is.

REST API

A szkript egy kis REST API vékony burka. Az API-t bármiből hívhatja: saját szkriptből, hibajegykezelőből vagy belső irányítópultról.

Hitelesítés

A kulcsot az Authorization fejlécben küldje: Authorization: Bearer eqv_… Minden válasz JSON. A hibák így néznek ki: {"error": {"code": "…", "message": "…"}}.

Végpontok

MetódusÚtvonalMit ad vissza
POST/api/v1/checksElindít egy ellenőrzést 1–10 URL-lel. 202-vel válaszol: a futó ellenőrzés és a kerete.
GET/api/v1/checks/{id}Egy ellenőrzés minden oldal hibáival. Kérdezze le néhány másodpercenként, amíg a status nem "running".
GET/api/v1/checksA 20 legutóbbi ellenőrzése, oldalankénti részletek nélkül.
GET/api/v1/sitesFelügyelt webhelyei a legutóbbi vizsgálat hibaszámaival.
GET/api/v1/sites/{id}/issuesEgy webhely legutóbbi vizsgálatának minden hibája: szabály, súlyosság, WCAG- és EN 301 549-hivatkozás, oldal, elem, HTML és javítási javaslat. ?locale=hu a magyar címekhez.
GET/api/v1/usageA hónapban felhasznált oldalak, a keret és az újraindulás ideje.

Ellenőrzés indítása

A POST /api/v1/checks törzse:

MezőJelentés
urlsKötelező. 1–10 abszolút http(s) URL.
failOncritical, serious (alapértelmezett), moderate, minor vagy none.
baselineSiteIdNem kötelező. Az egyik felügyelt webhelye: csak az ott nem szereplő hibák számítanak.
labelNem kötelező. Legfeljebb 120 karakter, például az ág és a commit.
localeNem kötelező. en vagy hu, a hibák címének nyelve.
curl -X POST https://equalvia.com/api/v1/checks \
  -H "Authorization: Bearer $EQUALVIA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://preview.example.com/"], "failOn": "serious"}'
curl https://equalvia.com/api/v1/checks/CHECK_ID \
  -H "Authorization: Bearer $EQUALVIA_API_KEY"

Az eredmény

A passed értéke null, amíg az ellenőrzés fut. A failing az eredményt eldöntő elemeket számolja (a failOn szintjén vagy felette, baseline-nal csak az újakat), a totals mindent, amit találtunk. Baseline-nal a newTotals, a hibák newCount mezője és az elemek new jelzője mutatja, mi új.

{
  "check": {
    "id": "cm1x8k2q40001",
    "status": "completed",
    "passed": false,
    "failOn": "serious",
    "baselineSiteId": null,
    "label": "feature/checkout @ 3f6e478",
    "pageCount": 1,
    "pagesWithErrors": 0,
    "totals": { "critical": 1, "serious": 2, "moderate": 0, "minor": 1, "total": 4 },
    "newTotals": null,
    "failing": 3,
    "pages": [
      {
        "url": "https://preview.example.com/",
        "httpStatus": 200,
        "issues": [
          {
            "ruleId": "image-alt",
            "title": "Images without alternative text",
            "impact": "critical",
            "wcag": ["1.1.1"],
            "helpUrl": "https://dequeuniversity.com/rules/axe/4.13/image-alt",
            "count": 1,
            "elements": [{ "target": ".hero > img", "html": "<img src=\"/hero.jpg\">" }]
          }
        ]
      }
    ]
  }
}

Hibák

A code mező állandó, a message embereknek szól (angolul).

HTTPKódJelentés
400INVALID_REQUESTA törzs vagy egy URL érvénytelen.
401UNAUTHORIZEDHiányzó, ismeretlen vagy visszavont kulcs.
403PLAN_REQUIREDA fiók csomagja nem tartalmaz API-hozzáférést.
403QUOTA_EXCEEDEDAz ellenőrzés túllépné a havi oldalkeretet.
404NOT_FOUND / BASELINE_NOT_FOUNDNincs ilyen ellenőrzés vagy webhely a fiókjában.
409BUSYMár 2 ellenőrzés fut.
429RATE_LIMITEDTúl sok kérés a kulccsal; lásd a Retry-After fejlécet.

Korlátok

  • Ellenőrzésenként 10 URL, fiókonként egyszerre 2 futó ellenőrzés
  • Kulcsonként percenként 120 kérés
  • Havi 500 ellenőrzött oldal a Growth, 2000 az Agency csomagban
  • Fiókonként legfeljebb 10 kulcs