Уведомления о деплое
Хороший деплой — это три события: «начался», «закончился», «smoke-тесты прошли». Если любая стадия не пришла за разумное время — что-то зависло.
Простой deploy.sh с уведомлениями
Заголовок раздела «Простой deploy.sh с уведомлениями»#!/usr/bin/env bashset -euset -a; source /etc/notifly.env; set +aSVC="${1:?service name}"TAG="${2:?image tag}"HOST=$(hostname -s)START=$(date +%s)
notify() { local title="$1" msg="$2" prio="${3:-5}" curl -s --max-time 5 \ "$NOTIFLY_URL/message?token=$NOTIFLY_TOKEN" \ -H "Content-Type: application/json" \ -d "$(jq -n --arg t "$title" --arg m "$msg" --argjson p "$prio" \ '{title:$t, message:$m, priority:$p}')" >/dev/null}
trap 'notify "❌ Deploy $SVC FAILED" "Tag: $TAG, host: $HOST, line: $LINENO" 9' ERR
notify "🚀 Deploy $SVC started" "Tag: $TAG → $HOST" 5
docker pull "myrepo/$SVC:$TAG"docker stop "$SVC" || truedocker rm "$SVC" || truedocker run -d --name "$SVC" --restart unless-stopped \ -p 8080:8080 "myrepo/$SVC:$TAG"
# smoke-тестsleep 5if curl -fs --max-time 5 http://localhost:8080/health >/dev/null; then DUR=$(( $(date +%s) - START )) notify "✅ Deploy $SVC OK" "Tag: $TAG, ${DUR}s, smoke OK" 4else notify "❌ Deploy $SVC: smoke-test failed" \ "Tag: $TAG, host: $HOST. /health не отвечает." 9 exit 1fiИспользование:
./deploy.sh api 1.42.0Kubernetes
Заголовок раздела «Kubernetes»После kubectl rollout:
SVC="api"NS="prod"TAG="1.42.0"
kubectl -n "$NS" set image deployment/"$SVC" "$SVC=myrepo/$SVC:$TAG"
if kubectl -n "$NS" rollout status deployment/"$SVC" --timeout=5m; then notify "✅ k8s rollout $SVC=$TAG OK" "ns=$NS" 4else notify "❌ k8s rollout $SVC=$TAG FAILED" "ns=$NS — авто-rollback?" 9 kubectl -n "$NS" rollout undo deployment/"$SVC"fiVercel / Netlify / похожие PaaS
Заголовок раздела «Vercel / Netlify / похожие PaaS»У них есть webhooks на события деплоя. Самый простой путь — поднять тонкий прокси-эндпойнт у себя, который принимает webhook и шлёт в Notifly:
export default async function (req, res) { const {state, name, deploy_url} = req.body || {}; const ok = state === 'ready' || state === 'success'; await fetch(`${process.env.NOTIFLY_URL}/message?token=${process.env.NOTIFLY_TOKEN}`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ title: (ok ? '✅' : '❌') + ` ${name}: ${state}`, message: `URL: ${deploy_url || '-'}`, priority: ok ? 4 : 9, }), }); res.status(204).end();}В настройках Vercel/Netlify добавьте webhook URL, ведущий на этот эндпойнт.
Smoke-тест после деплоя
Заголовок раздела «Smoke-тест после деплоя»Не доверяйте только healthcheck-у — добавьте «бизнес-проверку»:
RESP=$(curl -s -o /dev/null -w "%{http_code}" \ -H "X-Test: 1" \ https://api.example.com/v1/users/me)[ "$RESP" = "401" ] && notify "✅ Smoke OK ($RESP)" "/users/me требует auth — норм" 3 || \ notify "❌ Smoke FAIL ($RESP)" "/users/me ответил неожиданным кодом" 9- Видно поток. Старт-конец, длительность каждой стадии.
- Smoke-тест встроен в нотификацию — если «✅» нет, что-то зависло.
- Канарейка для PaaS: если за неделю не было ни одного
ready, что-то с CI или с подключением.
Что улучшить дальше
Заголовок раздела «Что улучшить дальше»- Прислать diff коммитов между деплоями (
git log $OLD..$NEW --oneline). - Отдельные каналы Notifly для prod / staging — разные звуки и цвета.
- При rollback — присылать причину: «откат, потому что smoke /users/me вернул 500».