컨텐츠로 건너뛰기

GitHub 액션

iOS 및 Android 빌드를 직접 GitHub 저장소에서 자동화하세요. 하나의 워크플로 파일과 몇 개의 저장소 비밀만 있으면, 팀의 누구도 맥, Xcode, 또는 Android Studio를 설치할 필요 없이, 푸시, 태그, 또는 수동 트리거로 생성된 서명된, 저장소에 준비된 앱이 자동으로 제출됩니다.

손쉽게 릴리즈

Git에서 릴리즈 태그를 지정하면 TestFlight 및 Play Store로 서명된 iOS 및 Android 바이너리가 자동으로 제출됩니다.

지역 설정이 필요하지 않습니다.

윈도우 또는 리눅스에서 개발하는 contributors가 iOS 빌드를 트리거할 수 있습니다. Xcode, 배포 프로비전, 공유 서명 인증서와 같은 문제가 없습니다.

Scoped Secrets

GitHub 저장소 비밀에 있는 자격 증명은 repo와 workflow runner만이 볼 수 있는 범위로 제한됩니다. 쉽게 회전하고 쉽게 감사할 수 있습니다.

Parallel Builds

Build iOS와 Android를 동시에 matrix 작업으로 빌드합니다. 일반적인 릴리스는 10분 이내에 완료됩니다.

__CAPGO_KEEP_0__ 계정과 활성 구독 및 __CAPGO_KEEP_1__ 키가 필요합니다.

  • Capgo에 앱을 등록했습니다 (만약 그렇지 않다면) Capgo API key
  • Your app registered in Capgo (bunx @capgo/cli@latest app add __CAPGO_KEEP_0__
  • 로컬에서 구성된 인증 정보를 빌드합니다. bunx @capgo/cli@latest build init — 참조 인증 정보 관리 위치 안내서 walkthrough
  • 첫 번째 빌드에 대한 디버깅은 CI가 아닌 곳에서bunx @capgo/cli@latest build request com.example.app --platform android --build-mode debugThe
  • __CAPGO_KEEP_0__ __CAPGO_KEEP_1__ ( GitHub CLI (gh) 주의gh auth login)

설정

설정

The Capgo CLI can export your local credentials as a ready-to-use .env __CAPGO_KEEP_0__ __CAPGO_KEEP_1__을 사용하여 로컬 자격 증명을 준비된 파일로 내보낼 수 있습니다. gh secret set -f이것을 __CAPGO_KEEP_0__ __CAPGO_KEEP_1__와 combination하면 CI/CD 설정을 세 개의 명령어로만 처리할 수 있습니다. — 수동 base64 인코딩, JSON 조작, 비밀번호를 하나씩 복사-붙여넣기할 필요가 없습니다.

  1. Capgo API 키를 저장소 비밀로 추가하세요

    API 키는 앱당 자격 증명 저장소에 포함되지 않으므로 수동으로 한 번만 추가하세요:

    터미널 창
    gh secret set CAPGO_TOKEN --body "your_capgo_api_key_here"

    __CAPGO_KEEP_0__ 대시보드에서 키를 생성하세요 Capgo __CAPGO_KEEP_1__ GitHub Actions을 사용하여 업로드 권한이 있는 사용자 또는 높은 권한이 있는 사용자.

  2. 인증 정보를 파일로 내보내세요. .env 파일

    인터랙티브 인증 관리자를 실행하세요:

    터미널 창
    bunx @capgo/cli@latest build credentials manage --appId com.example.app

    TUI에서 Export to .env. CLI는 .env.capgo.<appId> 현재 디렉토리에 mode 0600 (owner-readable only) — 예를 들어, .env.capgo.com.example.app. iOS와 Android가 모두 구성된 경우, 두 플랫폼의 비밀은 동일한 파일 하위에 저장됩니다. # === IOS === 및 # === ANDROID === 부문 제목입니다. iOS와 Android의 env-var 이름은 겹치지 않기 때문에 combining하는 것은 충돌이 없습니다.

  3. 파일을 __CAPGO_KEEP_0__ Actions secrets로 푸시하세요. .env file to GitHub Actions secrets

    레포지토리 secret를 생성합니다. gh secret set -f 터미널 창 KEY=value 클립보드에 복사

    그것만으로도 — 모든 워크플로우가 필요로 하는 비밀은 이제 __CAPGO_KEEP_0__에 있습니다.
    gh secret set -f .env.capgo.com.example.app

    That’s it — every secret your workflow needs is now in GitHub. Verify with gh secret list.

  4. 워크플로우 파일을 생성하세요.

    추가 .github/workflows/capgo-build.yml 원하는 트리거 패턴에 따라 리포지토리에 추가하세요.

비밀 섹션에 들어가는 내용

비밀 섹션 제목

참조로, gh secret set -f 이러한 리포지토리 비밀 (워크플로우 YAML은 정확한 이름으로 참조합니다):

플랫폼생성된 비밀
iOSBUILD_CERTIFICATE_BASE64, P12_PASSWORD, CAPGO_IOS_PROVISIONING_MAP_BASE64, APPLE_KEY_ID, APPLE_ISSUER_ID, APPLE_KEY_CONTENT, APP_STORE_CONNECT_TEAM_ID
안드로이드ANDROID_KEYSTORE_FILE, KEYSTORE_KEY_ALIAS, KEYSTORE_KEY_PASSWORD, KEYSTORE_STORE_PASSWORD, PLAY_CONFIG_JSON
(수동으로 추가됨)CAPGO_TOKEN

이것들을 기억할 필요가 없습니다 — 아래의 워크플로우 예제는 모든 것을 참조합니다.

워크플로우 예제

워크플로우 예제 섹션

다음 세 가지 예제는 가장 일반적인 패턴을 다룹니다. 모두 같은 형태를 사용합니다: 리포지토리를 체크 아웃하고 의존성을 설치한 다음 웹 자산을 빌드하고 네이티브로 동기화하고 Capgo 빌드에 인증 정보를 환경 변수로 전달합니다.

1. 수동 트리거

1. 수동 트리거 섹션

어떤 사람이라도 쓰기 권한이 있는 사람에게는 워크플로우를 통해 빌드를 시작할 수 있습니다. 액션 GitHub 탭에서 플랫폼 드롭다운이 있습니다. 유용한 테스트 빌드 또는 요청 시 릴리스를 시작하는 데 사용됩니다.

github/워크플로우/capgo-수동 빌드.yml
name: Capgo Build (Manual)
on:
workflow_dispatch:
inputs:
platform:
description: 'Platform to build'
required: true
default: 'android'
type: choice
options: [ios, android, both]
mode:
description: 'Build mode'
required: true
default: 'debug'
type: choice
options: [debug, release]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- run: bun install --frozen-lockfile
- run: bun run build
- run: bunx cap sync
- name: Trigger Capgo Build
env:
CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
CAPGO_IOS_PROVISIONING_MAP_BASE64: ${{ secrets.CAPGO_IOS_PROVISIONING_MAP_BASE64 }}
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 }}
run: |
bunx @capgo/cli@latest build request com.example.app \
--platform ${{ inputs.platform }} \
--build-mode ${{ inputs.mode }}

수정 com.example.app __CAPGO_KEEP_0__ ID를 입력하세요. 커밋한 후, 액션 → Capgo 수동 빌드 → 워크플로우 실행 2. 태그에 따라 릴리스

빌드 및 배포 v1.4.0__CAPGO_KEEP_0__ git tag v1.4.0 && git push --tags release 명령어로 변환됩니다.

github/workflows/capgo-build-release.yml
name: Capgo Build (Release)
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
platform: [ios, android]
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- run: bun install --frozen-lockfile
- run: bun run build
- run: bunx cap sync ${{ matrix.platform }}
- name: Build ${{ matrix.platform }}
env:
CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
# iOS
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
CAPGO_IOS_PROVISIONING_MAP_BASE64: ${{ secrets.CAPGO_IOS_PROVISIONING_MAP_BASE64 }}
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
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 }}
run: |
bunx @capgo/cli@latest build request com.example.app \
--platform ${{ matrix.platform }} \
--build-mode release

iOS와 Android를 별도의 실행자에서 병렬로 실행하는 매트릭스입니다. 설정 fail-fast: false iOS 빌드가 실패해도 Android 빌드가 진행 중이면 취소되지 않으며, 그 반대도 마찬가지입니다. — 한 플랫폼이 임시 서명 문제를 해결하는 데 시간이 걸릴 때 유용합니다.

3. 푸시 메인 브랜치 시 디버그 빌드

3. 푸시 메인으로 디버그 빌드

메인 푸시마다 네이티브 빌드 회귀를 일찍 잡아주는 디버그 안드로이드 빌드를 생성합니다. main실행 비용이 저렴하고 빠른 피드백을 제공하며, 플레이 스토어 업로드를 생략하여 단순한 스모크 테스트로 유지할 수 있습니다.

github/workflows/capgo-build-main.yml
name: Capgo Build (Main)
on:
push:
branches: [main]
paths:
- 'src/**'
- 'android/**'
- 'ios/**'
- 'package.json'
- 'capacitor.config.*'
jobs:
smoke-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- run: bun install --frozen-lockfile
- run: bun run build
- run: bunx cap sync android
- name: Smoke build (Android debug)
env:
CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
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 }}
run: |
bunx @capgo/cli@latest build request com.example.app \
--platform android \
--build-mode debug \
--no-playstore-upload \
--output-upload

이 필터는 문서 변경만으로 워크플로우가 실행되지 않도록 보장합니다. paths 플레이 스토어 제출을 생략 (필요하지 않음) 하며, 결과 APK의 다운로드 URL을 생성하여 테스트 장치에 설치할 수 있도록 합니다. --no-playstore-upload 공통 패턴 PLAY_CONFIG_JSON 공통 패턴 --output-upload 필터

필요하지 않음

생략

Play Store / 테스트 플라이트 업로드 건너뛰기

Play Store / 테스트 플라이트 업로드 건너뛰기 섹션

테스트 빌드의 경우 스토어 제출을 건너뛰세요: 안드로이드는 --no-playstore-uploadiOS의 경우 ad-hoc 모드에서 빌드합니다. --ios-distribution ad_hoc (이것은 앱 스토어에 제출하지 않습니다). --output-upload 이것과 함께 사용하여 바이너리의 시간 제한된 다운로드 URL을 얻으세요.

스토어 릴리즈를 검토하기 위해 제출하세요

스토어 릴리즈를 검토하기 위해 제출하는 섹션

기본적으로 릴리즈 빌드는 signed artifact를 업로드하고 스토어 액션의 최종 결과를 사용자에게 맡깁니다. CI 릴리즈가 직접 스토어 검토 흐름으로 이동해야 하는 경우 --submit-to-store-review.

안드로이드는 PLAY_CONFIG_JSON 서비스 계정 사용합니다. explicit track이 없으면 --submit-to-store-review 기본적으로는 프로덕션 트랙으로 설정되며 release_status: completed. 호출 사이트에서 트랙을 명시하는 것을 선호합니다. --android-track (또는 PLAY_STORE_TRACK), --android-release-status / PLAY_STORE_RELEASE_STATUS 상태를 오버라이드하려면

- name: Submit Android release for review
env:
CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
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 }}
run: |
npx @capgo/cli@latest build request com.example.app \
--platform android \
--build-mode release \
--submit-to-store-review \
--android-track production \
--store-release-name "${GITHUB_REF_NAME}" \
--store-release-notes "Release ${GITHUB_REF_NAME}" \
--store-release-notes-locale "en-US=Release ${GITHUB_REF_NAME}"

클립보드에 복사

- name: Submit Android internal release
env:
CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
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 }}
run: |
npx @capgo/cli@latest build request com.example.app \
--platform android \
--build-mode release \
--submit-to-store-review \
--android-track internal \
--store-release-name "${GITHUB_REF_NAME}"

iOS uses the App Store Connect API key path and submits the processed TestFlight build to App Store review. It requires app_store iOS는 App Store Connect __CAPGO_KEEP_0__ 키 경로를 사용하여 App Store 리뷰에 제출될 TestFlight 빌드를 처리합니다. --ios-testflight-groups 배포에 필요하며

- name: Submit iOS build to App Store review
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 }}
run: |
npx @capgo/cli@latest build request com.example.app \
--platform ios \
--build-mode release \
--ios-distribution app_store \
--submit-to-store-review \
--store-release-name "${GITHUB_REF_NAME}" \
--store-release-notes "Release ${GITHUB_REF_NAME}" \
--store-release-notes-locale "en-US=Release ${GITHUB_REF_NAME}" \
--no-ios-automatic-release

빌드 출력 URL 및 QR 코드 code를 읽어보세요.

빌드 출력 URL 및 QR 코드 code를 읽어보세요.

성공 --output-record <path> 빌드 아티팩트 URL 및 QR 코드 code를 디스크에 영구적으로 저장하고, 빌드가 성공하면 다음 단계에서 다시 읽어보세요. build last-output로그 스크래핑, 정규 표현식 없이.

- name: Build
env:
CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
# ...credentials...
run: |
bunx @capgo/cli@latest build request com.example.app \
--platform android --build-mode debug \
--output-upload --output-retention 1d \
--output-record /tmp/build.json
- name: Comment on PR with build URL
env:
GH_TOKEN: ${{ github.token }}
run: |
URL=$(bunx @capgo/cli@latest build last-output --path /tmp/build.json --field outputUrl)
if [ -n "$URL" ]; then
gh pr comment ${{ github.event.pull_request.number }} \
--body "Debug build ready: $URL"
fi

--output-record /tmp/build.json JSON 레코드 ( jobId, status, outputUrl, qrCodeAscii, qrCodePngPath, finishedAt) and a PNG QR code alongside at /tmp/build.json.qr.png. build last-output writes a JSON record (with

  • --field outputUrl 다운로드 URL만 출력합니다 (줄바꿈-종료; 안전한) URL=$(...)).
  • --field qrCodePngPath PNG 경로를 출력하여 PR 첨부물로 업로드할 수 있습니다.
  • --qr 렌더링된 ASCII QR 코드를 출력합니다 — PR 댓글에 내장된 스캔 가능성을 위해 Markdown code 구간에 넣어주세요.

기본적으로 각 릴리스 빌드는 빌드 번호를 증가시킵니다. Git 태그와 같은 값을 제어할 수 있도록 빌드 번호를 고정하려면

클립보드에 복사

Copy to clipboard --skip-build-number-bump:

- name: Set version from tag
run: |
VERSION="${GITHUB_REF#refs/tags/v}"
# Update package.json or your version source here
bun pm version "$VERSION" --no-git-tag-version
- name: Build
env:
CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
# ...credentials...
run: |
bunx @capgo/cli@latest build request com.example.app \
--platform ios --build-mode release \
--skip-build-number-bump

캐시 의존성

캐시 의존성

bun install JS-종속성 캐시가 거의 이익이 되지 않지만 Capacitor의 원시 종속성 (CocoaPods, Gradle)은 더 큰 프로젝트에 대해 캐싱하는 것이 가치 있습니다:

- uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
ios/App/Pods
android/.gradle
key: ${{ runner.os }}-capgo-${{ hashFiles('**/bun.lock', '**/Podfile.lock') }}

문제 해결

문제 해결
증상가능한 원인
CAPGO_TOKEN is not set비밀 키가 추가되지 않았거나, 또는 작업이 해당 키에 접근할 수 없습니다 (환경/branch 보호를 확인하십시오)
iOS/Android 인증 정보 오류gh secret set -f 실행되지 않았거나, 또는 다른 저장소에 대해 실행되었을 수 있습니다. 다음을 확인하십시오: gh secret list
cap sync CI에서 실패하지만 로컬에서 작동합니다.자연스러운 플러그인은 없습니다. package.json, 또는 잊었습니다. bun install 전에 cap sync
CI에서 빌드가 성공하지만 앱 스토어 연결에 앱이 나타나지 않습니다.오류가 있는 팀 ID 또는 앱 레코드가 앱 스토어 연결에 아직 존재하지 않습니다. 로컬에서 다음을 확인하세요. bunx @capgo/cli@latest build credentials manage
빌드가 "업로드 프로젝트" 후에 멈춥니다.프로젝트 아카이브가 비정상적으로 크다면 다음을 확인하세요. node_modules 업로드되지 않는다는 것을 확인하세요 (기본적으로 업로드되지 않아야 합니다).
Provisioning profile doesn't match bundle ID프로비저닝 맵이 Xcode가 서명하는 다른 번들 ID를 가리키고 있습니다. 다시 실행하여 프로파일을 갱신하고 다음으로 다시 내보내세요. build init 로컬에서 인증 정보가 변경되었지만 CI에서 실패합니다. build credentials manage
create_an_issue_and_discuss_before_working_on_a_new_feature잊지 마세요. 다시 내보내고 다시 푸시하세요: bunx @capgo/cli@latest build credentials manage → gh secret set -f .env.capgo.<appId>
관리자로 하여금 결합된 파일을 쓰지 않습니다.플랫폼 간 공유 구성 키가 다르기 때문에 관리자는 경고하고 확인을 요청합니다. 확인을 눌러서 하나가 우선되거나, 플랫폼 별로 다시 내보내세요. --platform ios / --platform android
build last-output 비어 있는 URL을 출력합니다.빌드는 통과하지 못했습니다. --output-upload, 또는 artifact를 생성하기 전에 실패했습니다. outputUrl 될 것입니다. null 기록에 저장됩니다. branch on [ -n "$URL" ] 사용하기 전에
build last-output 에러와 Unsupported record schemaVersion기록을 작성한 쪽의 CLI보다 더 오래된 실행자입니다. 프로듀서와 리더를 동일한 명시적인 버전으로 고정하세요 (예를 들어. bunx @capgo/cli@7.104.0 … 두 쪽 모두) @latest그것은 플랫폼에 따라 드리프트하고 작업 사이에 떠다닐 수 있습니다.

플랫폼별 빌드 실패에 대한 자세한 내용은 문제 해결 가이드.

다음 단계

다음 단계