Gå til indhold
Scripting og CI/CD

Scripting og CI/CD

Vis som Markdown

CLI'en virker på samme måde i et script som i en terminal. Giv den en API-nøgle i miljøvariabler, læs dens svar som JSON, og lad dens exitkode fortælle scriptet, hvad der skete. Denne side viser hver af delene og komplette pipelines til GitHub Actions, GitLab CI og Docker.

Sådan bruger et script CLI'en

En udrulning kan først spørge Status200, om en hændelse er åben, og stoppe, hvis der er en:

flowchart TB J["CI-jobbet starter"] --> S["Dets hemmeligheder sætter<br/>STATUS200_API_KEY<br/>og STATUS200_URL"] S --> Q["status200 incident count<br/>af uløste hændelser"] Q -->|"0"| D["Udrul"] Q -->|"1 eller flere"| X["Stop: en hændelse<br/>er åben"] Q -->|"exitkode 2"| A["Stop: tjek<br/>API-nøglen"]

En udrulning, der venter, mens en hændelse er åben

Giv et script dets API-nøgle

Sæt STATUS200_API_KEY og STATUS200_URL fra dit CI-systems hemmeligheder. CLI'en behøver så hverken login eller en konfigurationsfil. Et flag går stadig forud for dem for én kommando, og de går forud for gemte kontekster.

Bash
export STATUS200_API_KEY="$CI_STATUS200_API_KEY"
export STATUS200_URL="https://status200.ru"
status200 incident count
Tip

Giv hver pipeline sin egen API-nøgle med kun den adgang, den har brug for: et tjek, der kun læser, har brug for en nøgle, der kun læser. Slet nøglen i Status200, når pipelinen nedlægges.

Kører én maskine job for flere projekter, så gem en kontekst for hvert og nævn den i hver kommando, så et job aldrig bruger et andets aktuelle kontekst:

Bash
status200 --context production incident count
status200 --context staging monitor count

Exitkoder

KodeBetydningFor eksempel
0Det lykkedesEn liste, også en, der ikke finder noget
1Det mislykkedesStatus200 afviste anmodningen, for eksempel API error (422); ugyldig JSON; en manglende eller ukendt indstilling; en kontekst, der ikke er gemt
2Ingen brugbar API-nøgleIngen legitimationsoplysninger fundet; en ugyldig API-nøgle; en nøgle under sit abonnement (402); 401
3Ikke fundetStatus200 svarede 404: posten findes ikke, ligger i et andet projekt, eller nøglen må ikke læse den

whoami og context current afslutter med 0, også når intet er gemt: de rapporterer, hvad der er sat, de tjekker det ikke. Et script skelner tilfældene på koden:

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

Fejlmeddelelser går til standard-fejl, så incident.json kun indeholder svaret.

Læs svar med jq

Skriv -o json i scripts. I en pipe udskriver CLI'en alligevel JSON, men flaget holder scriptet kørende, uanset hvor det kører:

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'

En optælling udskriver ét tal, klar til at sammenligne:

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

Opret poster fra filer

Hold poster som JSON-filer ved siden af din kode, og opret dem derfra:

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

Mange poster fra ét JSON-array, én oprettelse for hver:

Bash
jq -c '.[]' monitors.json | while IFS= read -r monitor; do
  status200 monitor create --data "$monitor" -o json | jq -r '._id'
done
Bemærk

Hver kørsel opretter nye poster. Vil du holde monitorer og statussider i takt med filer, kun ændre det, der ændrede sig, og fjerne det, der er væk, så brug Terraform-provideren.

Eksempler på pipelines

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"]

I GitHub Actions tilføjer du STATUS200_API_KEY under repositoriets Settings → Secrets and variables → Actions; i GitLab tilføjer du den som en maskeret CI/CD-variabel. Med Docker-imaget sender du variablerne med til hver kørsel:

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

Næste skridt