Capacitor 앱의 CI/CD 설정은 복잡하고 시간이 많이 걸립니다. 다음을 알아야 합니다.
새로운 빌드에 권장: Capgo 빌드 사용
__CAPGO_KEEP_0__ 빌드와 __CAPGO_KEEP_1__ __CAPGO_KEEP_2__ Capgo Build with the Capgo CLI Capacitor 빌드 이 Fastlane 가이드는 기존 GitHub 액션 PIPELINE을 유지하는 팀을 위해 유지됩니다. 그러나 새로운 안드로이드 빌드는 Fastlane, Gradle 런너, 키 스토어, 업로드 스크립트를 유지 관리하지 않도록 Capgo CLI를 사용하세요.
기본 조건
시작하기 전에 다음을 설정해야 합니다:
- GitHub 계정에 관리자 권한이 있는 계정
- Google Play Store에 올려져 있는 앱
- Android signing 키 및 keystore 파일
- Play Store API가 활성화된 Google Cloud Console 프로젝트
- 권한이 있는 서비스 계정
- GitHub Actions 워크플로우에 대한 이해
- Fastlane 구성에 대한 지식
- pipeline 유지 및 디버깅에 필요한 시간
Capgo Build for CI/CD by Capgo
Fastlane, Gradle 런너, keystore 및 업로드 스크립트 유지 관리를 생략합니다. Capgo 빌드 __CAPGO_KEEP_0__ Build는 __CAPGO_KEEP_1__ CI/CD PIPELINE에서 이미 존재하는 Android 빌드에서 signed native Android 빌드를 실행합니다.
- __CAPGO_KEEP_0__ Build는 __CAPGO_KEEP_1__ PIPELINE과 함께 작동합니다.: Capgo Build는 GitHub Actions, GitLab CI, Jenkins, 또는 로컬 스크립트 후 웹 빌드와 함께 Capgo Build를 트리거합니다.
npx cap sync. - __CAPGO_KEEP_0__ Build에서 CI 비밀을 사용한 서명: Android 키스토어, 키 별칭, 비밀번호, 및 Play Console 서비스 계정 JSON을 __CAPGO_KEEP_1__ CI 비밀에 유지합니다.
- native runner 유지 관리가 필요하지 않습니다: Capgo Build는 유지 관리된 Android 빌드 환경을 제공하므로 SDK 이미지를 관리하거나 Gradle 캐시 문제 또는 Fastlane 경로를 관리할 필요가 없습니다.
- 아티팩트 및 제출: QA에 서명된 아티팩트를 다운로드하거나 Capgo CLI를 통해 릴리스 빌드를 제출합니다.
가격
- Capgo 플랜은 $12/월부터 시작됩니다.
- Includes OTA 업데이트와 매월 약 15개의 네이티브 빌드
- 추가 빌드 분은 분당 크레딧을 통해 청구됩니다
수동 설정 안내서
다음과 같은 작업이 필요합니다.
GitHub 액션 가격

GitHub 액션은 저장소 유형에 따라 무료 분을 제공합니다.
- 공개 저장소: 월 2,000분
- 개인 저장소: 월 2,000분 (리눅스 러너)
개인 프로젝트의 경우, 분당 약 $0.008의 비용이 발생합니다. 일반적인 빌드는 3-5분이 걸립니다.
수동 설정 단계
- Android 키스토어 만들기
- Google Play 서비스 계정 설정
- Fastlane 설정
- GitHub 비밀번호 설정
- GitHub Actions 워크플로우 만들기
1. Android 키스토어 만들기
Android 앱을 서명하고 배포하기 전에 키스토어 파일을 만들야 합니다. 이건 한 번만 설정합니다.
키스토어를 keytool로 생성하세요
터미널에서 이 명령어를 실행하세요.
keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
다음과 같은 정보를 입력하실 거에요.
- 키스토어 비밀번호: 강력한 비밀번호를 선택하세요 (이 비밀번호가 필요합니다)
KEYSTORE_STORE_PASSWORD) - 비밀 키: 강력한 비밀번호를 선택하세요 (이것을 필요로 할 것입니다
KEYSTORE_KEY_PASSWORD) - 이름, 조직 등: 세부 정보를 입력하세요
중요한 참고 사항
-
이 값을 안전하게 저장하세요:
- 키 스토어 파일 위치 (예시,
my-release-key.keystore) - 키 별칭 (예시,
my-key-alias) - 이것을 필요로 할 것입니다KEYSTORE_KEY_ALIAS - 키 스토어 비밀번호 - 이것을 필요로 할 것입니다
KEYSTORE_STORE_PASSWORD - 비밀 키 - 이것을 필요로 할 것입니다
KEYSTORE_KEY_PASSWORD
- 키 스토어 파일 위치 (예시,
-
키 스토어 파일 백업: 앱을 업데이트할 수 없으므로 잃어버리지 마세요.
-
비밀을 지켜라.: git에 키 스토어 파일을 커밋하지 마세요.
-
안전한 곳에 보관하라.: 여러 백업을 안전한 위치에 만들어라.
대안: 기존 키 스토어 사용
앱을 이미 출시한 경우, 처음으로 사용한 키 스토어를 사용해야 합니다. 키 스토어를 찾을 수 있습니다:
- 앱을 처음으로 빌드한 로컬 머신에서
- Play Console → 설정 → 앱 서명 (Google Play App Signing 사용 시)
2. Google Play Service Account 설정
To allow GitHub Actions to upload builds to Google Play, you need a service account.
Step 2.1: Google Cloud 프로젝트 만들기
- Go to Google Cloud Console
- 새로운 프로젝트를 생성하거나 기존 프로젝트를 선택하세요
- 프로젝트 ID를 기록하세요
Step 2.2: Google Play Developer API를 활성화하세요
- Google Cloud Console에서 APIs & Services → Library
- Google Play Android Developer API를 검색하세요
- Click Enable
Step 2.3: Service Account를 생성하세요
- Go to IAM & Admin → Service Accounts
- Click Create Service Account
- Enter details:
- Name:
github-actions-uploader - GitHub 액션을 위한 빌드 업로드를 위한 서비스 계정
- Name:
- Click 생성 및 계속
- Skip role assignment for now (click 계속그런 다음 완료)
2.4 단계: 서비스 계정 키 생성
- 새로 생성한 서비스 계정 클릭
- 로 이동하세요 키 탭
- 클릭 키 추가 → 새 키 생성
- 선택 JSON 형식
- 클릭 만들기
- JSON 파일이 다운로드 될 것입니다 - 이것을 안전하게 저장하세요이것을 나중에 사용할 것입니다
2.5 단계: Play 콘솔에서 접근 권한 부여
- 이동 Google Play 콘솔
- 이동 설정 → API 접근 권한
- 아래 서비스 계정, 클릭 권한 부여 서비스 계정에 대한
- 권한 부여 권한 권한
- 권한 앱 정보를 볼 수 있고 bulk 리포트를 다운로드할 수 있습니다 (읽기 전용) 앱 권한 탭에 앱을 추가하세요
- 계정 권한 탭에서 다음 권한을 부여하세요:
- _draft 앱을 만들고, 편집하고, 삭제하세요.
- 테스트 트랙으로 앱을 릴리즈하세요.
- 생산, 제외, 기타 트랙으로 앱을 릴리즈하세요.
- 클릭 사용자를 초대하세요.
- 클릭 초대 메일을 보냅니다.
2.6 단계: JSON 키를 확인하세요.
다운로드한 JSON 파일은 다음과 같이 보입니다.
{
"type": "service_account",
"project_id": "your-project-id",
"private_key_id": "...",
"private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
"client_email": "github-actions-uploader@your-project-id.iam.gserviceaccount.com",
"client_id": "...",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "..."
}
이것을 GitHub secret 설정 단계에서 base64로 변환하겠습니다.
3. Fastlane 설정
앱을 만들고 fastlane 프로젝트 루트 폴더에 폴더를 만들고 추가하십시오. Fastfile __CAPGO_KEEP_0__에 다음 내용을 입력하십시오.
default_platform(:android)
KEYSTORE_KEY_ALIAS = ENV["KEYSTORE_KEY_ALIAS"]
KEYSTORE_KEY_PASSWORD = ENV["KEYSTORE_KEY_PASSWORD"]
KEYSTORE_STORE_PASSWORD = ENV["KEYSTORE_STORE_PASSWORD"]
platform :android do
desc "Deploy a beta version to the Google Play"
private_lane :verify_changelog_exists do |version_code: |
changelog_path = "android/metadata/en-US/changelogs/#{version_code}.txt"
UI.user_error!("Missing changelog file at #{changelog_path}") unless File.exist?(changelog_path)
UI.message("Changelog exists for version code #{version_code}")
end
private_lane :verify_upload_to_staging do |version_name: |
UI.message "Skipping staging verification step"
end
lane :beta do
keystore_path = "#{Dir.tmpdir}/build_keystore.keystore"
File.write(keystore_path, Base64.decode64(ENV['ANDROID_KEYSTORE_FILE']))
json_key_data = Base64.decode64(ENV['PLAY_CONFIG_JSON'])
# Get previous build number and increment
previous_build_number = google_play_track_version_codes(
package_name: ENV['DEVELOPER_PACKAGE_NAME'],
track: "internal",
json_key_data: json_key_data,
)[0]
current_build_number = previous_build_number + 1
sh("export NEW_BUILD_NUMBER=#{current_build_number}")
# Build the app
gradle(
task: "clean bundleRelease",
project_dir: 'android/',
print_command: false,
properties: {
"android.injected.signing.store.file" => "#{keystore_path}",
"android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
"android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
"android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
'versionCode' => current_build_number
})
# Upload to Play Store
upload_to_play_store(
package_name: ENV['DEVELOPER_PACKAGE_NAME'],
json_key_data: json_key_data,
track: 'internal',
release_status: 'completed',
skip_upload_metadata: true,
skip_upload_changelogs: true,
skip_upload_images: true,
skip_upload_screenshots: true,
)
end
end
4. GitHub 비밀을 구성하십시오.
키 스토어와 서비스 계정 JSON을 받은 후, GitHub에서 안전하게 저장하십시오.
4.1 단계: GitHub 비밀에 접근하십시오.
- GitHub에 접속하여 GitHub에 접속하십시오.
- GitHub 설정 → 비밀 및 변수 → 액션
- 새로운 저장소 비밀 추가 새로운 저장소 비밀 추가
Step 4.2: Capgo에 필요한 Secret를 추가하세요
이러한 secret를 하나씩 추가하세요:
__CAPGO_KEEP_0__
- Step 2.4에서 다운로드한 서비스 계정 JSON 파일을 가져옵니다.
- base64로 변환하세요:
macOS/Linux에서:
base64 service_account_key.json | pbcopy
Windows (PowerShell)에서:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("service_account_key.json")) | Set-Clipboard
- 새로운 secret를 만들고 이름을
PLAY_CONFIG_JSONbase64 문자열을 붙여넣으세요
__CAPGO_KEEP_1__
- Android 키스토어 파일을 base64로 변환하세요:
macOS/Linux에서:
base64 my-release-key.keystore | pbcopy
Windows (PowerShell)에서 실행합니다.
[Convert]::ToBase64String([IO.File]::ReadAllBytes("my-release-key.keystore")) | Set-Clipboard
- 새로운 비밀을 생성하세요. 이름은
ANDROID_KEYSTORE_FILEbase64 문자열을 복사하여 붙여넣으세요.
KEYSTORE_KEY_ALIAS
키스토어 키 별칭을 생성하세요. (예: my-key-alias)
KEYSTORE_KEY_PASSWORD
키스토어 키 비밀번호를 생성하세요.
KEYSTORE_STORE_PASSWORD
키스토어 저장소 비밀번호를 생성하세요.
DEVELOPER_PACKAGE_NAME
앱의 패키지 이름을 생성하세요. (예: com.example.app)
앱의 패키지 이름은 개발자 콘솔에서 확인할 수 있습니다. android/app/build.gradle under applicationId
4.3: 모든 비밀을 확인하세요
6 가지 비밀을 설정했는지 확인하세요:
- ✅ PLAY_CONFIG_JSON
- ✅ ANDROID_KEYSTORE_FILE
- ✅ KEYSTORE_KEY_ALIAS
- ✅ KEYSTORE_KEY_PASSWORD
- ✅ KEYSTORE_STORE_PASSWORD
- ✅ DEVELOPER_PACKAGE_NAME
5. GitHub 액션 워크플로우를 생성하세요
만들기 .github/workflows/build-upload-android.yml:
name: Build and Deploy Android App
on:
push:
tags:
- '*'
jobs:
build_android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 24
cache: npm
- name: Install dependencies
run: npm ci
- name: Cache Gradle
uses: actions/cache@v5
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Build app
run: npm run build
- name: Sync Capacitor
run: npx cap sync
- name: Setup Java
uses: actions/setup-node@v5
with:
distribution: 'zulu'
java-version: '17'
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.0'
bundler-cache: true
- name: Run Fastlane
uses: maierj/fastlane-action@v3.1.0
env:
PLAY_CONFIG_JSON: ${{ secrets.PLAY_CONFIG_JSON }}
ANDROID_KEYSTORE_FILE: ${{ secrets.ANDROID_KEYSTORE_FILE }}
DEVELOPER_PACKAGE_NAME: ${{ secrets.DEVELOPER_PACKAGE_NAME }}
KEYSTORE_KEY_ALIAS: ${{ secrets.KEYSTORE_KEY_ALIAS }}
KEYSTORE_KEY_PASSWORD: ${{ secrets.KEYSTORE_KEY_PASSWORD }}
KEYSTORE_STORE_PASSWORD: ${{ secrets.KEYSTORE_STORE_PASSWORD }}
with:
lane: android beta
- name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: android-release
path: ./android/app/build/outputs/bundle/release/app-release.aab
retention-days: 10
작동 방식
- __CAPGO_KEEP_0__ Git 태그를 생성하여 워크플로우를 트리거합니다.
- GitHub Actions는 앱을 빌드합니다.
- Fastlane은 Google Play 베타 채널에 앱을 업로드합니다.
- 앱은 자동으로 업데이트됩니다.
빌드 시간 및 비용
- 빌드 시간: 3-5분
- 비공개 저장소당 빌드 비용: ~$0.04
- 공개 소스 프로젝트는 무료입니다.
관련 문서
CI/CD 설정 가이드
- Capacitor Actions를 사용하여 자동으로 GitHub iOS 빌드를 생성합니다. - iOS CI/CD 설정을 완료합니다.
- 자동 빌드 및 릴리즈와 GitHub 액션 - CI/CD pipeline 튜토리얼
- 개발 및 운영 빌드 관리와 GitHub 액션 - 환경 관리
대안 CI/CD 플랫폼
- GitLab CI로 빌드 - Android용 GitLab 대안
- CodeMagic으로 빌드 - CodeMagic 설정 가이드
라이브 업데이트 및 배포
- Capgo 라이브 업데이트스 문서 - 앱에 OTA 업데이트를 추가
- CI/CD 통합과 Capgo - pipeline에 실시간 업데이트를 통합하세요
자원
Keep going from Automatic Capacitor Android build with GitHub actions
__CAPGO_KEEP_0__ 액션을 사용 중이라면 자동 Capacitor Android 빌드와 GitHub 액션을 사용하여 CI/CD 자동화 계획을 만들 때 Capgo CI/CD와 연결하세요 Capgo CI/CD에서 Capgo CI/CD의 제품 워크플로우에서 제품 워크플로우에서 Capgo 네이티브 빌드를 위해 Capgo 통합 Capgo 통합을 위해 제품 워크플로우 CI/CD 통합 CI/CD 통합에 대한 구현 세부 정보, 그리고 GitHub 액션 통합에 대한 구현 세부 정보 for the implementation detail in GitHub Actions Integration.