Перейти к содержимому

Уведомления о деплое

Хороший деплой — это три события: «начался», «закончился», «smoke-тесты прошли». Если любая стадия не пришла за разумное время — что-то зависло.

#!/usr/bin/env bash
set -eu
set -a; source /etc/notifly.env; set +a
SVC="${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" || true
docker rm "$SVC" || true
docker run -d --name "$SVC" --restart unless-stopped \
-p 8080:8080 "myrepo/$SVC:$TAG"
# smoke-тест
sleep 5
if 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" 4
else
notify "❌ Deploy $SVC: smoke-test failed" \
"Tag: $TAG, host: $HOST. /health не отвечает." 9
exit 1
fi

Использование:

Окно терминала
./deploy.sh api 1.42.0

После 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" 4
else
notify "❌ k8s rollout $SVC=$TAG FAILED" "ns=$NS — авто-rollback?" 9
kubectl -n "$NS" rollout undo deployment/"$SVC"
fi

У них есть webhooks на события деплоя. Самый простой путь — поднять тонкий прокси-эндпойнт у себя, который принимает webhook и шлёт в Notifly:

/api/deploy-hook
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, ведущий на этот эндпойнт.

Не доверяйте только 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».