Скрипты и CI/CD
CLI работает в скрипте так же, как в терминале. Дайте ей API-ключ в переменных окружения, читайте её ответы как JSON и позвольте её коду выхода сообщить скрипту, что произошло. Эта страница показывает каждое из этого, а также полные конвейеры для GitHub Actions, GitLab CI и Docker.
Как скрипт использует CLI
Развёртывание может сначала спросить Status200, открыт ли инцидент, и остановиться, если открыт:
Развёртывание, которое ждёт, пока открыт инцидент
Передайте скрипту API-ключ
Задайте STATUS200_API_KEY и STATUS200_URL из секретов вашей системы CI. Тогда CLI не нужны ни login, ни файл конфигурации. Флаг по-прежнему важнее них для одной команды, а они важнее сохранённых контекстов.
export STATUS200_API_KEY="$CI_STATUS200_API_KEY"
export STATUS200_URL="https://status200.ru"
status200 incident countДайте каждому конвейеру собственный API-ключ только с тем доступом, который ему нужен: проверке, которая только читает, нужен ключ, который только читает. Удалите ключ в Status200, когда конвейер выводится из работы.
Если одна машина выполняет задания для нескольких проектов, сохраните контекст для каждого и указывайте его в каждой команде, чтобы задание никогда не использовало текущий контекст другого:
status200 --context production incident count
status200 --context staging monitor countКоды выхода
| Код | Значение | Например |
|---|---|---|
0 | Получилось | Список, даже такой, который ничего не нашёл |
1 | Не получилось | Status200 отклонил запрос, например API error (422); недопустимый JSON; отсутствующий или неизвестный параметр; несохранённый контекст |
2 | Нет пригодного API-ключа | Учётные данные не найдены; недействительный API-ключ; ключ ниже своего плана (402); 401 |
3 | Не найдено | Status200 ответил 404: записи нет, она в другом проекте или ключ не может её читать |
whoami и context current завершаются с 0, даже когда ничего не сохранено: они сообщают, что задано, но не проверяют это. Скрипт различает случаи по коду:
status200 incident get "$INCIDENT_ID" -o json > incident.json
case $? in
0) echo "Saved the incident to incident.json" ;;
2) echo "Check STATUS200_API_KEY and STATUS200_URL" >&2; exit 1 ;;
3) echo "There is no incident $INCIDENT_ID" >&2; exit 1 ;;
*) echo "Status200 refused the request" >&2; exit 1 ;;
esacСообщения об ошибках идут в стандартный поток ошибок, поэтому incident.json содержит только ответ.
Чтение ответов с jq
Пишите -o json в скриптах. В конвейере CLI и так выводит JSON, но флаг сохраняет работу скрипта, где бы он ни запускался:
# The title of each incident
status200 incident list -o json | jq -r '.[].title'
# The ID of a new monitor
MONITOR_ID=$(status200 monitor create --data '{"name":"Checkout API","monitorType":"Manual"}' -o json | jq -r '._id')
# When each incident was created: dates come as objects
status200 incident list -o json | jq -r '.[] | "\(.createdAt.value) \(.title)"'
# The newest 100 incidents as CSV
status200 incident list --limit 100 -o json | jq -r '.[] | [._id, .title, .createdAt.value] | @csv'Подсчёт выводит одно число, готовое к сравнению:
OPEN=$(status200 incident count --query '{"currentIncidentState":{"isResolvedState":false}}')
echo "$OPEN incidents are open"Создание записей из файлов
Храните записи как JSON-файлы рядом с кодом и создавайте их оттуда:
{
"name": "Checkout API",
"monitorType": "Manual"
}status200 monitor create --file monitors/checkout-api.jsonМного записей из одного JSON-массива, по одному созданию на каждую:
jq -c '.[]' monitors.json | while IFS= read -r monitor; do
status200 monitor create --data "$monitor" -o json | jq -r '._id'
doneКаждый запуск создаёт новые записи. Чтобы держать мониторы и страницы состояния в соответствии с файлами, менять только изменившееся и удалять исчезнувшее, используйте провайдер Terraform.
Примеры конвейеров
GitHub Actions
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Install the Status200 CLI
run: npm install -g @status200/cli
- name: Stop while an incident is open
env:
STATUS200_API_KEY: ${{ secrets.STATUS200_API_KEY }}
STATUS200_URL: https://status200.ru
run: |
OPEN=$(status200 incident count --query '{"currentIncidentState":{"isResolvedState":false}}')
if [ "$OPEN" -gt 0 ]; then
echo "$OPEN incidents are open: not deploying."
exit 1
fi
- name: Deploy
run: ./deploy.shGitLab CI
check-incidents:
stage: test
image: node:lts
variables:
STATUS200_URL: https://status200.ru
script:
- npm install -g @status200/cli
- OPEN=$(status200 incident count --query '{"currentIncidentState":{"isResolvedState":false}}')
- echo "$OPEN incidents are open"
- test "$OPEN" -eq 0Docker
FROM node:lts-slim
RUN npm install -g @status200/cli
ENTRYPOINT ["status200"]В GitHub Actions добавьте STATUS200_API_KEY в разделе Settings → Secrets and variables → Actions репозитория; в GitLab добавьте её как маскированную переменную CI/CD. С образом Docker передавайте переменные при каждом запуске:
docker build -t status200-cli .
docker run --rm -e STATUS200_API_KEY -e STATUS200_URL status200-cli incident count