자동으로 라이브 업데이트 또는 네이티브 빌드를 선택하세요
설치
Capacitor의 대부분의 릴리스는 자바스크립트 전용이며 live 업데이트로 배포해야 합니다. 실시간 업데이트. 일부 변경 사항은 code의 네이티브 버전을 건드리고 새로운 바이너리에서 code 빌드를 필요로 합니다. Capgo 빌드. 이 가이드는 GitHub 액션, GitLab CI, 또는 다른 CI/CD 플랫폼이 푸시마다 올바른 경로를 선택할 수 있도록 해줍니다 — 인간의 결정이 필요하지 않습니다.
Capgo은 이미 안전한 경로를 알고 있습니다. 웹 빌드 후 (업로드 또는 네이티브 빌드를 요청하기 전에) 실행하십시오:
npx @capgo/cli@latest bundle releaseType com.example.app --channel production# → OTA ship with bundle upload# → native ship with Capgo BuildOTA live 채널에 있는 것과 일치하는 네이티브 패키지를 의미합니다. native Capacitor 버전 또는 다른 네이티브 의존성이 변경된 경우 플러그인, Capacitor 버전, 또는 네이티브 의존성이 변경되었습니다. — 오버 더 에어(OVER-THE-AIR) 배포만으로는 안전하게 장치 업데이트를 수행할 수 없습니다.
releaseType 비교합니다. 네이티브 패키지 메타데이터 Capacitor/Cordova 플러그인 및 버전입니다. 그것은 아니요 아래의 예시에서처럼 git에 먼저 경로를 게이트(gate)하고, 의존성 호환성을 위해 사용하세요. ios/, android/, 또는 capacitor.config.*. releaseType __CAPGO_KEEP_0__
보기 자연적인 호환성 전체 규칙과 매뉴얼을 보려면 bundle compatibility 표를 참조하십시오.
필요 조건
필요 조건- Capgo 앱이 등록되어 있고, Capgo __CAPGO_KEEP_1__ 키가 있습니다. Capgo API key CI 비밀을 통해
CAPGO_TOKEN - 실시간 업데이트가 업로드 작동 ('
bundle upload') — CI/CD 통합 - Capgo GitHub 또는 인증 정보
- 이미 존재하는 채널이 프로덕션과 일치하는 채널 (예시)
production) - 채널에
metadata전략으로 업로드할 수 있는 모든 업로드가--auto-min-update-version(한 번만):
npx @capgo/cli@latest channel set production com.example.app --disable-auto-update metadatapipeline이 어떻게 작동해야 하는가
pipeline이 어떻게 작동해야 하는가flowchart TD A[Push / merge] --> B[Install + web build] B --> C["bundle releaseType"] C -->|OTA| D["bundle upload"] C -->|native| E["build request iOS + Android"] E --> F[Store / TestFlight / Play]
- __CAPGO_KEEP_0__ 빌드를 빌드하는 웹 자산
- 커밋이 __CAPGO_KEEP_0__에 영향을 미치면
ios/,android/또는capacitor.config.*커밋이 __CAPGO_KEEP_0__에 영향을 미치면 - Capgo가 커밋이 실시간 업데이트가 가능한지 여부를 묻는다.
releaseType커밋이 __CAPGO_KEEP_0__에 영향을 미치지 않으면 - __CAPGO_KEEP_0__가 커밋이 실시간 업데이트가 가능한지 여부를 묻는다.
OTA업로드--fail-on-incompatible그리고--auto-min-update-version. - 만약
nativeCapgo 빌드--auto-min-update-version그것을 업로드 그렇게 채널의 네이티브 메타데이터가 업데이트된다. 하지 마--fail-on-incompatible그것을 사용하지 마 그것을 위해 새로운 네이티브 패키지가 다르다.
GitHub Actions
GitHub 액션원하는 워크플로우를 선택하여 네이티브 경로를 제어하고, 다음에 브랜치하는 workflow releaseType:
name: Capgo Release
on: push: branches: [main]
jobs: decide: runs-on: ubuntu-latest outputs: release_type: ${{ steps.verdict.outputs.type }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v6 with: node-version: '24' cache: 'npm'
- run: npm ci - run: npm run build
- name: Decide OTA vs native id: verdict env: CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }} run: | BEFORE="${{ github.event.before }}" if [ -z "$BEFORE" ] || [ "$BEFORE" = "0000000000000000000000000000000000000000" ]; then BEFORE="$(git rev-parse HEAD~1 2>/dev/null || echo '')" fi if [ -z "$BEFORE" ] || git diff --name-only "$BEFORE" "${{ github.sha }}" \ | grep -qE '^(ios/|android/|capacitor\.config\.)'; then TYPE=native echo "Native path/config changed (or no prior commit) — forcing native" else TYPE=$(npx @capgo/cli@latest bundle releaseType com.example.app --channel production | tr -d '[:space:]') fi echo "type=$TYPE" >> "$GITHUB_OUTPUT" echo "Capgo release type: $TYPE"
live_update: needs: decide if: needs.decide.outputs.release_type == 'OTA' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v6 with: node-version: '24' cache: 'npm' - run: npm ci - run: npm run build - name: Upload live update env: CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }} run: | npx @capgo/cli@latest bundle upload com.example.app \ --channel production \ --fail-on-incompatible \ --auto-min-update-version
native_build: needs: decide if: needs.decide.outputs.release_type == 'native' runs-on: ubuntu-latest strategy: fail-fast: false matrix: platform: [ios, android] steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v6 with: node-version: '24' cache: 'npm' - run: npm ci - run: npm run build - run: npx cap sync ${{ matrix.platform }} - name: Capgo Build ${{ matrix.platform }} 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 }} run: | npx @capgo/cli@latest build request com.example.app \ --platform ${{ matrix.platform }} \ --build-mode release
native_bundle: needs: [decide, native_build] if: needs.decide.outputs.release_type == 'native' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v6 with: node-version: '24' cache: 'npm' - run: npm ci - run: npm run build - name: Upload bundle for new native baseline env: CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }} run: | # Channel must already be on metadata (see Prerequisites above) npx @capgo/cli@latest bundle upload com.example.app \ --channel production \ --auto-min-update-version바꾸기 com.example.app 위의 설명에 따라 서명 비밀을 연결하세요. GitHub Actions for Capgo Build.
GitLab CI
GitLab CIGitLab이 평가합니다. rules pipeline이 생성될 때, branch와 shell을 사용하여 if 내부에 하나의 배포 작업 (또는 동적 자식 pipeline을 생성) 이 경우 별도의 네이티브 매트릭스 작업이 필요합니다. .gitlab-ci.yml
image: node:24
stages: - build - deploy
variables: APP_ID: com.example.app CHANNEL: production
build_web: stage: build script: - npm ci - npm run build artifacts: paths: - dist/ - node_modules/ expire_in: 1 hour only: - main
deploy: stage: deploy needs: [build_web] script: - | BEFORE="${CI_COMMIT_BEFORE_SHA:-}" if [ -z "$BEFORE" ] || [ "$BEFORE" = "0000000000000000000000000000000000000000" ]; then BEFORE="$(git rev-parse HEAD~1 2>/dev/null || echo '')" fi if [ -z "$BEFORE" ] || git diff --name-only "$BEFORE" "$CI_COMMIT_SHA" \ | grep -qE '^(ios/|android/|capacitor\.config\.)'; then TYPE=native else TYPE=$(npx @capgo/cli@latest bundle releaseType "$APP_ID" --channel "$CHANNEL" | tr -d '[:space:]') fi echo "Capgo release type: $TYPE" if [ "$TYPE" = "OTA" ]; then npx @capgo/cli@latest bundle upload "$APP_ID" \ --channel "$CHANNEL" \ --fail-on-incompatible \ --auto-min-update-version elif [ "$TYPE" = "native" ]; then npx cap sync npx @capgo/cli@latest build request "$APP_ID" --platform ios --build-mode release npx @capgo/cli@latest build request "$APP_ID" --platform android --build-mode release npx @capgo/cli@latest bundle upload "$APP_ID" \ --channel "$CHANNEL" \ --auto-min-update-version else echo "Unexpected release type: $TYPE" >&2 exit 1 fi only: - mainStore CAPGO_TOKEN 그리고 Capgo 빌드 인증 변수를 마스킹/보호된 CI/CD 변수로 설정합니다.
다른 CI 플랫폼
제목 ‘다른 CI 플랫폼’같은 세 단계는 어디서든 작동합니다.
| 단계 | 명령 |
|---|---|
| 판단 | npx @capgo/cli@latest bundle releaseType APP_ID --channel production |
| OTA 경로 | npx @capgo/cli@latest bundle upload APP_ID --channel production --fail-on-incompatible --auto-min-update-version |
| 자연 경로 | npx @capgo/cli@latest build request APP_ID --platform ios (또는 android) --build-mode release |
명령어의 쉘 종료/표준 출력을 플랫폼의 조건문에 매핑하거나 단일 작업에 쉘을 유지하세요 (GitLab 위와 같이): if, like GitLab above):
- Azure Pipelines — 스크립트 단계에서 출력 변수를 설정하고 나서 사용
condition: eq(variables['releaseType'], 'OTA') - Azure Pipelines — 쓰기
RELEASE_TYPE=…to$BITBUCKET_PIPELINES_VARIABLES_PATH페이지/영역: 실시간 업데이트 제품 페이지. 역할: 짧은 UI 레이블 또는 네비게이션 아이템. 메시지 키 `live_update_dynamic_label_to` (실시간 업데이트 동적 레이블 To).output-variables, 선언condition: state: RELEASE_TYPE == "OTA", 그리고 나중에 단계를 branchcondition) - , —
when(파일 아티팩트만으로는ifCirlceCIwhen - )은 config-compile 시간에 평가되므로 런타임 셸 (또는 동적 config / 연속성)로 branch하고 나서 workspace 값은 — 표준 출력을 환경 변수로 캡처하고 사용하세요
when { environment name: 'RELEASE_TYPE', value: 'OTA' }
속도 향상을 위한 경로 필터 (선택 사항)
속도 향상을 위한 경로 필터 (선택 사항) 섹션경로 필터는 Capgo 확인 대신에 비용 최적화입니다. 문서 전용 경로를 제외하는 것을 선호하세요. 웹 빌드는 종종 vite.config.*, tsconfig*.json그리고 프레임워크 구성 파일:
on: push: branches: [main] paths-ignore: - '**.md' - 'docs/**' - '.github/**'만약 허용 목록을 사용한다면, 웹 빌드와 네이티브 빌드가 읽는 모든 입력을 포함해야 합니다. src/ 그리고 package.json.
__CAPGO_KEEP_0__
- Capgo 설정).
- JS 번들을 업로드하세요.
--auto-min-update-version(메타데이터 전략) 채널이 새로운 네이티브 패키지를 기록하도록 하려면, JS-만의 커밋이 여전히 OTA를 반환하지 않도록 하세요.native. - 사용자가 새로운 바이너리를 설치한 후에, 이후의 JavaScript-만의 커밋은 다시
OTA다시.