Scripts e CI/CD
A CLI funciona em um script do mesmo jeito que em um terminal. Dê a ela uma chave de API em variáveis de ambiente, leia as respostas dela como JSON e deixe o código de saída dela dizer ao script o que aconteceu. Esta página mostra cada uma dessas coisas, e pipelines completos para GitHub Actions, GitLab CI e Docker.
Como um script usa a CLI
Uma implantação pode primeiro perguntar ao Status200 se há um incidente aberto, e parar se houver:
Uma implantação que espera enquanto há um incidente aberto
Dar a um script sua chave de API
Defina STATUS200_API_KEY e STATUS200_URL a partir dos segredos do seu sistema de CI. A CLI então não precisa de login nem de arquivo de configuração. Uma flag ainda vem antes delas para um único comando, e elas vêm antes dos contextos salvos.
export STATUS200_API_KEY="$CI_STATUS200_API_KEY"
export STATUS200_URL="https://status200.ru"
status200 incident countDê a cada pipeline uma chave de API própria, com só o acesso de que ele precisa: uma verificação que só lê precisa de uma chave que só lê. Exclua a chave no Status200 quando o pipeline for desativado.
Se uma máquina executa jobs de vários projetos, salve um contexto para cada um e nomeie-o em cada comando, para que um job nunca use o contexto atual de outro:
status200 --context production incident count
status200 --context staging monitor countCódigos de saída
| Código | Significado | Por exemplo |
|---|---|---|
0 | Funcionou | Uma listagem, mesmo uma que não encontra nada |
1 | Falhou | O Status200 recusou a requisição, como API error (422); JSON inválido; uma opção ausente ou desconhecida; um contexto que não está salvo |
2 | Nenhuma chave de API utilizável | Credenciais não encontradas; uma chave de API inválida; uma chave abaixo do seu plano (402); 401 |
3 | Não encontrado | O Status200 respondeu 404: o registro não existe, está em outro projeto, ou a chave não pode lê-lo |
whoami e context current terminam com 0 mesmo quando nada está salvo: eles informam o que está definido, não o verificam. Um script distingue os casos pelo código:
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 ;;
esacAs mensagens de erro vão para a saída de erro padrão, então incident.json contém só a resposta.
Ler respostas com jq
Escreva -o json nos scripts. Em um pipe a CLI imprime JSON de qualquer forma, mas a flag mantém o script funcionando onde quer que ele rode:
# 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'Uma contagem imprime um único número, pronto para comparar:
OPEN=$(status200 incident count --query '{"currentIncidentState":{"isResolvedState":false}}')
echo "$OPEN incidents are open"Criar registros a partir de arquivos
Mantenha os registros como arquivos JSON ao lado do seu código, e crie-os a partir dali:
{
"name": "Checkout API",
"monitorType": "Manual"
}status200 monitor create --file monitors/checkout-api.jsonMuitos registros a partir de um array JSON, uma criação para cada um:
jq -c '.[]' monitors.json | while IFS= read -r monitor; do
status200 monitor create --data "$monitor" -o json | jq -r '._id'
doneCada execução cria registros novos. Para manter monitores e páginas de status em sincronia com arquivos, alterar só o que mudou e remover o que saiu, use o provedor Terraform.
Exemplos de pipelines
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"]No GitHub Actions, adicione STATUS200_API_KEY em Settings → Secrets and variables → Actions do repositório; no GitLab, adicione-a como uma variável de CI/CD mascarada. Com a imagem Docker, passe as variáveis a cada execução:
docker build -t status200-cli .
docker run --rm -e STATUS200_API_KEY -e STATUS200_URL status200-cli incident count