ci: every workflow and job carries a human-readable Russian name

Owner decision (chat, 2026-08-27): the running check's name must say what it
does, in Russian. Scripts locate workflows by file name (release-gate.mjs ->
validate.yml), so display names are free; job ids and needs are untouched.
The same content is cherry-picked to main because release workflows execute
from the default branch and process.yml must stay identical in main and dev.

Issue: #327
User-Visible: no
This commit is contained in:
Codex
2026-08-27 18:46:53 +03:00
parent ec957a7c88
commit 1a8b480355
9 changed files with 37 additions and 9 deletions
+2 -1
View File
@@ -1,4 +1,4 @@
name: Announce release
name: Анонс релиза
# Telegram notifications for t.me/ha_houseplan (owner request, 2026-08-07).
# Stable releases are announced; prereleases are deliberately silent.
# workflow_dispatch exists purely as a connectivity test button and therefore
@@ -36,6 +36,7 @@ permissions:
contents: read
jobs:
telegram:
name: Оповещение в Telegram (только стабильные)
if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'release' && github.event.release.prerelease == false) || (github.event_name == 'workflow_call' && inputs.prerelease == false) }}
runs-on: ubuntu-latest
steps:
+2 -1
View File
@@ -9,7 +9,7 @@
# локально через `npm run docs:accept -- --reviewed --from=<распакованный>`.
# Та же конструкция, что у golden-эталонов, и по той же причине: картинки
# попадают в репозиторий через явное решение, а не через бота.
name: Docs screenshots
name: Скриншоты документации
on:
workflow_dispatch:
@@ -24,6 +24,7 @@ permissions:
jobs:
capture:
name: Съёмка и сверка скриншот-индекса
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
+2 -1
View File
@@ -1,4 +1,4 @@
name: Mutation gate
name: Мутационный гейт
# Реестр известных поломок (issue #85): каждый мутант ломает продуктовый код
# известным способом, и объявленный тест ОБЯЗАН на этом покраснеть. Тест,
@@ -31,6 +31,7 @@ concurrency:
jobs:
mutants:
name: "Мутанты: каждый обязан красить тесты"
runs-on: ubuntu-latest
# Все мутанты × (сборка + свой guard) — это десятки минут, и это нормально:
# гейт предрелизный. Час — потолок против зависшего Chromium.
+2 -1
View File
@@ -1,4 +1,4 @@
name: Full Performance
name: Полные бенчмарки производительности
on:
# Every main promotion is a stable-release candidate and must have an
@@ -24,6 +24,7 @@ concurrency:
jobs:
performance:
name: Бенчмарки рендера и геометрии
# Every profile keeps base and candidate sequential on one hosted runner.
# Independent profile pairs run in parallel: cross-profile timing is never
# compared, while serialising all five pairs cannot fit the job timeout.
+3 -1
View File
@@ -1,4 +1,4 @@
name: Process
name: Ревью-конвейер
# Событийный конвейер процесса (PROCESS.md). Смена статусной метки — это
# сообщение: она порождает событие, событие запускает следующий шаг.
@@ -35,6 +35,7 @@ permissions:
jobs:
guard:
name: "Страж: ребейз на dev и предпосылки ревью"
runs-on: ubuntu-latest
outputs:
stage: ${{ steps.decide.outputs.stage }}
@@ -162,6 +163,7 @@ jobs:
echo "limit=$limit" >> "$GITHUB_OUTPUT"
review:
name: "Ревью (Claude): вердикт в issue"
needs: guard
if: needs.guard.outputs.stage != ''
runs-on: ubuntu-latest
+5 -1
View File
@@ -1,4 +1,4 @@
name: Publish prerelease
name: Публикация пре-релиза (ручная)
run-name: Publish ${{ inputs.tag }}
on:
@@ -19,6 +19,7 @@ concurrency:
jobs:
gate:
name: "Гейт: зелёная Проверка и релизный контракт"
runs-on: ubuntu-latest
outputs:
sha: ${{ steps.candidate.outputs.sha }}
@@ -61,6 +62,7 @@ jobs:
run: node scripts/release-gate.mjs "$SHA"
publish:
name: Публикация тега и релиза
needs: gate
runs-on: ubuntu-latest
outputs:
@@ -198,6 +200,7 @@ jobs:
# A manual step after a successful release is the worst kind: by the time it is
# due, the work already looks finished, which is exactly why it gets forgotten.
close-merged:
name: Закрытие вошедших issue
needs: [gate, publish]
if: ${{ needs.publish.outputs.newly_published == 'true' }}
runs-on: ubuntu-latest
@@ -245,6 +248,7 @@ jobs:
}
announce:
name: Комментарий о публикации
needs: [gate, publish]
if: ${{ needs.publish.outputs.newly_published == 'true' }}
uses: ./.github/workflows/announce.yml
+2 -1
View File
@@ -1,4 +1,4 @@
name: Attach HACS zip to release
name: HACS-zip к релизу
# hacs.json declares zip_release + filename=houseplan.zip, so every release
# (prereleases included) must carry the asset — HACS installs from it and
# GitHub's public download counter becomes a free per-version install metric
@@ -19,6 +19,7 @@ permissions:
contents: write
jobs:
zip:
name: Собрать houseplan.zip и приложить к релизу
runs-on: ubuntu-latest
steps:
- name: Resolve tag
+4 -1
View File
@@ -1,4 +1,4 @@
name: Release
name: "Релиз: ассеты после зелёной проверки"
on:
release:
types: [published]
@@ -14,6 +14,7 @@ jobs:
# Needs a push with a token that has the `workflow` scope (the ordinary
# Personal Access Token used for `git push` refuses workflow file updates).
gate:
name: "Гейт: зелёная Проверка точного SHA тега"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
@@ -44,6 +45,7 @@ jobs:
SHA=$(git rev-parse HEAD)
node scripts/release-gate.mjs "$SHA" --workflow=performance.yml --label="Full Performance"
build:
name: Сборка бандла и загрузка ассетов
needs: gate
runs-on: ubuntu-latest
steps:
@@ -71,6 +73,7 @@ jobs:
with:
files: dist/houseplan-card.js
hacs-discovery:
name: HACS-видимость пре-релиза (порядок бет)
# HACS 2.0.x takes the first prerelease in GitHub's response instead of
# sorting SemVer. A valid asset can therefore be invisible to beta users
# (beta.10 appeared after beta.9). Keep the release asset, but
+15 -1
View File
@@ -1,4 +1,4 @@
name: Validate
name: Проверка (CI)
on:
push:
@@ -22,6 +22,7 @@ concurrency:
jobs:
docs:
name: "Документация: гайды, ченджлоги, скриншот-индекс"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
@@ -34,6 +35,7 @@ jobs:
# совпадать в `main` и `dev`. До этой проверки совпадение держалось на
# дисциплине: каждая правка требовала двух пушей и ручной сверки.
process-workflow-sync:
name: "Процесс: process.yml идентичен в main и dev"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
@@ -53,6 +55,7 @@ jobs:
fi
provenance:
name: "Провенанс коммитов: трейлеры и эталоны"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
@@ -76,6 +79,7 @@ jobs:
# где нарушение правила №1 ловится машиной. Job независимый: краснеет сам и
# не роняет остальные, откат — удалить его отсюда, скрипт остаётся рабочим.
process-gate:
name: "Процессный гейт: диапазон, трейлеры, статусы issue"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
@@ -104,6 +108,7 @@ jobs:
# экономят на ветках задач, где Validate — ранний сигнал: настоящую приёмку
# там делает код-ревью, которое гоняет гейты само (#127).
changes:
name: Классификация изменённых файлов
runs-on: ubuntu-latest
outputs:
frontend: ${{ steps.classify.outputs.frontend }}
@@ -158,6 +163,7 @@ jobs:
# CARD_VERSION и package.json входят в фингерпринт, поэтому ключи кандидата
# заведомо новые и полный набор гейтов перед бетой и релизом идёт всегда.
reuse:
name: "Переиспользование: это дерево уже проверено"
runs-on: ubuntu-latest
outputs:
smoke: ${{ steps.probe.outputs.smoke }}
@@ -237,6 +243,7 @@ jobs:
waive backend "$BACKEND"
hacs:
name: "HACS: валидация репозитория"
needs: changes
if: needs.changes.outputs.integration == 'true'
runs-on: ubuntu-latest
@@ -248,6 +255,7 @@ jobs:
category: integration
hassfest:
name: "Hassfest: манифест интеграции"
needs: changes
if: needs.changes.outputs.integration == 'true'
runs-on: ubuntu-latest
@@ -257,6 +265,7 @@ jobs:
uses: home-assistant/actions/hassfest@master
frontend:
name: "Фронтенд: типы, юниты, мутанты, синхрон бандла"
needs: changes
if: needs.changes.outputs.frontend == 'true'
runs-on: ubuntu-latest
@@ -278,6 +287,7 @@ jobs:
run: cmp dist/houseplan-card.js custom_components/houseplan/frontend/houseplan-card.js
smoke:
name: Смоки в браузере (шард ${{ matrix.shard }} из 3)
# Gated on `frontend` so a typecheck failure does not burn browser minutes.
needs: [frontend, reuse]
if: needs.reuse.outputs.smoke != 'true'
@@ -350,6 +360,7 @@ jobs:
# Маркер переиспользования пишется ОДИН раз и только когда прошли все шарды:
# частично прогнанная матрица не имеет права выглядеть как выполненная работа.
smoke_done:
name: "Смоки: все шарды зелёные"
needs: [smoke, reuse]
if: needs.reuse.outputs.smoke != 'true'
runs-on: ubuntu-latest
@@ -370,6 +381,7 @@ jobs:
key: reuse-smoke-${{ needs.reuse.outputs.smoke_key }}
golden:
name: Golden-кадры против принятых эталонов
# Deterministic visual correctness stays in every prerelease gate: it is
# inexpensive and catches a different class of regressions than timings.
needs: [frontend, reuse]
@@ -432,6 +444,7 @@ jobs:
key: reuse-golden-${{ needs.reuse.outputs.golden_key }}
performance_smoke:
name: "Перф-смок: бюджет времени кадра"
# Candidate-only catastrophic-regression guard for ordinary pushes and
# prereleases. The expensive same-runner comparison lives in performance.yml.
needs: [frontend, reuse]
@@ -494,6 +507,7 @@ jobs:
key: reuse-performance_smoke-${{ needs.reuse.outputs.performance_smoke_key }}
backend:
name: "Бэкенд: pytest в Home Assistant"
needs: [changes, reuse]
if: needs.changes.outputs.backend == 'true' && needs.reuse.outputs.backend != 'true'
runs-on: ubuntu-latest