Быстрый старт
Что нужно заранее
Заголовок раздела «Что нужно заранее»Токен бота и chat id. Если нет ни того, ни другого:
- Напиши @BotFather, отправь
/newbotи сохрани выданный токен. Выглядит как123456789:AAHdqTcv.... - Добавь бота в нужный чат или канал. Для канала он должен быть администратором.
- Узнай chat id. Проще всего — отправить одно сообщение в чат и прочитать его обратно:
curl -s "https://api.telegram.org/bot<TOKEN>/getUpdates" | grep -o '"chat":{"id":[-0-9]*'Id групп и супергрупп отрицательные и обычно начинаются с -100. Публичный канал можно
адресовать как @channelusername.
Проверь токен до того, как что-то настраивать:
NOTIFLOW_BOT_TOKEN=<TOKEN> notiflow whoami# Notiflow (@notiflow_bot, id=123456789)Action за 60 секунд
Заголовок раздела «Action за 60 секунд»Положи токен и chat id в secrets репозитория и добавь один шаг в конец нужного job:
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - run: make test
- uses: jtprogru/notiflow@v2 if: always() with: bot_token: ${{ secrets.TELEGRAM_BOT_TOKEN }} chat_id: ${{ secrets.TELEGRAM_CHAT_ID }} status: ${{ job.status }}if: always() важен: без него шаг пропускается, когда job упал, — то есть ровно тогда,
когда сообщение и нужно.
status приходится передавать явно. Дефолты входов composite action не видят контекст
job, поэтому notiflow не может подставить его сам.
По умолчанию сообщение приходит на success, failure и cancelled, со встроенным
шаблоном. Чтобы получать только про падения:
with: bot_token: ${{ secrets.TELEGRAM_BOT_TOKEN }} chat_id: ${{ secrets.TELEGRAM_CHAT_ID }} status: ${{ job.status }} notify_on: failureCLI за 60 секунд
Заголовок раздела «CLI за 60 секунд»brew install jtprogru/tap/notiflow # или: cargo install notiflowexport NOTIFLOW_BOT_TOKEN=123456789:AAHdqTcv...export NOTIFLOW_CHAT_ID=-1001234567890
notiflow send --message "деплой закончился"Всё, что пришло на stdin, становится телом сообщения — notiflow нормально живёт в конце пайплайна:
./deploy.sh 2>&1 | tail -20 | notiflow send --stdinШаблоны работают и вне Actions: репозиторий, ветка и коммит берутся из локального git,
когда переменных GITHUB_* нет:
notiflow send --template '{{.StatusEmoji}} выкатил `{{.ShortSha}}` из {{.Branch}}'Посмотреть, что даёт шаблон, ничего не отправляя:
notiflow render --template '{{.Repo}} @ {{.ShortSha}}' --explain- Установка — все способы получить бинарь
- Справочник Action — все входы и выходы
- Шаблоны — полный список плейсхолдеров и приоритеты
- Надёжность — ретраи, ошибки, exit-коды