mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
Три вещи, которые аудит 12.09 назвал в §10. **Перемещаемые ссылки.** `home-assistant/actions/hassfest@master` и `hacs/action@main` — это произвольный будущий коммит чужой ветки, а ревьюера с Read/Write/Bash запускал перемещаемый major `anthropics/claude-code-action@v1`. Все 116 `uses:` в девяти воркфлоу закреплены полным SHA с комментарием-версией; `scripts/action-pins.mjs` это проверяет, а предполётный вердикт Validate — исполняет. Локальная переиспользуемая workflow пина не требует и исключена явно. **Права.** Один блок `permissions` на весь конвейер выдавал `issues: write` и OIDC каждой стадии, включая единственную недоверенную — работу модели. Теперь права выдаются по job: модели только чтение и OIDC для самой `claude-code-action`, писать в issue умеют детерминированные стадии. **Граница.** Разбор запечатанного результата переехал из inline-shell в `scripts/review-result-gate.mjs` — не ради красоты, а потому что в YAML его нельзя прогнать ни одним отрицательным случаем. Проверяются те же вещи, что и раньше, и в том же объёме: точный набор файлов, контрольные суммы, схема паспорта и совпадение КАЖДОГО из семнадцати полей с тем, что посчитала детерминированная стадия. Сверху — пятнадцать враждебных фикстур: неполный набор, лишний файл, подменённое содержимое, чужой run и попытка, устаревший material_sha и tree, чужие задача, этап, раунд и ветка, вердикт вне словаря, пустой документ, manifest не о тех файлах, неразбираемый JSON. Настоящих секретов и привилегированных операций фикстуры не трогают. Issue: #556 User-Visible: no
90 lines
3.8 KiB
YAML
90 lines
3.8 KiB
YAML
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
|
|
# remains allowed to send a test message.
|
|
# #538: НЕТ триггера `release: published`. Три воркфлоу висели на одном событии
|
|
# и бежали параллельно, а анонсу нечего было проверять — он выигрывал гонку
|
|
# всегда. 12.09 v1.75.0 объявили в канале в ту же минуту, когда гейт ассетов
|
|
# отказал: релиз остался без `houseplan-card.js`, E2E не выполнялся вовсе, а
|
|
# подписчики получили сообщение. Анонс вызывается только после того, как работа
|
|
# сделана: `release.yml` зовёт его после выкладки ассетов,
|
|
# `publish-prerelease.yml` — после публикации беты.
|
|
on:
|
|
workflow_dispatch: {}
|
|
workflow_call:
|
|
inputs:
|
|
reusable:
|
|
required: true
|
|
type: boolean
|
|
tag:
|
|
required: true
|
|
type: string
|
|
release_name:
|
|
required: true
|
|
type: string
|
|
url:
|
|
required: true
|
|
type: string
|
|
prerelease:
|
|
required: true
|
|
type: boolean
|
|
ref:
|
|
required: true
|
|
type: string
|
|
secrets:
|
|
TELEGRAM_BOT_TOKEN:
|
|
required: true
|
|
TELEGRAM_CHAT_ID:
|
|
required: true
|
|
permissions:
|
|
contents: read
|
|
jobs:
|
|
telegram:
|
|
name: Оповещение в Telegram (только стабильные)
|
|
if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_call' && inputs.prerelease == false) }}
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Check out release notes for a reusable call
|
|
if: ${{ inputs.reusable == true }}
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
with:
|
|
ref: ${{ inputs.ref }}
|
|
- name: Send to Telegram
|
|
env:
|
|
TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
|
|
CHAT: ${{ secrets.TELEGRAM_CHAT_ID }}
|
|
CALLED: ${{ inputs.reusable }}
|
|
INPUT_TAG: ${{ inputs.tag }}
|
|
INPUT_NAME: ${{ inputs.release_name }}
|
|
INPUT_URL: ${{ inputs.url }}
|
|
INPUT_PRE: ${{ inputs.prerelease }}
|
|
EVENT: ${{ github.event_name }}
|
|
run: |
|
|
set -euo pipefail
|
|
if [ "$EVENT" = "workflow_dispatch" ] && [ "$CALLED" != "true" ]; then
|
|
TEXT="✅ Тест: оповещения о релизах houseplan-card подключены."
|
|
else
|
|
# Единственный путь к сообщению о релизе — вызов из воркфлоу, который
|
|
# уже закончил работу (#538). Тело берётся из файла заметок ветки
|
|
# тега, а не из события: события здесь больше нет.
|
|
TAG=$INPUT_TAG
|
|
NAME=$INPUT_NAME
|
|
URL=$INPUT_URL
|
|
PRE=$INPUT_PRE
|
|
BODY=$(cat docs/RELEASE-NOTES.md)
|
|
if [ "$PRE" = "true" ]; then
|
|
echo "Prerelease Telegram announcement is disabled"
|
|
exit 0
|
|
fi
|
|
KIND="🏠 Релиз"
|
|
SUMMARY=$(printf '%s' "$BODY" | head -c 2500)
|
|
TEXT=$(printf '%s houseplan-card %s — %s\n\n%s\n\n%s' \
|
|
"$KIND" "$TAG" "$NAME" "$SUMMARY" "$URL")
|
|
fi
|
|
curl -sS --fail-with-body -X POST \
|
|
"https://api.telegram.org/bot$TOKEN/sendMessage" \
|
|
--data-urlencode "chat_id=$CHAT" \
|
|
--data-urlencode "text=$TEXT" \
|
|
-d disable_web_page_preview=true
|