Go e2e/integration orchestrator for the Selenoid stack — merged Allure pyramid across hub, UI, cm and browser nodes (Go unit + Go hub/cm slices). Prod smoke target: selenoid.qa.guru (Selenoid 3).
Live SVG metrics + Allure 3 dashboard (pyramid tile testingPyramid), updated after each orchestrator run on main:
Dashboard PNG updates after each orchestrator run on main (Playwright screenshot of Allure 3 dashboard).
| Link | Description |
|---|---|
| Dashboard | Pyramid: Go unit ×3 + Go hub + Go CM |
| Awesome | Epic drill-down: selenoid, selenoid-ui, cm, webdriver-image, playwright-image, video-recorder |
| TestOps project | Cloud launches |
| CI workflow | workflow_dispatch max run: env_profile=selenoid_github_e2e |
Per-component badges: readme/badge-{selenoid,selenoid-ui,cm,webdriver-image,playwright-image,video-recorder}.svg — for hub repo READMEs.
Prod: selenoid.qa.guru — Selenoid 3 (hub/cm/UI v3.x на
main). Go pyramid наmain— gateshub-prod/hub-all; pin-ветки 2.x — frozen rollback.
Ветка Semver Назначение mainv3.0.0+ Активная prod-линия + CI orchestrator (Go) selenoid2-1.55-…-react18v2.3.0 frozen maintenance pin selenoid2-1.45-…-react16v2.2.1 frozen rollback reference Точные версии pin-веток —
STACK-PIN.mdна соответствующей ветке. Monorepo SSOT:projects/selenoid-home/README.md.
Центральный репозиторий автотестов Selenoid-стека: qa-guru/selenoid-tests.
Покрывает selenoid, selenoid-ui, cm, browser-image (playwright/ + webdriver/) — Go autotests (hub pyramid + product unit из исходных репо).
Автотесты = Go: root module github.com/qa-guru/selenoid-tests — ADR docs/ADR-go-pyramid.md. Gates: hub-prod (−cm/min/resilience + har-prod), hub-all (github full −cm). Slices: unit|api|integration|ui|webdriver|playwright|e2e|har-prod|min|resilience|cm. CI gate: go-hub + go-cm (+ go-unit matrix). @Layer("unit"): internal/* + tests/unit/fixture/ (JSON parsers). @Layer("component"): только RTL (selenoid-ui/ui).
Scope: selenoid-warm-pool/ — out of scope (deferred), не в матрице и не в CI.
| Ресурс | Ссылка | Роль |
|---|---|---|
| selenoid | github.com/qa-guru/selenoid | Hub |
| selenoid-ui | github.com/qa-guru/selenoid-ui | Web UI |
| cm | github.com/qa-guru/cm | Установщик |
| browser-image | github.com/qa-guru/browser-image | Docker browser nodes |
| selenoid-tests (этот) | github.com/qa-guru/selenoid-tests | E2e/integration ethalon |
| Docker Hub | hub.docker.com/u/qaguru | Образы qaguru/* |
Stack: prod selenoid.qa.guru — Selenoid 3 (hub/cm/UI v3.x on main). Pin-ветки 2.x — frozen rollback in git only. Browser-image — image tags, не git semver.
- Allure TestOps: проект
selenoid-tests, ALLURE_PROJECT_ID=5271 - Test layers:
@Layerkeys → TestOps mapping (e2e→ E2E Tests) — RAGtest-layers, sync:qa-guru-tms-automator/scripts/sync_testops_layer_mappings.py - Component filter:
@Componentlabel → TestOps custom field Component (cm,selenoid,selenoid-ui,playwright-image,webdriver-image,video-recorder); sync:qa-guru-tms-automator/scripts/sync_testops_component_mappings.py - Allure 3 GitHub Pages:
https://qa-guru.github.io/selenoid-tests/reports/<run-id>/(per-run URLs retained on gh-pages — CIkeep_files: true) - Dashboard:
.../reports/<run-id>/dashboard/index.html
Hub/UI smoke (testE2e, testApi, …):
cd ../dev
./scripts/build-selenoid-ui.sh
./scripts/build-selenoid.sh
./scripts/start-selenoid.sh &
./scripts/start-selenoid-ui.sh &CM integration (cm slice): Docker + cm binary; hub/UI на :4445/:8081 (dev-стек на :4444/:8080 не конфликтует).
cd ../cm && go build -o cm .
cd ../dev && ./scripts/build-selenoid-ui.sh # ui/build для cross-compile selenoid-ui
./scripts/prepare-ci-cm-workspace.sh
./scripts/start-ci-cm-stack.sh &
SELENOID_TEST_ENV=selenoid_github_cm_integration ./scripts/run-go-pyramid.sh cm# Offline
SELENOID_TEST_ENV=local_unit ./scripts/run-go-pyramid.sh unit
SELENOID_TEST_ENV=local_unit ./scripts/run-go-pyramid.sh unit
# CI push gate (github stack, −cm; +min/resilience)
PYRAMID_STAND=selenoid_github ./scripts/run-go-pyramid.sh hub-all
# Prod cloud gate (−cm/−min/−resilience + har-prod)
PYRAMID_STAND=selenoid_qa_guru ./scripts/run-go-pyramid.sh hub-prod
# Single slices (stand from PYRAMID_STAND or SELENOID_TEST_ENV)
./scripts/run-go-pyramid.sh api
./scripts/run-go-pyramid.sh integration
./scripts/run-go-pyramid.sh ui
./scripts/run-go-pyramid.sh webdriver
./scripts/run-go-pyramid.sh playwright
./scripts/run-go-pyramid.sh e2e
./scripts/run-go-pyramid.sh min
./scripts/run-go-pyramid.sh resilience
./scripts/run-go-pyramid.sh cm
./scripts/run-go-pyramid.sh har-prod
# Allure report (local, after a run)
./scripts/allure-report.sh generateStand override: PYRAMID_STAND=selenoid_github → env selenoid_github_api, selenoid_github_integration, …
Profile override: SELENOID_TEST_ENV=selenoid_qa_guru_api ./scripts/run-go-pyramid.sh api
Profiles: selenoid_qa_guru_api, selenoid_qa_guru_e2e — remote hub https://selenoid.qa.guru (auth user1:1234 in properties; e2e uiUrl embeds credentials for Capabilities create-session XHR).
SELENOID_TEST_ENV=selenoid_qa_guru_api ./scripts/run-go-pyramid.sh api
PYRAMID_STAND=selenoid_qa_guru ./scripts/run-go-pyramid.sh hub-prod
SELENOID_TEST_ENV=selenoid_qa_guru_e2e ./scripts/run-go-pyramid.sh har-prod
# UI smoke subset:
SELENOID_TEST_ENV=selenoid_qa_guru_e2e ./scripts/run-go-pyramid.sh uiPost-deploy: selenoid.qa.guru → Actions → trigger-deploy-smoke → repository_dispatch deploy-smoke → this repo (skip_go_unit, env_profile=selenoid_qa_guru_api, default tags api only).
Release smoke vs deploy smoke: selenoid-ui release.yml dispatches api,smoke after polling prod /ui/status for the new UI pin (wait_for_prod_ui_version). Image publish alone is not a deploy — pre-pin smoke against transitional/old prod is a race, not a product regression. Post-deploy trigger from selenoid.qa.guru remains the hub/api gate (tags api by default; UI e2e gate is the waited release-smoke).
Prod caveats (nginx): hub API uses raw GET /hub/status via hubStatusPath (not UI /status with .state). GET /logs/{id} — nginx → hub (auth); UI uses /ws/logs/{id}.
UI e2e canon (v3): root → #/statistics; Sessions archive (ex-Videos) → #/sessions + .archive__list; New Session (ex-Capabilities) → #/new-session; status tiles → Connected / Issue / Unknown; VNC → [data-testid=vnc-window].vnc-window--connected.
Hub на :4444 и Docker-образ из fixtures/ci-browsers.json / dev/browsers.json:
cd dev && ./scripts/start-selenoid.sh &
docker pull qaguru/playwright-chromium:1.61.1 # или ./scripts/pull-browser-images.sh
PYRAMID_STAND=selenoid_github ./scripts/run-go-pyramid.sh playwrightВ CI scripts/start-ci-selenoid-stack.sh тянет образы из fixtures/ci-browsers.json (chrome + firefox + msedge warm + playwright-chromium).
Образ в fixtures/ci-browsers.json; endpoint — selenoid_github_min_integration.properties (VNC/video off). Входит в hub-all (min slice).
./scripts/run-go-pyramid.sh min| Package | Layer | Tag |
|---|---|---|
tests/unit/fixture/min |
unit | min |
tests/integration/min |
integration | min |
Workflow: .github/workflows/selenoid_github-orchestrator.yml (name: selenoid-tests Tests).
| Job | Что делает |
|---|---|
go-unit (matrix) |
Checkout qa-guru/selenoid, selenoid-ui, cm → Go unit → Allure |
go-hub |
CI gate — run-go-pyramid.sh; push/github → hub-all; prod profile → hub-prod; dispatch test_tags → slice |
go-cm |
Push (non-prod): run-go-pyramid.sh cm (CM :4445/:8081) |
report |
Merge build/allure-results/** → Allure 3 → gh-pages → TestOps 5271 |
# Go unit+unit JSON parsers (offline, −cm)
SELENOID_TEST_ENV=local_unit ./scripts/run-go-pyramid.sh unit
SELENOID_TEST_ENV=local_unit ./scripts/run-go-pyramid.sh unit
# Go api (prod cloud)
SELENOID_TEST_ENV=selenoid_qa_guru_api ./scripts/run-go-pyramid.sh api
# Go prod gate (hub-prod semantics + har-prod)
PYRAMID_STAND=selenoid_qa_guru ./scripts/run-go-pyramid.sh hub-prod
# Go CI push gate (github stack, −cm)
PYRAMID_STAND=selenoid_github ./scripts/run-go-pyramid.sh hub-all
# Go HAR prod smoke
SELENOID_TEST_ENV=selenoid_qa_guru_e2e ./scripts/run-go-pyramid.sh har-prodworkflow_dispatch: test_tags=integration|api|smoke|playwright → Go slice; env_profile=selenoid_qa_guru_* → hub-prod.
Пирамида: unit → component → integration → api → e2e → manual. Go hub — пакеты ниже; Go unit — отдельно в go-unit.
Матрица (Selenoid 3 / main): hub/ui/cm/browser-image покрыты Go pyramid + product Go unit. warm-pool — OUT.
| Component | unit | component | integration | api | e2e | manual | CI push |
|---|---|---|---|---|---|---|---|
| selenoid | Go | — | Go | Go | Go (wd/pw) | — | go-unit + go-hub |
| selenoid-ui | Go | RTL | Go | Go | Go | —⁶ | go-unit + go-hub |
| cm | Go | — | Go | Go | Go | — | go-unit + go-cm |
| playwright-image | Go¹ | — | Go | Go | Go | — | go-hub |
| webdriver-image | Go | — | Go | Go | Go | — | go-hub |
| video-recorder | — | Go | — | Go | — | — | go-hub (api slice / dispatch) |
| dev | — | —² | —³ | — | — | ✓ | — |
| selenoid-qa-guru | — | — | — | —⁴ | —⁵ | ✓ | deploy-smoke dispatch |
¹ selenoid e2e: отдельного @Component("selenoid") e2e-пакета нет; сквозной hub-path покрыт tests/e2e/webdriver и tests/e2e/playwright в hub-all. JSON fixture parsers — @Layer("unit"), tests/unit/fixture/, не component.
² dev unit (JSON fixtures): browsers.json SSOT — tests/unit/fixture/*CatalogJsonTest, BrowsersConfigJsonTest.
³ dev integration: start-ci-selenoid-stack.sh — оркестрация CI, не test-class.
⁴ cloud api: post-deploy selenoid_qa_guru_api через trigger-deploy-smoke / repository_dispatch — не локальный класс в этой матрице.
⁵ cloud e2e: профиль selenoid_qa_guru_e2e — manual / расширенный deploy-smoke.
⁶ selenoid-ui manual: video playback — runbook (ниже); VNC viewer — Go tests/e2e/ui (prod profile selenoid_qa_guru_e2e).
⁷ playwright-image / webdriver-image unit: catalog JSON + session body — tests/unit/fixture/ + internal/config (@Layer("unit")).
| Сценарий | Где | Как |
|---|---|---|
| Локальный стек hub/UI | ../dev/README.md |
build-selenoid*.sh + start-selenoid*.sh |
| Prod hub smoke | selenoid-qa-guru |
./deploy/smoke-remote.sh https://selenoid.qa.guru |
| VNC viewer в UI | selenoid-ui | Go tests/e2e/ui (run-go-pyramid.sh ui) |
| Video playback | selenoid-ui | Сессия с enableVideo → /video/ в UI |
| CM install на чистый хост | cm + autotests-cloud | deploy/deploy.sh / Actions deploy |
| Полный hub pyramid локально | этот репо | PYRAMID_STAND=selenoid_github ./scripts/run-go-pyramid.sh hub-all |
После docker-push в release.yml:
| Репо | Secret | event-type |
|---|---|---|
| qa-guru/selenoid | SELENOID_TESTS_DISPATCH_TOKEN |
deploy-smoke |
| qa-guru/selenoid-ui | SELENOID_TESTS_DISPATCH_TOKEN |
deploy-smoke |
| qa-guru/cm | SELENOID_TESTS_DISPATCH_TOKEN |
deploy-smoke |
qa-guru/browser-image publish.yml |
SELENOID_TESTS_DISPATCH_TOKEN |
deploy-smoke |
qa-guru/browser-image publish-webdriver.yml |
SELENOID_TESTS_DISPATCH_TOKEN |
deploy-smoke |
qa-guru/browser-image publish-video-recorder.yml |
SELENOID_TESTS_DISPATCH_TOKEN |
deploy-smoke |
Payload: source_repo, source_ref, source_version, test_tags, опционально source_variant (playwright | webdriver | video-recorder), source_browser (chrome | firefox | msedge), webdriver_variant (warm | min).
WebDriver dispatch: chrome warm → Go webdriver; chrome min → Go integration/min; firefox/msedge → Go tests/integration/wd browser slice.
TestOps launch name: Deploy smoke — {source_repo} {source_version} #{run}.
Ручная проверка:
gh api repos/qa-guru/selenoid-tests/dispatches --input - <<'EOF'
{"event_type":"deploy-smoke","client_payload":{"source_repo":"qa-guru/selenoid","source_version":"manual","test_tags":"api"}}
EOFПирамида: unit → component → integration → api → e2e → manual.
| Package / slice | Layer | Notes |
|---|---|---|
internal/config, internal/helpers, internal/hubapi |
unit | offline pure logic |
tests/unit/fixture, tests/unit/fixture/min |
unit | JSON fixture parsers (@Tag("min") on min catalog) |
tests/integration/wd, tests/integration/ui, tests/integration/pw, tests/integration/min, tests/integration/resilience |
integration | hub stack |
tests/api |
api | hub + UI + video-recorder |
tests/e2e/ui, tests/e2e/webdriver, tests/e2e/playwright, tests/e2e/har |
e2e | browser / HAR |
tests/cm/... |
cm pyramid | :4445/:8081; CI go-cm |
scripts/run-go-unit.sh |
product unit | selenoid / selenoid-ui / cm repos |
CM api locally: ./scripts/start-ci-cm-stack.sh then SELENOID_TEST_ENV=selenoid_github_cm_integration ./scripts/run-go-pyramid.sh cm.
| Key | Default |
|---|---|
| apiBaseUrl | "" (→ hubUrl) |
| hubStatusPath | /status (prod cloud: /hub/status — raw hub via nginx) |
| hubUrl | http://127.0.0.1:4444/ |
| uiUrl | http://127.0.0.1:8080/ |
| remoteUrl | http://127.0.0.1:4444/wd/hub |
| cmHubPort | 4445 (CM installer; dev hub stays :4444) |
| cmUiPort | 8081 |
| playwrightWsEndpoint | ws://127.0.0.1:4444/playwright/playwright-chromium/1.61.1 |
| browser / browserVersion | chrome / 149.0 (warm chrome API + e2e) |
| chromeVersion | 149.0 |
| chromeMinVersion | 149.0-min |
| firefoxVersion | 151.0 |
| firefoxMinVersion | 151.0-min |
| msedgeVersion | 145.0 |
| msedgeMinVersion | 145.0-min |
Override: env SELENOID_TEST_*, plain hubUrl/uiUrl/… in process env, or keys in src/test/resources/config/*.properties.