Gå til innhold
Skripting og CI/CD

Skripting og CI/CD

Vis som Markdown

CLI-en virker på samme måte i et skript som i en terminal. Gi den en API-nøkkel i miljøvariabler, les svarene som JSON, og la avslutningskoden fortelle skriptet hva som skjedde. Denne siden viser hver av delene, og komplette pipelines for GitHub Actions, GitLab CI og Docker.

Slik bruker et skript CLI-en

En utrulling kan først spørre Status200 om en hendelse er åpen, og stoppe hvis det er en:

flowchart TB J["CI-jobben starter"] --> S["Hemmelighetene setter<br/>STATUS200_API_KEY<br/>og STATUS200_URL"] S --> Q["status200 incident count<br/>av uløste hendelser"] Q -->|"0"| D["Rull ut"] Q -->|"1 eller flere"| X["Stopp: en hendelse<br/>er åpen"] Q -->|"avslutningskode 2"| A["Stopp: sjekk<br/>API-nøkkelen"]

En utrulling som venter mens en hendelse er åpen

Gi et skript API-nøkkelen sin

Sett STATUS200_API_KEY og STATUS200_URL fra hemmelighetene i CI-systemet ditt. CLI-en trenger da verken login eller en konfigurasjonsfil. Et flagg går fortsatt foran dem for én kommando, og de går foran lagrede kontekster.

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

Gi hver pipeline sin egen API-nøkkel med bare tilgangen den trenger: en sjekk som bare leser, trenger en nøkkel som bare leser. Slett nøkkelen i Status200 når pipelinen legges ned.

Kjører én maskin jobber for flere prosjekter, lagrer du en kontekst for hvert og nevner den i hver kommando, slik at en jobb aldri bruker en annens gjeldende kontekst:

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

Avslutningskoder

KodeBetydningFor eksempel
0Det virketEn liste, også en som ikke finner noe
1Det mislyktesStatus200 avviste forespørselen, for eksempel API error (422); ugyldig JSON; et manglende eller ukjent alternativ; en kontekst som ikke er lagret
2Ingen brukbar API-nøkkelIngen legitimasjon funnet; en ugyldig API-nøkkel; en nøkkel under abonnementet sitt (402); 401
3Ikke funnetStatus200 svarte 404: posten finnes ikke, ligger i et annet prosjekt, eller nøkkelen kan ikke lese den

whoami og context current avslutter med 0 selv når ingenting er lagret: de rapporterer hva som er satt, de sjekker det ikke. Et skript skiller tilfellene 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

Feilmeldinger går til standard feil, så incident.json inneholder bare svaret.

Les svar med jq

Skriv -o json i skript. I en pipe skriver CLI-en ut JSON uansett, men flagget holder skriptet i gang uansett hvor det kjø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 telling skriver ut ett tall, klart til å sammenligne:

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

Opprett poster fra filer

Hold poster som JSON-filer ved siden av koden din, og opprett dem derfra:

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

Mange poster fra ett JSON-array, én opprettelse for hver:

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

Hver kjøring oppretter nye poster. For å holde monitorer og statussider i takt med filer, bare endre det som er endret og fjerne det som er borte, bruker du Terraform-leverandøren.

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 legger du til STATUS200_API_KEY under repositoriets Settings → Secrets and variables → Actions; i GitLab legger du den til som en maskert CI/CD-variabel. Med Docker-bildet sender du variablene med til hver kjøring:

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

Neste steg