본문으로 이동
CI/CD

자동 Capacitor 안드로이드 빌드와 GitLab

5분 안에 Ionic 안드로이드 앱에 대한 CI/CD PIPELINE을 설정하는 방법

작성자

마틴 도나디우

작성자

발레리아

리뷰어

조던

편집기

GitLab을 사용하여 자동화된 Capacitor 안드로이드 빌드

GitLab CI를 사용한 자동화된 안드로이드 빌드

Capacitor 앱에 대한 CI/CD를 설정하는 것은 복잡하고 시간이 많이 걸립니다. 알아야 할 내용은 다음과 같습니다.

필수 조건

시작하기 전에 다음을 설정해야 합니다.

  • GitLab 계정에 관리자 권한이 있는 계정
  • Google Play Store에 이미 올려져 있는 __CAPGO_KEEP_0__ 앱
  • 안드로이드 서명 키와 키스토어 파일
  • Google Cloud Console 프로젝트에 Play Store API이 활성화된 상태
  • 서비스 계정에 적절한 권한
  • 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과 함께 작동합니다.: Trigger Capgo Build from GitLab CI, GitHub Actions, Jenkins, or local scripts after your web build and npx cap sync.
  • __CAPGO_KEEP_0__ CI 비밀에서 signing: Android 키 저장소, 키 별칭, 비밀번호, Play Console 서비스 계정 JSON을 CI 비밀에 저장합니다.
  • native 런너 유지 관리: Capgo 빌드는 유지 관리된 Android 빌드 환경을 제공하므로 SDK 이미지를 관리하거나 Gradle 캐시 문제 또는 Fastlane 경로를 관리할 필요가 없습니다.
  • Artifact 및 제출: QA에서 signed artifact를 다운로드하거나 Capgo CLI을 통해 릴리즈 빌드를 제출할 수 있습니다.

가격

  • Capgo 플랜은 월 $12부터 시작됩니다.
  • OTA 업데이트와 월 15개 정도의 네이티브 빌드가 포함됩니다.
  • 추가 빌드 분량은 분당 크레딧으로 청구됩니다.

CI/CD에서 Capgo 빌드를 설정하세요.

수동 설정 안내서

다음 단계를 따르세요.

Fastlane 파일 복사

  1. GitLab 암호화된 비밀을 저장하세요.
  2. 가격
  3. Android Play 서비스 계정 키를 생성 및 저장하는 방법
  4. Android signing 키를 저장하는 방법
  5. GitLab 워크플로우 (.yml 파일) 설정하는 방법

1. Fastlane 파일 복사

Fastlane은 Ruby 라이브러리로 모바일 개발을 자동화하는 데 사용됩니다. Fastlane을 사용하면 Android Studio에서 수행하는 일반적인 작업을 자동화할 수 있습니다. Fastlane을 사용하면 사용자 정의 '로우'를 구성할 수 있으며, 로우 내에서 '액션'을 묶어 작업을 수행할 수 있습니다. 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 정보를 안전하게 저장하려면

  1. 프로젝트의 설정으로 이동하세요.
  2. CI/CD > 변수로 이동하세요.
  3. 다음 변수를 추가하세요:
  • ANDROID_KEYSTORE_FILE: base64 인코딩된 .jks 또는 .keystore 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 Service Account Key를 생성하는 방법

비밀 키를 생성하려면 다음 단계를 따르세요: PLAY_CONFIG_JSON Google Cloud Console로 이동하세요:

  1. KEYSTORE_KEY_PASSWORD: 키 스토어 파일과 관련된 암호 KEYSTORE_KEY_ALIAS: 키 스토어 별칭
  2. 새로운 프로젝트를 만들거나 기존 프로젝트를 선택하세요.
  3. Enable the Google Play Android Developer API
  4. 서비스 계정 만들기:
    • ‘IAM & Admin’ > ‘Service Accounts’로 이동하세요.
    • ‘서비스 계정 만들기’ 클릭하세요.
    • 이름과 설명을 입력하세요.
    • ‘만들기 및 계속하기’ 클릭하세요.
    • 권한 assignment을 건너뛰고 ‘완료’ 클릭하세요.
  5. JSON 키 생성:
    • 서비스 계정 목록에서 찾으세요.
    • 세 개의 점 메뉴 > ‘Manage keys’ 클릭하세요.
    • ‘키 추가’ > ‘새 키 만들기’ 클릭하세요.
    • JSON 형식 선택
    • ‘Create’ 클릭
  6. 서비스 계정에 앱에 대한 접근 권한을 Play Console에서 부여하십시오:
    • 다음으로 Play Console
    • ‘사용자 및 권한’으로 이동하십시오
    • ‘새로운 사용자 초대’ 클릭
    • 서비스 계정 이메일 주소 입력 (*.iam.gserviceaccount.com로 끝나십시오)
    • ‘제품 출시 허용’ 권한 부여
    • ‘사용자 초대’ 클릭
  7. JSON 키를 base64로 변환하십시오:
    base64 -i path/to/your/service-account-key.json | pbcopy
  8. base64로 인코딩된 문자열을 ‘‘로 추가하십시오: PLAY_CONFIG_JSON GitLab 변수

GitLab CI/CD PIPELINE 설정

프로젝트의 루트 디렉토리에 .gitlab-ci.yml 파일을 생성하여 CI/CD PIPELINE을 정의하세요. 아래는 PIPELINE을 구조화하는 예시입니다.


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

PIPELINE 트리거

GitLab 저장소에 새로운 태그를 푸시할 때마다 GitLab CI/CD는 정의된 PIPELINE을 트리거하고, 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 Capgo CI/CD Capgo CI/CD를 위한 제품 워크플로우 Capgo Native Builds Capgo Native Builds를 위한 제품 워크플로우 Capgo Integrations Capgo Integrations를 위한 제품 워크플로우 CI/CD 통합 __CAPGO_KEEP_0__ 액션 통합 GitHub 액션 통합의 구현 세부 사항 GitHub 액션 통합

Capacitor 앱에 대한 실시간 업데이트

웹-layer 버그가 활성화되면 Capgo를 통해修정을 배포하는 대신 앱 스토어 승인까지 며칠 기다리지 마세요. 사용자는 배경에서 업데이트를 받으면서 네이티브 변경 사항은 일반적인 검토 경로에 남아 있습니다.

마틴의 인간 지원

시작하세요

최신 뉴스

Capgo은 전문적인 모바일 앱을 만들기 위해 필요한 최고의 통찰력을 제공합니다.