時間のかかるコマンドの実行とAndroid通知を組み合わせる

コマンドの終了をAndroidに通知して、待ち時間に席を離れられるようにします。

準備

LinuxまたはmacOSの対話型Bashとcurlを使います。set -eが有効だと、失敗時に通知まで進まない場合があります。この短い例は本体の終了コードを保持しません。

AndroidにQueueRingをインストールし、端末登録と通知の許可を済ませて、現在のQueue IDをコピーします。端末をオンラインにしてください。

Queue IDは秘密情報です。漏えい時はアプリで再発行します。信頼できる端末で、シェルトレース(set -x)や画面録画を使わず操作してください。

成功・失敗の区別と終了コード保持が必要ならBashレシピへ

1. Queue IDを設定

Bashとcurlが使えるターミナルで操作します。AndroidのQueueRingアプリで通知を許可し、取得したQueue IDを次の入力欄に貼り付けてください。入力は表示されません。以降も同じターミナルで実行します。

Queue IDを入力
read -r -s -p "Queue ID: " QUEUE_ID; echo

2. 疎通テスト

テスト通知を送信
curl -X POST \
  -H "Content-Type: text/plain; charset=utf-8" \
  -d "Task finished" \
  "https://api.queuering.org/q/$QUEUE_ID"

AndroidにTask finishedの通知が届いたら、次へ進みます。

3. 長時間コマンドと組み合わせる

10秒後に通知
sleep 10; curl -X POST \
  -H "Content-Type: text/plain; charset=utf-8" \
  -d "Task finished" \
  "https://api.queuering.org/q/$QUEUE_ID"

sleep 10を、ビルドなど実際に使うコマンドに置き換えて利用できます。

端末で結果を確認する

AndroidにTask finishedが表示されることを確認します。通常の対話型Bashでは、セミコロンでつなぐと成功・失敗の両方で通知します。強制停止・ホスト停止・ハングは検知できません。

HTTP 202が返っても端末に通知が出ない場合は、現在のQueue ID・Androidの通知権限・端末の接続状態を先に確認してください。アプリの最近の履歴は追加の確認材料であり、配信を証明する受領記録ではありません。

補足と応用例

202は受理のみで、端末表示・履歴保存・IDの有効性は保証されません。再送により重複する場合があります。再試行は通知だけにし、ジョブやagentをやり直さないでください。HTTPエラーと再試行の対処。

ボタンはコードだけをコピーします。使えない場合はコードを選択して手動でコピーしてください。コード内の表示メッセージは英語版と共通です。

Queue IDの秘密管理の詳細

Queue IDを秘密として管理する

Queue IDを知る人は端末に通知を送れます。送信権限を与える認証情報として扱い、実IDを公開リポジトリ・Issue・ログ・スクリーンショット・プロンプト・サンプルの固定値に載せないでください。シェルトレース(set -x)、curlのverbose/trace出力、共有するターミナル録画は使わないでください。URLやプロセスの引数にIDが含まれるため、信頼できる端末でだけ実行し、プロキシやアクセスログへの記録も制限してください。

漏えいした場合は、アプリでQueue IDを再発行し、古いIDを使うすべてのローカル設定やActions secretsを更新してください。古い値を編集せず、アプリから新しい値をコピーします。202応答では古いIDがまだ有効かどうかを確認できません。

API契約・HTTPエラー・再試行

応答の意味と安全な再試行

通知とメッセージ履歴はベストエフォートです。HTTP 202はリクエストの受理を示し、Androidでの表示や履歴への保存を保証しません。無効・非アクティブ・古いQueue IDにも意図的に同じ202を返すため、IDの有効性も判断できません。履歴には端末で取得できたメッセージを最大100件保存します。履歴にないことだけでは、HTTP処理の失敗とは判断できません。

送信先はPOST https://api.queuering.org/q/{queueId}です。UTF-8のtext/plain; charset=utf-8、またはapplication/jsonを使います。JSONでは空でないbody文字列が必須で、titleは任意ですが、指定する場合は空白だけにしないでください。JSON構文も含めたリクエスト本文全体の上限は4096 bytesです。

HTTP応答と次に行うこと
結果対処
202Androidの通知権限・接続状態と、アプリの現在のQueue IDを確認します。通知が表示されないという理由だけで再送しないでください。
400リクエスト、Content-Type、JSON構文、必須フィールドを修正してから再送します。
413UTF-8本文を4096 bytes以下に短くします。JSONのエスケープも容量に含まれます。
429Retry-Afterがあれば、指定された秒数以上待ちます。なければ待ち時間を増やしながら、回数を制限して再試行します。短い間隔で繰り返さないでください。
503一時的に利用できません。障害を確認し、待ち時間を増やしながら、回数を制限して後で再試行します。
通信失敗・タイムアウト結果が不明な場合があります。接続状態を確認してから再送するか判断してください。

curlの詳細例と運用用senderは接続タイムアウト10秒・全体タイムアウト30秒で1回だけ送信します。短いcurl例と長時間コマンド例にはタイムアウト設定がありません。詳細例はHTTPステータスとRetry-Afterを含む応答ヘッダーを出力します。どの例も自動再試行しません。再送すると通知が重複する可能性があります。この例には冪等性キーはありません。再試行するのは通知だけにし、状態を知らせるためにバックアップ・デプロイ・agentの本体処理をやり直さないでください。通常のジョブログや監視を判断の根拠にしてください。

ほかのレシピを試す

すべてのレシピ · QueueRingのホーム