Skip to content

GitLab CI — алерт когда pipeline висит дольше N минут

GitLab pipeline иногда зависает в running на час+ (runner потерял связь, или job висит в curl без timeout) — увидишь только когда merge request «не двигается».

Рецепт

bash
#!/usr/bin/env bash
# /etc/cron.d/gitlab-stuck
# */10 * * * * root /opt/gitlab-stuck.sh

PROJECT_ID=${GITLAB_PROJECT_ID}
TOKEN=${GITLAB_TOKEN}
HOST=${GITLAB_HOST:-gitlab.com}
MAX_MIN=${MAX_MIN:-30}

PIPES=$(curl -fsS -H "PRIVATE-TOKEN: $TOKEN" \
  "https://$HOST/api/v4/projects/$PROJECT_ID/pipelines?status=running&per_page=50")

NOW=$(date -u +%s)
STUCK=0
echo "$PIPES" | jq -c '.[]' | while read p; do
  ID=$(echo "$p" | jq -r .id)
  CREATED=$(echo "$p" | jq -r .created_at)
  CTS=$(date -ud "$CREATED" +%s)
  AGE_MIN=$(( (NOW - CTS) / 60 ))

  if [ "$AGE_MIN" -gt "$MAX_MIN" ]; then
    STUCK=$((STUCK + 1))
    echo "stuck pipeline #$ID — ${AGE_MIN}m running"
  fi
done

if [ "$STUCK" -gt 0 ]; then
  curl -fsS "$HEARTBEAT_URL" --data "stuck=$STUCK"
  exit 2
fi
echo "OK (no stuck pipelines)"

То же самое в Enterno.io

Подключите этот скрипт к Enterno heartbeat — алерт сразу в Telegram + история «когда последний раз pipeline зависал» без построения собственного dashboard в Grafana.

Настроить API monitor → ← Все рецепты

Похожие рецепты