Mobile DevOps

Status: Experiment

GitLab Mobile DevOps를 사용하여 Android 및 iOS용 네이티브 및 크로스 플랫폼 모바일 앱을 빌드, 서명 및 릴리스하세요. GitLab CI/CD를 사용합니다. Mobile DevOps는 GitLab Incubation Engineering에서 개발 중인 실험적인 기능입니다.

Mobile DevOps는 아직 개발 중이지만 다음을 수행할 수 있습니다:

빌드 환경

GitLab 호스팅 러너를 사용하여 빠르게 시작하거나 Self-Managed형 러너를 설정하여 빌드 환경을 완전히 제어하세요.

Android 빌드 환경

적절한 도커 이미지를 선택하고 .gitlab-ci.yml 파일에 추가하여 Android 빌드 환경을 설정하세요. Fabernovel은 다양한 Android 버전을 지원합니다.

예시:

test:
  image: fabernovel/android:api-33-v1.7.0
  stage: test
  script:
    - fastlane test

iOS 빌드 환경

macOS에서 호스팅되는 GitLab 러너는 베타입니다.

맥용 GitLab 호스팅 러너에서 작업을 실행할 이미지를 선택하고 .gitlab-ci.yml 파일에 추가하세요.

예시:

test:
  image: macos-12-xcode-14
  stage: test
  script:
    - fastlane test
  tags:
    - saas-macos-medium-m1

코드 서명

Android 및 iOS 앱은 배포되기 전에 반드시 안전하게 서명되어야 합니다. 서명을 통해 애플리케이션이 사용자의 장치에 도달하기 전에 변경되지 않았음이 보장됩니다.

프로젝트 수준 보안 파일을 사용하여 다음을 GitLab에 저장하여 CI/CD 빌드에서 앱을 안전하게 서명할 수 있습니다:

  • 키스토어
  • 프로비저닝 프로필
  • 서명 인증서

개요는 프로젝트 수준 보안 파일 데모를 참조하세요.

fastlane 및 Gradle을 사용하여 Android 프로젝트 서명

Android용 서명을 설정하려면:

  1. 프로젝트 수준 안전 파일에 키스토어 및 키스토어 속성 파일을 업로드하세요.
  2. Gradle 구성에서 해당 파일을 사용하도록 업데이트하세요.

개요는 GitLab을 사용하여 Google Play에 Android 앱을 빌드하고 릴리스하는 방법을 참조하세요.

키스토어 생성

다음 명령을 실행하여 기존에 없는 경우 키스토어 파일을 생성하세요:

keytool -genkey -v -keystore release-keystore.jks -storepass password -alias release -keypass password -keyalg RSA -keysize 2048 -validity 10000

다음으로, release-keystore.properties라는 이름의 파일에 키스토어 구성을 넣으세요. 다음과 유사한 모습이어야 합니다:

storeFile=.secure_files/release-keystore.jks
keyAlias=release
keyPassword=password
storePassword=password

이 파일을 생성한 후:

  • GitLab 프로젝트의 보안 파일로 업로드하세요.
  • .gitignore 파일에 두 파일을 추가하여 버전 관리에 커밋되지 않도록 설정하세요.

Gradle 구성

다음 단계는 새로 생성한 키스토어를 사용하도록 Gradle을 구성하는 것입니다. 앱의 build.gradle 파일에서:

  1. 플러그인 섹션 바로 다음에 다음을 추가하세요:

    def keystoreProperties = new Properties()
    def keystorePropertiesFile = rootProject.file('.secure_files/release-keystore.properties')
    if (keystorePropertiesFile.exists()) {
      keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    }
    
  2. android 블록 내 어디든지 다음을 추가하세요:

    signingConfigs {
      release {
        keyAlias keystoreProperties['keyAlias']
        keyPassword keystoreProperties['keyPassword']
        storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
        storePassword keystoreProperties['storePassword']
      }
    }
    
  3. 릴리스 빌드 타입에 signingConfig를 추가하세요:

    signingConfig signingConfigs.release
    

이 구성이 완료되면 secure 파일에 저장된 파일로 fastlane을 사용하여 앱을 빌드하고 서명할 수 있습니다.

예시:

  • 샘플 fastlane/Fastfile 파일:

    default_platform(:android)
      
    platform :android do
      desc "Create and sign a new build"
      lane :build do
        gradle(tasks: ["clean", "assembleRelease", "bundleRelease"])
      end
    end
    
  • 샘플 .gitlab-ci.yml 파일:

    build:
      image: fabernovel/android:api-33-v1.7.0
      stage: build
      script:
        - apt update -y && apt install -y curl
        - curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | bash
        - fastlane build
    

fastlane을 사용하여 iOS 프로젝트 서명

iOS용 서명을 설정하려면 다음을 수행해야 합니다:

  1. 로컬에 fastlane을 설치하여 서명 인증서를 GitLab에 업로드해야 합니다.
  2. 빌드를 해당 파일을 사용하도록 구성하세요.

개요는 GitLab을 사용하여 Test Flight에 iOS 앱을 빌드하고 릴리스하는 방법을 참조하세요.

fastlane 초기화

fastlane을 설치한 후 다음을 실행하여 시작하세요:

fastlane init

이 명령은 프로젝트에 Appfile 및 빈 fastfile이 포함된 fastlane 폴더를 생성합니다. 이 프로세스 중에 App Store Connect 로그인 자격 증명을 입력하여 앱 식별자 및 App Store 앱을 생성할 수 있습니다.

다음 단계는 fastlane match를 설정하여 프로젝트의 서명 파일을 관리하는 것입니다. 다음 명령을 실행하여 구성된 Matchfile을 생성하세요:

fastlane match init

이 명령으로 다음을 수행해야 합니다:

  • 사용할 리포지터리 백엔드를 선택하세요. gitlab_secure_files을(를) 선택해야 합니다.
  • 프로젝트 경로를 입력하세요. 예: gitlab-org/gitlab.

인증서 생성 및 업로드

다음 명령을 실행하여 Apple 개발자 포털에서 인증서 및 프로필을 생성하고 이들 파일을 GitLab에 업로드하세요:

PRIVATE_TOKEN=YOUR-TOKEN bundle exec fastlane match development

이 예시에서:

  • YOUR-TOKEN을 GitLab 프로젝트에 대한 유지자 역할을 가진 개인 또는 프로젝트 액세스 토큰으로 대체하세요.
  • developmentappstore 또는 ad-hoc과 같이 서명하려는 빌드 유형으로 대체하세요.

명령이 완료되면 프로젝트의 CI/CD 설정에서 파일을 볼 수 있습니다.

업로드 전용

프로젝트에 대한 서명 인증서 및 프로비저닝 프로필을 이미 만들었다면, 기존 파일을 GitLab에 로드하려면 선택적으로 fastlane match import를 사용할 수 있습니다.

PRIVATE_TOKEN=YOUR-TOKEN bundle exec fastlane match import

파일의 경로를 입력하라는 프롬프트가 나타납니다. 해당 세부 정보를 제공한 후에는 파일이 업로드되어 프로젝트의 CI/CD 설정에서 볼 수 있습니다. 가져오는 동안 git_url을 묻는 경우, 비워두고 Enter를 눌러도 안전합니다.

이 설정이 완료되면 fastlane을 사용하여 앱을 빌드하고 서명할 수 있습니다 안전한 파일에 저장된 파일을 사용합니다.

예를 들어:

  • 샘플 fastlane/Fastfile 파일:

    default_platform(:ios)
      
    platform :ios do
      desc "개발용으로 애플리케이션 빌드 및 서명"
      lane :build do
        setup_ci
          
        match(type: 'development', readonly: is_ci)
          
        build_app(
          project: "ios demo.xcodeproj",
          scheme: "ios demo",
          configuration: "Debug",
          export_method: "development"
        )
      end
    end
    
  • 샘플 .gitlab-ci.yml 파일:

    build_ios:
      image: macos-12-xcode-14
      stage: build
      script:
        - fastlane build
      tags:
        - saas-macos-medium-m1
    

배포

서명된 빌드는 Mobile DevOps 배포 통합을 사용하여 Google Play Store 또는 Apple App Store에 업로드할 수 있습니다.

Google Play 통합 및 fastlane을 사용한 Android 배포

Google Play 통합 및 fastlane을 사용하여 Android 배포를 만들려면 다음을 수행해야 합니다:

  1. Google Cloud Platform에서 Google 서비스 계정을 생성하고 해당 계정에 Google Play 프로젝트 액세스 권한을 부여해야 합니다.
  2. Google Play 통합을 활성화하세요.
  3. 파이프라인에 릴리스 단계를 추가하세요.

개요는 Google Play 통합 데모를 참조하세요.

Google Play 통합 활성화

GitLab에서 Google Play 통합을 사용하여 CI/CD 파이프라인을 Google Play Console에 연결하여 Android 앱을 빌드하고 배포할 수 있습니다. 이 통합을 활성화하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 설정 > 통합을 선택하세요.
  3. Google Play을 선택하세요.
  4. 통합 사용 아래의 활성 확인란을 선택하세요.
  5. 패키지 이름에 앱의 패키지 이름을 입력하세요. 예: com.gitlab.app_name.
  6. 서비스 계정 키 (.JSON)에 키 파일을 드래그하여 업로드하세요.
  7. 변경 사항 저장을 선택하세요.

통합을 활성화하면 fastlane을 사용하여 Google Play에 빌드를 배포할 수 있습니다.

예를 들어:

  • 샘플 fastlane/Fastfile:

    default_platform(:android)
      
    platform :android do
      desc "Google Play 스토어에 새 베타 빌드 제출"
      lane :beta do
        upload_to_play_store(
          track: 'internal',
          aab: 'app/build/outputs/bundle/release/app-release.aab',
          release_status: 'draft'
        )
      end
    end
    
  • 샘플 .gitlab-ci.yml:

    beta:
      image: fabernovel/android:api-33-v1.7.0
      stage: beta
      script:
        - fastlane beta
    

Apple App Store 통합 및 fastlane을 사용한 iOS 배포

Apple App Store 통합 및 fastlane을 사용하여 iOS 배포를 만들려면 다음을 수행해야 합니다:

  1. App Store Connect API용 API 키 생성. Apple App Store Connect 포털에서 프로젝트를 위해 새 개인 키를 생성하세요.
  2. Apple App Store Connect 통합을 활성화하세요.
  3. 파이프라인에 릴리스 단계를 추가하고 fastlane 구성하세요.

개요는 Apple App Store Connect 통합 데모를 참조하세요.

Apple App Store Connect 통합 활성화

필수 조건:

Apple App Store Connect 통합을 사용하여 CI/CD 파이프라인을 App Store Connect에 연결하여 iOS, iPadOS, macOS, tvOS 및 watchOS용 앱을 빌드하고 배포할 수 있습니다.

GitLab에서 Apple App Store Connect 통합을 사용하여 통합을 활성화하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 설정 > 통합을 선택하세요.
  3. Apple App Store Connect를 선택하세요.
  4. 통합 사용 아래의 활성 확인란을 선택하세요.
  5. Apple App Store Connect 구성 정보를 제공하세요:
    • 발행자 ID: Apple App Store Connect 발행자 ID.
    • 키 ID: 생성된 개인 키의 키 ID.
    • 개인 키: 생성된 개인 키. 이 키는 한 번만 다운로드할 수 있습니다.
    • 보호된 브랜치 및 태그만 사용: 보호된 브랜치 및 태그에만 변수를 설정하려면 활성화합니다.
  6. 변경 사항 저장을 선택하세요.

통합이 활성화되면 fastlane을 사용하여 TestFlight 및 Apple App Store에 빌드를 배포할 수 있습니다.

예를 들어:

  • 샘플 fastlane/Fastfile:

    default_platform(:ios)
      
    platform :ios do
      desc "배포용으로 애플리케이션 빌드 및 서명, TestFlight에 업로드"
      lane :beta do
        setup_ci
          
        match(type: 'appstore', readonly: is_ci)
          
        app_store_connect_api_key
          
        increment_build_number(
          build_number: latest_testflight_build_number(initial_build_number: 1) + 1,
          xcodeproj: "ios demo.xcodeproj"
        )
          
        build_app(
          project: "ios demo.xcodeproj",
          scheme: "ios demo",
          configuration: "Release",
          export_method: "app-store"
        )
          
        upload_to_testflight
      end
    end
    
  • 샘플 .gitlab-ci.yml:

    beta_ios:
      image: macos-12-xcode-14
      stage: beta
      script:
        - fastlane beta
    

모바일용 리뷰 앱

Merge Request에서 변경 사항을 미리보기 하기 위해 리뷰 앱을 사용할 수 있습니다. 이 기능은 Appetize.io와의 통합을 통해 가능합니다.

개요는 모바일용 리뷰 앱 설정 지침을 참조하세요.

시작하려면 설정 지침을 확인하세요.

모바일 SAST

코드의 알려진 보안 취약점을 확인하기 위해 정적 응용 프로그램 보안 테스트(SAST)를 사용할 수 있습니다. 모바일 SAST는 실험적인 SAST 기능을 확장하여 Mobile Security Framework (MobSF)를 기반으로 하는 모바일 팀을 위한 기능을 제공합니다.

샘플 참조 프로젝트

다양한 플랫폼에 대한 완전한 빌드, 서명 및 릴리스 파이프라인 예제를 보려면 아래의 샘플 참조 프로젝트를 참고하세요. 사용 가능한 모든 프로젝트 디렉터리은 Mobile DevOps 데모 프로젝트 그룹에서 찾을 수 있습니다.

Mobile DevOps 블로그

추가적인 참조 자료는 GitLab 블로그의 DevOps 섹션에서 찾을 수 있습니다.