GitLab CI를 사용한 자동 안드로이드 빌드
Setting up CI/CD for Capacitor apps can be complex and time-consuming. Here’s what you need to know:
준비 사항
시작하기 전에 다음을 설정해야 합니다.
- GitLab 계정에 관리자 권한이 있는 계정
- Google Play Store에 이미 올려져 있는 앱
- 안드로이드 서명 키와 키스토어 파일
- Google Cloud Console project with Play Store API enabled
- 권한이 있는 서비스 계정
- GitLab CI/CD 워크플로우에 대한 이해
- Fastlane 구성에 대한 지식
- pipeline 유지 및 디버깅에 필요한 시간
Capgo CI/CD 빌드에 의해 Capgo
Fastlane, Gradle 런너,_keystore_, 업로드 스크립트 유지 관리를 생략합니다. Capgo 빌드 __CAPGO_KEEP_0__ 빌드는 CI/CD pipeline에서 이미 존재하는 빌드 파이프라인에서 signed native Android 빌드를 실행합니다:
- __CAPGO_KEEP_0__ 빌드는 pipeline과 함께 작동합니다.: GitLab CI, GitHub 액션, Jenkins, 또는 로컬 스크립트에서 Capgo 빌드를 트리거하고 GitHub
npx cap sync. - __CAPGO_KEEP_0__ 빌드는 CI secret에서 Android 키 스토어, 키 별칭, 비밀번호, Play Console 서비스 계정 JSON을 유지합니다.__CAPGO_KEEP_0__ 빌드는 native 런너 유지 관리를 제공하지 않습니다.
- : __CAPGO_KEEP_0__ 빌드는 유지 관리된 Android 빌드 환경을 제공하여 __CAPGO_KEEP_1__ 이미지를 관리하지 않아도, Gradle 캐시 문제, 또는 Fastlane 경로를 관리하지 않아도 됩니다.: Capgo Build provides maintained Android build environments, so you do not have to manage SDK images, Gradle cache issues, or Fastlane lanes.
- : QA에 signed 아티팩트를 다운로드하거나 __CAPGO_KEEP_0__ __CAPGO_KEEP_1__를 통해 릴리스 빌드를 제출할 수 있습니다.Capgo CLI
가격 정보
- Capgo 계획은 월 $12에 시작됩니다
- OTA 업데이트 및 월 15개 이상의 네이티브 빌드 포함
- 추가 빌드 분량은 분당 크레딧으로 청구됩니다
수동 설정 안내서
다음 단계를 따르세요
Fastlane 파일 복사
- GitLab 암호화된 비밀을 저장하세요
- Google Play 서비스 계정 키를 생성 및 저장하세요
- Android 서명 키를 저장하세요
- Pricing
- GitLab 워크플로우 .yml 파일을 설정하세요.
1. Fastlane 파일을 복사하세요.
Fastlane은 Ruby 라이브러리로 모바일 개발을 자동화하는 데 사용됩니다. Fastlane을 사용하면 Android Studio에서 수행하는 일반적인 작업을 자동화할 수 있습니다. Fastlane은 여러 '액션'을 포함하는 '레인'을 구성할 수 있습니다. Fastlane은 Android Studio에서 수행하는 작업을 자동화할 수 있지만, 이 튜토리얼에서는 Fastlane의 핵심 액션만 사용할 것입니다.
Fastlane 폴더를 프로젝트의 루트에 만들고 다음 파일을 복사하세요: Fastlane
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'])
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}")
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(
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
lane :build do
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}",
})
end
lane :prod_release do
build_gradle = File.read("../android/app/build.gradle")
verify_changelog_exists(version_code: build_gradle.match(/versionCode (\d+)/)[1])
verify_upload_to_staging(version_name: build_gradle.match(/versionName '([\d\.]+)'/)[1])
supply(
track_promote_to: 'beta',
skip_upload_apk: true,
skip_upload_aab: true,
skip_upload_metadata: false,
skip_upload_changelogs: false,
skip_upload_images: false,
skip_upload_screenshots: false
)
end
end
GitLab CI/CD 변수를 저장하세요.
GitLab은 CI/CD 변수를 암호화하여 저장할 수 있는 방법을 제공합니다. GitHub의 저장소 비밀과 유사합니다._sensitive 정보를 안전하게 저장하세요.
- 프로젝트의 설정으로 이동하세요.
- CI/CD > 변수로 이동하세요.
- 다음 변수를 추가하세요:
- ANDROID_KEYSTORE_FILE: Android 빌드에 사용되는 base64-인코딩된
.jks또는.keystoreFastlane을 사용하여 Android 빌드에 사용되는 키 스토어 파일을 저장하세요. 이 키 스토어 파일은 Play App Signing을 사용하는 경우 업로드 키와 관련된 키 스토어 파일 또는 앱 서명 키일 수 있습니다. - KEYSTORE_KEY_PASSWORD: 키스토어 파일과 관련된 암호
- KEYSTORE_KEY_ALIAS: 키스토어 별칭
- KEYSTORE_STORE_PASSWORD: 개인 키 암호
- DEVELOPER_PACKAGE_NAME: Android 앱 ID와 같은 com.example.app
- PLAY_CONFIG_JSON: 서비스 계정 키 JSON을 base64로 인코딩한 것
Google Play 서비스 계정 키 생성
키를 생성하려면 다음 단계를 따르세요: PLAY_CONFIG_JSON Google Cloud Console로 이동하세요
- 새로운 프로젝트를 생성하거나 기존 프로젝트를 선택하세요 Google Play Android Developer __CAPGO_KEEP_0__를 활성화하세요
- Enable the Google Play Android Developer __CAPGO_KEEP_0__
- Enable the Google Play Android Developer API
- 서비스 계정 만들기:
- ‘IAM & Admin’ > ‘Service Accounts’로 이동하세요.
- ‘서비스 계정 만들기’ 클릭
- 이름과 설명을 입력하세요.
- ‘만들기 및 계속하기’ 클릭
- 권한 assignment 생략하고 ‘완료’ 클릭
- JSON 키 생성:
- 서비스 계정 목록에서 찾으세요.
- 세로 세로 세로 메뉴 > ‘키 관리’ 클릭
- ‘키 추가’ > ‘새 키 만들기’ 클릭
- JSON 형식 선택
- ‘만들기’ 클릭
- 서비스 계정에 앱에 대한 액세스 권한을 부여하세요.
- 로 이동하세요. Play Console
- 사용자 및 권한
- 새 사용자 초대
- 서비스 계정 이메일을 입력하세요 (iam.gserviceaccount.com로 끝납니다)
- 프로덕션 배포 허용
- 사용자 초대
- JSON 키를 base64로 변환하세요.
base64 -i path/to/your/service-account-key.json | pbcopy - GitLab 변수에 base64로 인코딩된 문자열을 추가하세요.
PLAY_CONFIG_JSONGitLab CI/CD PIPELINE 설정
Set Up Your GitLab CI/CD Pipeline
프로젝트의 루트 디렉토리에 .gitlab-ci.yml 파일을 생성하여 CI/CD 파이프라인을 정의하세요. 아래는 파이프라인의 구조를 정의하는 예시입니다.
image: mingc/android-build-box:latest
stages:
- build
- upload_to_capgo
- build_and_upload_android
build:
stage: build
tags:
- saas-linux-xlarge-amd64
cache:
- key:
files:
- bun.lockb
paths:
- .node_modules/
script:
- npm install
- npm run build
artifacts:
paths:
- node_modules/
- dist/
only:
- master
upload_to_capgo:
stage: upload_to_capgo
tags:
- saas-linux-xlarge-amd64
script:
- npx @capgo/cli@latest bundle upload -a $CAPGO_TOKEN -c dev
dependencies:
- build
when: manual
only:
- master
build_and_upload_android:
tags:
- saas-linux-xlarge-amd64
stage: build_and_upload_android
cache:
- key:
files:
- android/gradle/wrapper/gradle-wrapper.properties
paths:
- ~/.gradle/caches/
script:
- npx cap sync android
- npx cap copy android
- bundle exec fastlane android beta # We do create a tag for the build to trigger XCode cloud builds
dependencies:
- build
when: manual
only:
- master
파이프라인 트리거
GitLab 저장소에 새로운 태그를 푸시할 때마다 GitLab CI/CD는 정의된 파이프라인을 자동으로 트리거하고, Fastlane을 사용하여 Android 앱을 빌드하고 배포합니다.
프로젝트의 구조와 요구 사항에 따라 경로와 의존성을 조정하세요. 이 설정은 GitLab CI/CD에서 Android 앱의 자동 배포를 도와줍니다.
결론
mingc/android-build-box Docker 이미지를 사용하여 GitLab CI/CD를 구성하면 Android 앱 빌드 프로세스를 자동화할 수 있습니다. 개발 워크플로우를 효율적이고 신뢰할 수 있는 것으로 만들 수 있으며, 앱 개발의 핵심 부분에 집중할 수 있습니다. 결국, 높은 품질의 Android 앱을 더 효율적으로 배포할 수 있습니다.
Automatic Capacitor Android build with GitLab
Automatic __CAPGO_KEEP_0__ Android build with GitLab Automatic Capacitor Android build with GitLab Automatic __CAPGO_KEEP_0__ Android build with GitLab Automatic Capgo Android build with GitLab Automatic Capgo Android build with GitLab Capgo Native Builds Capgo 제품 워크플로우를 위한 Capgo Native Builds Capgo 통합 Capgo 제품 워크플로우를 위한 Capgo 통합 CI/CD 통합 CI/CD 통합 구현 세부 사항에서 GitHub 액션 통합 CI/CD 통합 구현 세부 사항에서 GitHub 액션 통합