本稿は、リモート Mac 上の OpenClaw ゲートウェイが Bitbucket リポジトリ Webhook(Pipelines 完了や repo:commit_status_updated など)を受けたあと、依存プリフライトを走らせ、ビルド要約を HTTP で戻すまでを、コピー可能なパラメータ列で最小再現する手順です。インストールと排障失敗時のリトライ設計と併読すると、launchd の PATH ずれや署名不一致の切り分けが速くなります。

前提条件:Node/OpenClaw onboard、トークン分離、最小権限

Node.js 22.16 以上または 24 系 LTS を対話シェルと launchd で同一バイナリに固定し、openclaw doctor で確認。CLI は npm i -g openclaw 等で入れ onboard 済みから開始します。

ゲートウェイは 127.0.0.1 のみ待受け、外向きはリバプロ+トンネル。トークンは分離:Bearer(例 OPENCLAW_GATEWAY_TOKEN)、Webhook SecretBB_WEBHOOK_SECRET)、要約先 APICALLBACK_TOKEN)。clone は App Password の Repositories: Read または読み取り専用 Deploy key のみ。

launchd の plist に EnvironmentVariablesPATHNODE_EXTRA_CA_CERTSNPM_CONFIG_CACHECOMPOSER_HOME を明示し、シェル専用 nvm 依存を避けます。

Webhook 設定:URL・Secret・イベント・配信ログの見方

Repository settings → Webhooks で HTTPS URL と Secret(再表示不可のため即保管)を登録。イベントは Pipeline 完了系を主とし、必要なら repo:pushrepo:commit_status_updated。マトリクスは集約後の一通知に寄せると再送が減ります。

ログに残すヘッダ:X-Event-KeyX-Hook-UUIDX-Attempt-NumberX-Request-UUIDX-Hub-SignatureX-Hub-Signature-256sha256=)。Recent deliveries とゲートウェイ access ログを時刻で突合します。

プリフライトスクリプトの直列:浅い clone・dry-run・ログの tee

mktemp -d で隔離し git clone --depth 1BITBUCKET_COMMIT またはペイロードの SHA で git checkout。共有ツリー連続実行は避けます。

PHP なら例えば次を 順に実行し、全体をファイルへ tee します(末尾数十行だけ要約 JSON に載せる想定)。

composer validate --no-check-publish --no-interaction 2>&1 | tee -a "$LOG" composer install --dry-run --no-dev --no-interaction 2>&1 | tee -a "$LOG"

Node は npm ci --dry-run または本番寄りなら npm ci --prefer-offline --no-audit --no-fundtimeout 600 等で上限を付け、終了コードと秒数を要約へ。パターンは Jenkins 汎用 Webhook 版とも整合します。

要約の回帰:JSON ペイロード・Bearer・指数バックオフ・ ACK の切り離し

Webhook 応答はまず 速やかに 200。重処理はワーカーへ。戻し先 JSON に repositorycommitpipeline_uuidpreflight_okduration_seclog_tail などを含めます。

curl -sS -X POST "$CALLBACK_URL" \ -H "Authorization: Bearer $CALLBACK_TOKEN" \ -H "Content-Type: application/json" \ --connect-timeout 5 --max-time 25 \ -d "$SUMMARY_JSON"

502 等は 2・4・8 秒バックオフで最大 5 回。残りはディスク退避し cron 再送。TLS 誤りは NODE_EXTRA_CA_CERTS を先に確認します。

FAQ/エラーとログの当たり所

X-Hub-Signature が一致しない

JSON をパースしてから再シリアライズしたバイト列で HMAC していませんか。受信した生ボディに対して HMAC-SHA256 し、sha256= 以降をタイミングセーフに比較します。Secret の末尾改行・プロキシによるボディ改変も疑い、Recent deliveries の raw payload とゲートウェイの受信ログを突き合わせます。

Recent deliveries が 401/接続拒否

リバプロが Authorization: Bearer をゲートウェイまで透過しているか、URL パスに必須のプレフィックスが抜けていないかを確認します。Mac ローカルだけで試すときは curl -v で同一ヘッダを再現し、pf/ファイアウォールで 127.0.0.1 のみ許可しているかも見ます。

同じ Pipeline から Webhook が複数届く

Bitbucket は応答失敗時に X-Attempt-Number を増やして再送します。X-Request-UUID または pipeline UUID で処理済みを記録し、二重プリフライトを防ぎます。

プリフライトだけ失敗する

隔離ディレクトリの権限、COMPOSER_CACHE_DIR/npm キャッシュ、HTTPS プロキシ環境変数、package-lock.jsoncomposer.lock の欠落を順に確認します。tee したログ全文パスを要約 JSON に含めておくと、後追いが速くなります。

まとめ:生ボディ HMAC・イベント絞り込み・隔離プリフライト・Bearer 付き要約 POST・指数バックオフが、Bitbucket × OpenClaw の最小安定セットです。常駐ゲートウェイ向けのマシンは MacPull ホーム、契約・リージョンは 購入ページ、SSH や初期セットは ヘルプセンター を参照ください(いずれもログイン不要)。一覧は 技術ブログ から。

常駐ゲートウェイ向け

リモート Mac で Bitbucket 連携を安定ホストする

ホームヘルプセンター購入ページはログイン不要です。プラン比較は 料金ページ をご利用ください。

複数リージョン
SSH
柔軟な契約
サポート