원본 빌드를 웹훅으로 트리거하세요
복사할 수 있는 준비
Capgo Build is normally started from a laptop or CI job. Teams that ship from an __CAPGO_KEEP_0__ Build는 일반적으로 노트북이나 CI 작업에서 시작됩니다. 팀이 어드민 데스크톱에서 배포하는 경우웹훅 HTTP 웹훅: code 호스트에 대한 얇은 인증 HTTP 호출이 시작됩니다. 이 호스트는 Capgo 빌드 워크플로를 실행합니다.
구조
구조 제목sequenceDiagram participant Admin as Admin dashboard participant Hook as Webhook endpoint participant CI as GitHub / GitLab participant Capgo as Capgo Build Admin->>Hook: POST /native-build (secret) Hook->>CI: repository_dispatch / pipeline trigger CI->>CI: checkout, npm ci, cap sync CI->>Capgo: build request Capgo-->>CI: signed binary / store upload
당신은 아니 Capgo를 공개하는 '빌드 웹후크'를 노출할 필요가 없습니다. CI가 이미 서명 비밀을 가지고 있습니다. 웹후크의 역할은 CI 작업을 안전하게 시작하는 것입니다.
필수 조건
필수 조건 제목- Capgo 빌드 워크플로우가 CI UI에서 이미 작동하는 경우 또는 푸시 ( __CAPGO_KEEP_0__ 액션 __CAPGO_KEEP_0__GitHub)
- GitHub 생성을 위한 세부 권한
- 관리자 대시보드가 보낼 공유 비밀
Option A — GitHub repository_dispatch (권장)
Option A — GitHub repository_dispatch (권장)GitHub은 인증된 API 호출을 받고 GitHub이 웹후크를 듣는 워크플로우를 시작합니다. repository_dispatch. 어떤 대시보드든 POST JSON을 지원하는 대시보드가
1. 웹후크를 듣는 워크플로우
Section titled “1. 웹후크를 듣는 워크플로우”웹후크 페이로드를 검증합니다. __CAPGO_KEEP_1__ : before (웹사이트 개발에 앞서 이슈를 생성하고 논의하는 것에 대해) 체크아웃과 비밀을 담고 있는 단계 전에. 작업 결과 / 환경 변수를 통해 승인된 값을 전달하십시오 — interpolate를 사용하지 마십시오. client_payload 직접으로 run: 스크립트 (스크립트 주입 지침).
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"2. GitHub 토큰을 생성하십시오
제목 ‘2. GitHub 토큰을 생성하십시오’GitHub 앱 설치 토큰(또는 GitHub 개인 액세스 토큰)과 함께 내용: 읽기 및 쓰기 저장소에 (__CAPGO_KEEP_0__ 빌드 웹 훅을 위해) repository_dispatch관리자 백엔드에만 저장하십시오 — 브라우저에 저장하지 마십시오.
3. 웹 훅을 관리자 대시보드에서 호출하세요.
제목: 3. 웹 훅을 관리자 대시보드에서 호출하세요.백엔드(브라우저가 아닌)는 다음과 같이 전송해야 합니다:
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.platform | ios, android또는 both |
client_payload.mode | debug 또는 release |
client_payload.ref | Branch 또는 Tag를 빌드할 수 있습니다. |
__CAPGO_KEEP_0__ __CAPGO_KEEP_1__ __CAPGO_KEEP_0__ GITHUB_TOKEN.
Option B — Tiny proxy webhook (any host)
Option B — Tiny proxy webhook (any host)If the admin tool can only POST to a URL you control (Zapier, Make, Cloudflare Worker, Express route), put a short proxy in front of 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, }) },}__CAPGO_KEEP_1__
| __CAPGO_KEEP_0__ | 가치 |
|---|---|
| URL | https://your-worker.example.com/native-build |
| 메서드 | POST |
| 헤더 | x-webhook-secret: <shared secret> |
| 본문 | { "platform": "both", "mode": "release" } |
웹훅을 관리자 대시보드에 연결하는 일반적인 형태는 대시보드에서 하나의 URL과 하나의 비밀 키를 저장하고 Capgo 자격 증명은 GitHub 액션에 남아 있습니다.
GitLab Pipeline Trigger
GitLab Pipeline Trigger 섹션GitLab은 pipeline trigger 토큰 natural webhook 목표입니다.
# .gitlab-ci.yml fragmentcapgo_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 →_PIPELINE 트리거 토큰, 그 다음 관리자 백엔드에서:
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두 플랫폼 모두에서, 두 개의 트리거를 실행하거나 GitHub 예시와 같은 방식으로 작업을 병렬로 확장할 수 있습니다.
Bitbucket과 Azure
Bitbucket과 Azure| 플랫폼 | 웹후크 메커니즘 |
|---|---|
| Bitbucket | pipeline 트리거 URL 또는 사용자 지정 pipe + 앱 비밀번호 POST |
| Azure DevOps | Pipeline 실행 REST API PAT를 사용하여 수동 pipe를 사용하십시오. CI UI에서 트리거 |
패턴은 동일합니다: admin → 비밀번호 확인 → 호스트 API → Capgo 빌드 작업.
관리자 도구의 Payload 체크리스트
관리자 도구의 Payload 체크리스트 섹션대시보드 폼이 빌드되면 다음을 최소한으로 수집하십시오:
- 플랫폼 — ios / android / 둘 다
- 모드 — QA (테스트) 또는 스토어 (스토어) 릴리즈
- Git 참조 — 빌드할 branch 또는 tag
- 액터 — 감사 로그에 기록하기 위해 CI가 전달할 이메일 또는 사용자 ID
client_payload)
선택 사항: CI가 빌드가 완료된 후 API에 다운로드 URL을 포함한 관리자에게 다시 전송 --output-record / build last-output.
보안
보안- 인증
x-webhook-secret허용 목록 - , 그리고
platform,mode인증 (HMAC 서명 또는 mTLS)refboth proxy와 workflow에서validatejob — 위험한 입력으로 다루세요.client_payloaduntrusted input으로 다루세요. - 받은 값은 env vars / job outputs를 통해 전달하세요; payload field를 script에 삽입하지 마세요.
run:__CAPGO_KEEP_0__/GitLab 토큰은 서버에서만 유지하세요. - Keep GitHub/GitLab tokens server-side only.
- proxy를 제한하세요; native build는 build 시간에 비용이 들기 때문입니다.
- context: Capgo Builder / native cloud build 제품 페이지. 역할: 웹사이트 복사 문장. 페이지: native-build.astro. 메시지 키: `native_build_builder_build_minutes` (Native Build Builder Build Minutes).
- 스토어 제출 릴리스에 대해
releaseprotected GitHub 환경(샘플에서와 같이)으로 mapping하거나validate.