주 콘텐츠로 바로가기
CI/CD

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

5분 만에 fastlane과 GitLab을 사용하여 안드로이드 아이오닉 앱의 CI/CD PIPELINE을 설정하는 방법

Anik Dhabal Babu

Anik Dhabal Babu

콘텐츠 마케터

GitLab과 자동으로 Capacitor Android 빌드를 생성합니다.

GitLab CI를 사용하여 자동 Android 빌드

Capacitor 앱의 CI/CD 설정은 복잡하고 시간이 많이 걸립니다. 다음을 이해해야 합니다.

사전 요구 사항

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

  • GitLab 계정에 관리자 권한이 있는 계정
  • Google Play Store에 이미 출시된 앱
  • Android signing key 및 keystore 파일
  • Google Cloud Console 프로젝트에 Play Store API이 활성화된 상태
  • 권한이 있는 서비스 계정
  • GitLab CI/CD 워크플로우 이해
  • Fastlane 구성 지식
  • pipeline 유지 및 디버깅 시간

Capgo CI/CD를 위해 Capgo로 빌드

Fastlane, Gradle 런너, 키스토어 및 업로드 스크립트 유지 관리를 생략 Capgo 빌드 __CAPGO_KEEP_0__ 빌드는 기존 CI/CD pipeline에서 실행 중인 signed native Android 빌드를 실행합니다.:

  • __CAPGO_KEEP_0__ 빌드는 웹 빌드 후에 GitLab CI, __CAPGO_KEEP_1__ Actions, Jenkins, 또는 로컬 스크립트에서 트리거됩니다.: Trigger Capgo Build from GitLab CI, GitHub Actions, Jenkins, or local scripts after your web build and npx cap sync.
  • : Android 키스토어, 키 별칭, 비밀번호 및 Play Console 서비스 계정 JSON을 CI 비밀에서 유지: Android 키스토어, 키 별칭, 비밀번호 및 Play Console 서비스 계정 JSON을 CI 비밀에서 유지
  • No native runner 관리: Capgo 빌드가 유지 관리되는 안드로이드 빌드 환경을 제공하므로 SDK 이미지, Gradle 캐시 문제, 또는 Fastlane 경로를 관리할 필요가 없습니다.
  • 아티팩트 및 제출: QA를 위해 서명된 아티팩트를 다운로드하거나 Capgo CLI를 통해 릴리스 빌드를 제출할 수 있습니다.

가격

  • Capgo 플랜은 1달에 12달러부터 시작합니다.
  • OTA 업데이트와 매월 약 15개의 네이티브 빌드를 포함합니다.
  • 추가 빌드 분량은 분당 크레딧으로 청구됩니다.

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

수동 설정 안내서

다음 단계를 따르세요:

게시물에 나열된 단계를 따르세요.

  1. __CAPGO_KEEP_0__
  2. GitLab 암호화 변수에 비밀번호를 저장하세요.
  3. Google Play 서비스 계정 키를 생성 및 저장하세요.
  4. Android 서명 키를 저장하세요.
  5. GitLab workflow .yml 파일을 설정하세요.

1. Fastlane 파일을 복사하세요.

Fastlane은 Ruby 라이브러리로 모바일 개발을 자동화하는 데 사용됩니다. Fastlane을 사용하면 Android Studio에서 수행하는 일반적인 작업을 자동화할 수 있습니다. 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은 GitHub의 저장소 비밀번호와 유사한 암호화된 CI/CD 변수를 저장하는 방법을 제공합니다._sensitive 정보를 안전하게 저장하세요.

  1. GitLab 프로젝트의 설정으로 이동하세요.
  2. CI/CD > 변수로 이동하세요.
  3. 다음 변수를 추가하세요:
  • ANDROID_KEYSTORE_FILE: Android 빌드에 서명하기 위해 사용하는 base64-인코딩 .jks 또는 .keystore 파일입니다. 이 파일은 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 계정 키 생성

비밀번호를 생성하기 위해 다음 단계를 따르세요: PLAY_CONFIG_JSON 비밀을 생성하기 위해 다음 단계를 따르세요:

  1. Go to the Google Cloud Console
  2. 새로운 프로젝트를 만들거나 기존 프로젝트를 선택하세요
  3. Google Play Android Developer API를 활성화하세요
  4. 서비스 계정 만들기:
    • ‘IAM & Admin’ > ‘Service Accounts’로 이동하세요
    • ‘서비스 계정 만들기’ 클릭
    • 이름과 설명을 입력하세요
    • ‘만들기 및 계속’ 클릭
    • 권한 assignment 생략하고 ‘완료’ 클릭
  5. JSON 키 생성:
    • 서비스 계정 목록에서 찾으세요
    • Click the three dots menu > “총다 총다세요”
    • Click “총다세요 Key” > “총다세요 new key”
    • Choose JSON format
    • Click “총다세요”
  6. Grant the service account access to your app in the Play Console:
    • Go to 총다세요 총다세요총의 총세요의 총의세요
    • Navigate to “총세요총의 총의세요의 총의세요”
    • Click “총세요 new users”
    • Enter the service account email (ends with @*.iam.gserviceaccount.com)
    • Grant “총세요 to production” permission
    • Click “총세요 user”
  7. Base64으로 JSON 키를 변환하세요:
    base64 -i path/to/your/service-account-key.json | pbcopy
  8. GitLab에서 base64 인코딩 문자열을 변수로 추가하세요. PLAY_CONFIG_JSON GitLab CI/CD Pipeline을 설정하세요.

.gitlab-ci.yml 파일을 프로젝트의 루트 디렉토리에 생성하여 CI/CD pipeline을 정의하세요. 아래는 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

GitLab 저장소에 새로운 태그를 푸시할 때마다 GitLab CI/CD는 정의된 pipeline을 트리거하고, Fastlane을 사용하여 Android 앱을 빌드 및 배포합니다.

프로젝트의 구조와 요구 사항에 따라 경로 및 의존성을 조정하십시오. 이 설정은 GitLab CI/CD를 사용하여 Android 앱의 자동 배포를 도와줍니다.

결론

GitLab CI/CD에 mingc/android-build-box Docker 이미지를 구성하여 Android 앱 빌드 프로세스를 자동화할 수 있습니다. 이 자동화는 개발 워크플로우의 효율성과 신뢰성을 향상시키고, 앱 개발의 핵심적인 부분에 집중할 수 있도록 시간을 절약합니다. 또한, 높은 품질의 Android 앱을 더 효율적으로 배포할 수 있습니다.

GitLab에서 자동화된 __CAPGO_KEEP_0__ Android 빌드를 계속하세요.

Keep going from Automatic Capacitor Android build with GitLab

__CAPGO_KEEP_0__ 자동 Capacitor GitLab에서 Android 빌드 CI/CD 자동화 계획을 세우기 위해 연결하세요. Capgo CI/CD Capgo CI/CD에서 제품 워크플로우를 위한 Capgo Native Builds Capgo Native Builds에서 제품 워크플로우를 위한 Capgo Integrations Capgo Integrations에서 제품 워크플로우를 위한 CI/CD 통합 CI/CD 통합 구현 세부 사항을 위한 GitHub Actions 통합 GitHub Actions 통합 구현 세부 사항을 위한

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

웹-layer 버그가 활성화된 상태에서, 앱 스토어 승인까지 며칠 기다리지 않고 Capgo를 통해 픽스를 배포하세요. 사용자는 배경에서 업데이트를 받으며, 네이티브 변경은 일반적인 검토 경로를 유지합니다.

시작하기

블로그에서 최신 뉴스

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