Skip to content

ネイティブビルドをwebhookでトリガーする

Capgo 通常、ビルドはラップトップまたはCIジョブから開始されます。管理画面から出荷するチームは 管理画面、CMS、または内部ポータルは、単一の HTTP Webhook:自分のUIでボタンを押すと、署名されたネイティブビルドが始まります。このガイドでは、標準パターンを示します。—あなたのcodeホストに、署名されたHTTPコールを送信し、同じCapgoビルドワークフローを実行します。

あなたは 必要ありません Capgoを公開する「ビルドWebhook」を公開する必要はありません。CIには署名シークレットがすでにあります。Webhookの仕事は、安全にCIジョブを開始することだけです。

  • A Capgo Build workflow that already works from the __CAPGO_KEEP_0__アクション の__CAPGO_KEEP_0__ワークフローが機能していることGitHub)
  • 細かい粒度のGitHubトークン、GitLab トリガートークン、または同等の許可
  • 管理者ダッシュボードが送信する共有シークレット (ヘッダーまたはボディ)

GitHubは、有効なAPI呼び出しを受け取って、Webhookを待機するワークフローを開始します。 repository_dispatch。どのダッシュボードでも POST JSON形式のデータを送信できます。

1. Webhookを待機するワークフロー

セクション「1. Webhookを待機するワークフロー」

ペイロードを検証する 作業を始める前に、問題を提起して議論する チェックアウトと、秘密情報を扱うステップの前に。受け入れた値をジョブ出力/環境変数を通じて — 組み込みせず client_payload 直接 run: スクリプト (スクリプトのインジェクションに関するガイドライン).

github/workflows/capgo-build-webhook.yml
name: Capgo Build (Webhook)
on:
repository_dispatch:
types: [capgo-native-build]
jobs:
validate:
runs-on: ubuntu-latest
outputs:
platform: ${{ steps.check.outputs.platform }}
mode: ${{ steps.check.outputs.mode }}
ref: ${{ steps.check.outputs.ref }}
platforms_json: ${{ steps.check.outputs.platforms_json }}
steps:
- id: check
env:
RAW_PLATFORM: ${{ github.event.client_payload.platform }}
RAW_MODE: ${{ github.event.client_payload.mode }}
RAW_REF: ${{ github.event.client_payload.ref }}
DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
run: |
PLATFORM="${RAW_PLATFORM:-android}"
MODE="${RAW_MODE:-release}"
REF="${RAW_REF:-$DEFAULT_BRANCH}"
case "$PLATFORM" in ios|android|both) ;; *)
echo "Invalid platform: $PLATFORM" >&2; exit 1;;
esac
case "$MODE" in debug|release) ;; *)
echo "Invalid mode: $MODE" >&2; exit 1;;
esac
# Allowlist branches / tags / full SHAs only
if [[ ! "$REF" =~ ^(main|master|production|release/[A-Za-z0-9._-]+|[0-9a-f]{40})$ ]]; then
echo "Ref not allowlisted: $REF" >&2
exit 1
fi
if [ "$PLATFORM" = "both" ]; then
PLATFORMS_JSON='["ios","android"]'
else
PLATFORMS_JSON=$(printf '["%s"]' "$PLATFORM")
fi
{
echo "platform=$PLATFORM"
echo "mode=$MODE"
echo "ref=$REF"
echo "platforms_json=$PLATFORMS_JSON"
} >> "$GITHUB_OUTPUT"
build:
needs: validate
runs-on: ubuntu-latest
environment: ${{ needs.validate.outputs.mode == 'release' && 'production' || 'build-debug' }}
strategy:
fail-fast: false
matrix:
platform: ${{ fromJSON(needs.validate.outputs.platforms_json) }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ needs.validate.outputs.ref }}
- uses: actions/setup-node@v6
with:
node-version: '24'
cache: 'npm'
- run: npm ci
- run: npm run build
- name: Sync native project
env:
PLATFORM: ${{ matrix.platform }}
run: npx cap sync "$PLATFORM"
- name: Capgo Build
env:
CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
CAPGO_IOS_PROVISIONING_MAP: ${{ secrets.CAPGO_IOS_PROVISIONING_MAP }}
APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
ANDROID_KEYSTORE_FILE: ${{ secrets.ANDROID_KEYSTORE_FILE }}
KEYSTORE_KEY_ALIAS: ${{ secrets.KEYSTORE_KEY_ALIAS }}
KEYSTORE_KEY_PASSWORD: ${{ secrets.KEYSTORE_KEY_PASSWORD }}
KEYSTORE_STORE_PASSWORD: ${{ secrets.KEYSTORE_STORE_PASSWORD }}
PLAY_CONFIG_JSON: ${{ secrets.PLAY_CONFIG_JSON }}
PLATFORM: ${{ matrix.platform }}
MODE: ${{ needs.validate.outputs.mode }}
run: |
npx @capgo/cli@latest build request com.example.app \
--platform "$PLATFORM" \
--build-mode "$MODE"

GitHub アプリのインストールトークン (または細かい粒度のパーソナル アクセス トークン) を作成し 内容: 読み取りと書き込み リポジトリ上 ( __CAPGO_KEEP_0__ のために必要) repository_dispatchそれをブラウザに保存しないようにしてください — 保存するのは管理画面のバックエンドだけです。

3. Webhookを管理画面から呼び出す

セクション「3. Webhookを管理画面から呼び出す」

バックエンド(ユーザー側ブラウザではない)が送信するものは:

ターミナル画面
curl -X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/OWNER/REPO/dispatches \
-d '{
"event_type": "capgo-native-build",
"client_payload": {
"platform": "both",
"mode": "release",
"ref": "main",
"requested_by": "admin@example.com"
}
}'
フィールド目的
event_type「目的」は types ワークフロー内でcapgo-native-build)
client_payload.platformios, androidまたは both
client_payload.modedebug ブランチまたはタグをビルドする(任意) release
client_payload.ref目的は

Wire ですべてのJSON POSTをボタンに接続してください(管理画面の「ネイティブアプリをビルドする」ボタン)。ダッシュボードは「 あなたの バックエンド; バックエンドは保持しています GITHUB_TOKEN.

オプション B — 任何ホストの小型プロキシ ウェブホック

「オプション B — 任何ホストの小さなプロキシ Webhook」

もし管理者ツールがURLを制御するPOSTのみに対応している場合(Zapier、Make、Cloudflareワーカー、Expressルート)、GitHubの前に短いプロキシを置くことができます。

// Example Cloudflare Worker / Node handler (sketch)
export default {
async fetch(request, env) {
if (request.method !== 'POST') {
return new Response('Method not allowed', { status: 405 })
}
if (request.headers.get('x-webhook-secret') !== env.WEBHOOK_SECRET) {
return new Response('Unauthorized', { status: 401 })
}
const body = await request.json().catch(() => ({}))
const platform = body.platform || 'both'
const mode = body.mode || 'release'
const ref = body.ref || 'main'
if (!['ios', 'android', 'both'].includes(platform)) {
return new Response('Invalid platform', { status: 400 })
}
if (!['debug', 'release'].includes(mode)) {
return new Response('Invalid mode', { status: 400 })
}
if (!/^(main|master|production|release\/[A-Za-z0-9._-]+|[0-9a-f]{40})$/.test(ref)) {
return new Response('Ref not allowlisted', { status: 400 })
}
const res = await fetch(
`https://api.github.com/repos/${env.GITHUB_OWNER}/${env.GITHUB_REPO}/dispatches`,
{
method: 'POST',
headers: {
Accept: 'application/vnd.github+json',
Authorization: `Bearer ${env.GITHUB_TOKEN}`,
'X-GitHub-Api-Version': '2022-11-28',
},
body: JSON.stringify({
event_type: 'capgo-native-build',
client_payload: { platform, mode, ref },
}),
},
)
return new Response(res.status === 204 ? 'Build queued' : await res.text(), {
status: res.status === 204 ? 200 : res.status,
})
},
}

次に、管理者製品を設定してください。

設定
URLhttps://your-worker.example.com/native-build
メソッドPOST
ヘッダーx-webhook-secret: <shared secret>
本文{ "platform": "both", "mode": "release" }

通常、Webhookを管理画面に接続する際の形状は、管理画面が1つのURLと1つのシークレットを保持し、CapgoのクレデンシャルはGitHubのアクション内に残ります。

GitLabは pipeline トリガー トークン Webhookの自然的なターゲットです。

# .gitlab-ci.yml fragment
capgo_native_webhook:
stage: build
script:
- npm ci && npm run build
- npx cap sync "${PLATFORM:-android}"
- npx @capgo/cli@latest build request com.example.app --platform "${PLATFORM:-android}" --build-mode "${BUILD_MODE:-release}"
rules:
- if: '$CI_PIPELINE_SOURCE == "trigger"'

トリガー トークンを作成する 設定 → CI/CD → パイプライン トリガー トークン、そして管理画面から

ターミナル ウィンドウ
curl -X POST \
-F token=$GITLAB_TRIGGER_TOKEN \
-F ref=main \
-F "variables[PLATFORM]=android" \
-F "variables[BUILD_MODE]=release" \
https://gitlab.com/api/v4/projects/PROJECT_ID/trigger/pipeline

両方のプラットフォームでは、2 つのトリガーを発火するか、GitHub の例と同様にジョブを並列マトリックスに展開する必要があります。

プラットフォームWebhook メカニズム
Bitbucketパイプライン トリガー URL またはカスタムパイプライン + アプリパスワード POST
Azure DevOpsPipeline run REST API PATを使用して、手動パイプラインから CI UIからトリガー

パターンは同じです:管理者 → 秘密のチェック → ホスト API → Capgo ビルドジョブ

管理ツール用ペイロードチェックリスト

「管理ツール用ペイロードチェックリスト」のセクション

ダッシュボードフォームが作成されたときに、少なくとも以下の情報を収集する必要があります。

  • プラットフォーム — ios / android / 両方
  • モード — debug (QA) or release (store)
  • Git ref — branch or tag to build
  • Actor — メールアドレスまたはユーザIDで、監査ログに記録します (パススルー) client_payload)

Optional: 連続実行後、CIは管理者にダウンロードURLを送信するように設定できます API --output-record / build last-output.

セキュリティ

セキュリティ
  • Webhookを認証する (x-webhook-secret許可リスト
  • , そして platform, modeSecurity ref プロキシとワークフロー両方で validate ジョブ — 取り扱い client_payload 信頼できない入力として
  • 受け入れた値を環境変数/ジョブ出力として通過し、ペイロードフィールドをスクリプトに埋め込まない。 run: __CAPGO_KEEP_0__/GitLab トークンはサーバー側のみに保管する。
  • Keep GitHub/GitLab tokens server-side only.
  • プロキシを制限する;ネイティブビルドはビルド分数でコストがかかる。
  • ストアにリリースする場合、
  • 保護された__CAPGO_KEEP_0__環境にマップする(サンプルに示されているように)または追加の確認フラグをチェックする必要がある。 release to a protected GitHub Environment (as in the sample) or require an extra confirmation flag checked in validate.
関連ガイド