Перейти к содержимому
Скрипты и CI/CD

Скрипты и CI/CD

Открыть в Markdown

CLI работает в скрипте так же, как в терминале. Дайте ей API-ключ в переменных окружения, читайте её ответы как JSON и позвольте её коду выхода сообщить скрипту, что произошло. Эта страница показывает каждое из этого, а также полные конвейеры для GitHub Actions, GitLab CI и Docker.

Как скрипт использует CLI

Развёртывание может сначала спросить Status200, открыт ли инцидент, и остановиться, если открыт:

flowchart TB J["Задание CI запускается"] --> S["Его секреты задают<br/>STATUS200_API_KEY<br/>и STATUS200_URL"] S --> Q["status200 incident count<br/>нерешённых инцидентов"] Q -->|"0"| D["Развернуть"] Q -->|"1 или<br/>больше"| X["Стоп:<br/>инцидент<br/>открыт"] Q -->|"код<br/>выхода 2"| A["Стоп:<br/>проверьте<br/>API-ключ"]

Развёртывание, которое ждёт, пока открыт инцидент

Передайте скрипту API-ключ

Задайте STATUS200_API_KEY и STATUS200_URL из секретов вашей системы CI. Тогда CLI не нужны ни login, ни файл конфигурации. Флаг по-прежнему важнее них для одной команды, а они важнее сохранённых контекстов.

Bash
export STATUS200_API_KEY="$CI_STATUS200_API_KEY"
export STATUS200_URL="https://status200.ru"
status200 incident count
Совет

Дайте каждому конвейеру собственный API-ключ только с тем доступом, который ему нужен: проверке, которая только читает, нужен ключ, который только читает. Удалите ключ в Status200, когда конвейер выводится из работы.

Если одна машина выполняет задания для нескольких проектов, сохраните контекст для каждого и указывайте его в каждой команде, чтобы задание никогда не использовало текущий контекст другого:

Bash
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, даже когда ничего не сохранено: они сообщают, что задано, но не проверяют это. Скрипт различает случаи по коду:

Bash
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, но флаг сохраняет работу скрипта, где бы он ни запускался:

Bash
# 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'

Подсчёт выводит одно число, готовое к сравнению:

Bash
OPEN=$(status200 incident count --query '{"currentIncidentState":{"isResolvedState":false}}')
echo "$OPEN incidents are open"

Создание записей из файлов

Храните записи как JSON-файлы рядом с кодом и создавайте их оттуда:

monitors/checkout-api.jsonJSON
{
  "name": "Checkout API",
  "monitorType": "Manual"
}
Bash
status200 monitor create --file monitors/checkout-api.json

Много записей из одного JSON-массива, по одному созданию на каждую:

Bash
jq -c '.[]' monitors.json | while IFS= read -r monitor; do
  status200 monitor create --data "$monitor" -o json | jq -r '._id'
done
Примечание

Каждый запуск создаёт новые записи. Чтобы держать мониторы и страницы состояния в соответствии с файлами, менять только изменившееся и удалять исчезнувшее, используйте провайдер Terraform.

Примеры конвейеров

GitHub Actions

.github/workflows/deploy.ymlYAML
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.sh

GitLab CI

.gitlab-ci.ymlYAML
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 0

Docker

DockerfileDockerfile
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 передавайте переменные при каждом запуске:

Bash
docker build -t status200-cli .
docker run --rm -e STATUS200_API_KEY -e STATUS200_URL status200-cli incident count

Дальнейшие шаги