スクリプト & CI/CD
CLI はスクリプトでもターミナルと同じように動作します。API キーを環境変数で渡し、応答を JSON として読み、何が起きたかを終了コードでスクリプトに伝えます。このページでは、それぞれの方法と、GitHub Actions、GitLab CI、Docker 用の完全なパイプラインを紹介します。
スクリプトでの CLI の使い方
デプロイは、まず Status200 にインシデントが未解決かどうかを尋ね、未解決なら止めることができます。
インシデントが未解決の間は待つデプロイ
スクリプトに API キーを渡す
CI システムのシークレットから STATUS200_API_KEY と STATUS200_URL を設定します。そうすれば CLI に login も設定ファイルも必要ありません。1 つのコマンドについてはフラグがこれらより優先され、これらは保存したコンテキストより優先されます。
export STATUS200_API_KEY="$CI_STATUS200_API_KEY"
export STATUS200_URL="https://status200.ru"
status200 incident countパイプラインごとに、必要なアクセスだけを持つ専用の API キーを用意してください。読み取るだけのチェックには、読み取るだけのキーが必要です。パイプラインを廃止したら、そのキーを Status200 で削除してください。
1 台のマシンで複数のプロジェクトのジョブを実行する場合は、プロジェクトごとにコンテキストを保存し、すべてのコマンドでそれを指定して、ジョブがほかのジョブの現在のコンテキストを使わないようにします。
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'件数の取得は数値を 1 つだけ出力するので、そのまま比較できます。
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.json1 つの JSON 配列から多数のレコードを、1 件ずつ作成します。
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 では、リポジトリの Settings → Secrets and variables → Actions に STATUS200_API_KEY を追加します。GitLab では、マスクされた CI/CD 変数として追加します。Docker イメージでは、実行のたびに変数を渡します。
docker build -t status200-cli .
docker run --rm -e STATUS200_API_KEY -e STATUS200_URL status200-cli incident count