내용으로 건너뛰기

원본 빌드를 웹훅을 통해 트리거하세요

Capgo 일반적으로 laptop 또는 CI 작업에서 빌드를 시작합니다. CI 작업을 통해 배포하는 팀은 관리자 대시보드웹하키 (Webhook) HTTP 웹하키: code 호스트에 인증된 HTTP 호출을 보내고 Capgo 빌드 워크플로우가 실행되도록 합니다. 이 안내서에서는 표준 패턴을 보여줍니다.

당신은 필요하지 않다 Capgo를 공개하는 '빌드 웹후크'를 노출할 필요가 없습니다. CI는 이미 서명 비밀을 가지고 있습니다. 웹후크의 역할은 CI 작업을 안전하게 시작하는 것입니다.

  • A Capgo Build workflow that already works from the __CAPGO_KEEP_0__ 액션 __CAPGO_KEEP_0__GitHub)
  • fine-grained GitHub 권한
  • __CAPGO_KEEP_0__ 공유 비밀
Option A — GitHub repository_dispatch (권장)

GitHub는 인증된 API 호출을 받고 workflow를 시작하여 __CAPGO_KEEP_2__를 기다립니다. repository_dispatch. 어떤 대시보드도 POST JSON이 __CAPGO_KEEP_2__를 호출할 수 있습니다.

1. webhook를 기다리는 workflow

payload를 확인하세요.

작업하기 전에 __CAPGO_KEEP_3__ 작업하기 전에 __CAPGO_KEEP_3__ 체크아웃과 비밀을 지닌 단계 전의 모든 단계에서. 작업 출력 / 환경 변수를 통해 승인된 값을 전달하십시오 — 절대 중첩하지 마십시오. client_payload 직접으로 run: 스크립트 (스크립트 주입 지침).

github/워크플로우/capgo-빌드-웹훅.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"

2. GitHub 토큰을 생성하십시오

제목 ‘2. GitHub 토큰을 생성하십시오’

GitHub 앱 설치 토큰 또는 개인 액세스 토큰을 생성하여 내용: 읽기 및 쓰기 저장소에 (빌드 웹훅를 위해) 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.platformios, android워크플로우 내에서 ( both
client_payload.modedebug , 또는 release
client_payload.ref또는

Wire the same JSON POST to a button in your admin UI (“Native App을 빌드하기 위한”). The dashboard only needs to reach your backend; the backend holds GITHUB_TOKEN.

Option B — Any host의 작은 프록시 웹후크

Section titled “Option B — 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,
})
},
}

Then configure the admin product:

Setting
URLhttps://your-worker.example.com/native-build
메서드POST
헤더x-webhook-secret: <shared secret>
바디{ "platform": "both", "mode": "release" }

웹훅을 관리자 대시보드에 연결하는 일반적인 형태는 대시보드에서 하나의 URL과 하나의 비밀 키를 저장하고 Capgo 자격 증명은 GitHub 액션에 남아 있습니다.

GitLab PipeLine 트리거

GitLab PipeLine 트리거

GitLab은 pipeline 트리거 토큰 natural 웹훅 목표입니다.

# .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 → 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
플랫폼웹후크 메커니즘
BitbucketPipeline 트리거 URL 또는 사용자 지정 pipe + 앱 비밀번호 POST
Azure DevOpsPipeline 실행 REST API PAT를 사용하여 수동 pipe를 사용하십시오. CI UI에서 트리거

패턴은 동일합니다: admin → 비밀번호 확인 → 호스트 API → Capgo 빌드 작업.

관리자 도구에 대한 페이로드 체크리스트

관리자 도구에 대한 페이로드 체크리스트 섹션

대시보드 폼이 빌드되면 다음을 최소한으로 수집하십시오:

  • 플랫폼 — ios / android / 둘 다
  • 모드 — 테스트 (QA) 또는 출시 (스토어)
  • Git ref — 빌드할 branch 또는 tag
  • Actor — 감사 로그 (pass through) 위해 이메일 또는 사용자 ID client_payload)

선택 사항: 실행 후 CI가 관리자 API에 다운로드 URL을 전송 --output-record / build last-output.

보안

보안
  • 인증x-webhook-secret허용 목록
  • , 그리고 platform, modeAllowlist ref both proxy와 workflow에서 validate 작업 — 취급 client_payload 무뢰한 입력으로 다루세요.
  • 받은 값은 env vars / 작업 출력을 통해 전달하세요; payload field를 스크립트에 삽입하지 마세요. run: __CAPGO_KEEP_0__/GitLab 토큰은 서버에서만 유지하세요.
  • Keep GitHub/GitLab tokens server-side only.
  • Proxy를 제한하세요; 원본 빌드는 빌드 분량을 소모합니다.
  • 스토어에 제출하는 릴리즈에 대해, __CAPGO_KEEP_0__ 환경(샘플에서와 같이)으로 mapping하거나, 추가 확인 플래그를 체크한 후에만 사용하세요.
  • 관련 문서 release to a protected GitHub Environment (as in the sample) or require an extra confirmation flag checked in validate.
관련 문서