다음을 통해 공유


Android 앱 빌드, 테스트 및 배포

Azure DevOps Services

이 빠른 시작에서는 Android 앱을 자동으로 빌드, 테스트 및 배포하도록 Azure Pipelines에서 YAML 파이프라인을 설정하는 방법을 보여 줍니다.

필수 조건

  • 파이프라인을 만들고 앱을 배포할 수 있는 권한이 있는 Azure DevOps 조직 및 프로젝트입니다. 프로젝트를 만들려면 Azure DevOps에서 프로젝트 만들기를 참조 하세요.

  • GitHub 계정.

    Important

    GitHub 프로시저 중에 GitHub 서비스 연결을 만들거나 GitHub로 리디렉션되어 로그인, Azure Pipelines 설치, Azure Pipelines 권한 부여 또는 GitHub 조직에 인증하라는 메시지가 표시될 수 있습니다. 화면의 지침에 따라 프로세스를 완료합니다. 자세한 내용은 GitHub 리포지토리에 대한 액세스를 참조 하세요.

파이프라인 만들기 및 실행

다음 작업을 수행하여 간단한 Android 애플리케이션에 대한 파이프라인을 설정합니다.

  1. 샘플 앱에 대한 코드를 가져오려면 Android 샘플 앱 리포지토리를 GitHub 계정에 포크합니다.
  2. Azure DevOps 프로젝트에서 파이프라인 새 파이프라인을>선택하거나, 이 파이프라인이 프로젝트의 첫 번째 파이프라인인 경우 파이프라인 만들기를 선택합니다.
  3. 소스 코드의 위치로 GitHub를 선택합니다.
  4. 리포지토리 선택 화면에서 포크된 Android 샘플 리포지토리를 선택합니다.
  5. 파이프라인 구성 화면에서 Android를 선택합니다.
  6. Azure Pipelines는 Android 템플릿을 기반으로 하는 시작 파이프라인을 제공합니다. 파이프라인 코드를 검토합니다.
  7. 저장 및 실행을 선택합니다.
  8. 필요에 따라 커밋 메시지를 편집하고 설명을 제공합니다. 그런 다음 저장을 선택하고 다시 실행하여 azure-pipelines.yml 파일을 리포지토리에 커밋하고 빌드를 시작합니다.

빌드 실행 페이지에는 빌드 세부 정보 및 진행률이 표시됩니다. 파이프라인의 작동을 확인하려면 페이지 아래쪽에서 작업을 선택합니다.

이제 사용자 지정할 준비가 된 리포지토리에 작업 중인 Android YAML 파이프라인 (azure-pipelines.yml)이 있습니다.

파이프라인 사용자 지정

파이프라인을 변경하려면 파이프라인 페이지에서 편집을 선택합니다. 다음 섹션에서는 Android 파이프라인을 사용자 지정하는 몇 가지 일반적인 방법을 설명합니다.

Gradle 구성

시작 YAML 파이프라인은 Android 프로젝트에 대한 일반적인 오픈 소스 빌드 도구인 Gradle을 사용합니다. 자세한 내용은 Gradle 작업을 참조 하세요.

예제 작업에서 매개 변수는 tasks 빌드 형식을 assembleDebug 빌드합니다. 원하는 빌드 변형에 대한 값(예: build, testassembleRelease)을 조정할 tasks 수 있습니다.

또한 예제 작업은 파일이 리포지토리의 루트에 있다고 gradlew 가정합니다. 그렇지 않은 경우 그에 따라 workingDirectory 값과 gradleWrapperFile 값을 조정합니다.

workingDirectory 포지토리의 루트(예: AndroidApps/MyApp 또는 $(system.defaultWorkingDirectory)/AndroidApps/MyApp.)와 유사해야 합니다. 경로는 gradleWrapperFile 리포지토리의 루트(예: AndroidApps/MyApp/gradlew 또는 $(system.defaultWorkingDirectory)/AndroidApps/MyApp/gradlew.)와 유사해야 합니다.

- task: Gradle@3
  inputs:
    workingDirectory: ''
    gradleWrapperFile: 'gradlew'
    gradleOptions: '-Xmx3072m'
    publishJUnitResults: false
    testResultsFiles: '**/TEST-*.xml'
    tasks: 'assembleDebug'

Gradle 작업 사용에 대한 자세한 내용은 Gradle 설명서의 작업 사용을 참조하세요. 빌드 작업에 대한 자세한 내용은 Google Android 개발 설명서에서 디버그 APK 빌드 및 빌드 변형 구성을 참조하세요.

Android 패키지 서명 및 맞춤(APK)

에뮬레이터 대신 디바이스에서 실행하려면 APK(Android 애플리케이션 패키지)에 서명해야 합니다. Zipaligning은 애플리케이션에서 사용하는 RAM을 줄입니다. 빌드가 아직 APK에 서명하고 zipalign 하지 않은 경우 파이프라인에 Android 서명 작업을 추가합니다. 자세한 내용은 모바일 앱 서명을 참조 하세요.

보안을 위해 비밀 변수jarsignerKeystorePassword 저장하고 jarsignerKeyPassword 파이프라인에서 해당 변수를 사용합니다.

- task: AndroidSigning@2
  inputs:
    apkFiles: '**/*.apk'
    jarsign: true
    jarsignerKeystoreFile: 'pathToYourKeystoreFile'
    jarsignerKeystorePassword: '$(jarsignerKeystorePassword)'
    jarsignerKeystoreAlias: 'yourKeystoreAlias'
    jarsignerKeyPassword: '$(jarsignerKeyPassword)'
    zipalign: true

Android 에뮬레이터에서 테스트

Android 에뮬레이터를 설치하고 실행하려면 Bash 작업을 파이프라인에 추가하고 다음 코드를 붙여넣습니다. 에뮬레이터는 백그라운드 프로세스로 시작되며 이후 작업에서 사용할 수 있습니다. 테스트 환경에 맞게 에뮬레이터 매개 변수를 정렬합니다.

#!/usr/bin/env bash

# Install AVD files
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-30;google_apis;x86'

# Create emulator
echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd -n xamarin_android_emulator -k 'system-images;android-30;google_apis;x86' --force

$ANDROID_HOME/emulator/emulator -list-avds

echo "Starting emulator"

# Start emulator in background
nohup $ANDROID_HOME/emulator/emulator -avd xamarin_android_emulator -no-snapshot -no-window -no-audio -no-boot-anim -accel off > /dev/null 2>&1 &
$ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82'

$ANDROID_HOME/platform-tools/adb devices

echo "Emulator started"

Azure 호스팅 디바이스에서 테스트

Visual Studio App Center의 호스트된 Android 디바이스 랩에서 앱을 테스트하려면 파이프라인에 App Center 테스트 작업을 추가합니다.

이 작업을 수행하려면 App Center 평가판 계정이 필요하며, 테스트 랩을 계속 사용하려면 30일 후에 유료로 변환해야 합니다. 이 작업을 사용하기 전에 App Center 계정에 등록합니다.

다음 예제에서는 App Center 테스트 도구 모음을 실행합니다. 태스크는 설정해야 하는 서비스 연결을 사용합니다.

전체 작업 구문 및 참조는 App Center 테스트 작업을 참조 하세요. 자세한 내용은 UI 테스트에 Azure DevOps 사용을 참조하세요.

- task: AppCenterTest@1
  inputs:
    appFile: path/myapp.ipa
    artifactsDirectory: '$(Build.ArtifactStagingDirectory)/AppCenterTest'
    frameworkOption: 'appium'
    appiumBuildDirectory: test/upload
    serverEndpoint: 'My App Center service connection'
    appSlug: username/appIdentifier
    devices: 'devicelist'

빌드 레코드를 사용하여 아티팩트 유지

빌드 레코드를 사용하여 APK 파일을 저장하거나 테스트하고 후속 파이프라인에 배포하려면 파일 복사 및 빌드 아티팩트 게시 작업을 파이프라인에 추가합니다. 자세한 내용은 파이프라인 아티팩트 게시 및 다운로드를 참조 하세요.

- task: CopyFiles@2
  inputs:
    contents: '**/*.apk'
    targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: $(Build.ArtifactStagingDirectory)
    artifactName: MyBuildOutputs

App Center에 배포

테스터 또는 베타 사용자 그룹에 앱을 배포하거나 앱을 Intune 또는 Google Play로 승격하려면 App Center 배포 작업을 추가합니다. 이 작업에는 무료로 유지되는 무료 App Center 계정이 필요합니다.

다음 예제에서는 사용자에게 앱을 배포합니다. 전체 작업 구문 및 참조는 App Center 배포를 참조 하세요. 자세한 내용은 App Center를 사용하여 Azure DevOps 빌드 배포를 참조 하세요.

- task: AppCenterDistribute@3
  inputs:
    serverEndpoint: 'AppCenter'
    appSlug: '$(APP_CENTER_SLUG)'
    appFile: '$(APP_FILE)' # Relative path from the repo root to the APK file you want to publish
    symbolsOption: 'Android'
    releaseNotesOption: 'input'
    releaseNotesInput: 'Here are the release notes for this version.'
    destinationType: 'groups'

Google Play 확장 설치 및 Google Play에 배포

Google Play와의 상호 작용을 자동화하려면 Google Play 확장을 설치한 다음 다음 작업을 사용합니다. 기본적으로 이러한 작업은 구성해야 하는 서비스 연결을 사용하여 Google Play에 인증됩니다.

Release

Google Play 스토어에 새 Android 앱 버전을 릴리스하려면 파이프라인에 Google Play 릴리스 작업을 추가합니다.

- task: GooglePlayRelease@4
  inputs:
    apkFile: '**/*.apk'
    serviceEndpoint: 'yourGooglePlayServiceConnectionName'
    track: 'internal'

홍보

이전에 릴리스된 Android 애플리케이션 업데이트를 한 트랙에서 다른 트랙(예: →)으로 alpha 승격하려면 Google Play 승격 작업을 파이프라인에 추가beta합니다.

- task: GooglePlayPromote@3
  inputs:
    packageName: 'com.yourCompany.appPackageName'
    serviceEndpoint: 'yourGooglePlayServiceConnectionName'
    sourceTrack: 'internal'
    destinationTrack: 'alpha'

롤아웃 늘리기

이전에 트랙에 릴리스된 애플리케이션의 출시 비율을 늘리려면 파이프라인에 rollout Google Play 증가 롤아웃 작업을 추가합니다.

- task: GooglePlayIncreaseRollout@2
  inputs:
    packageName: 'com.yourCompany.appPackageName'
    serviceEndpoint: 'yourGooglePlayServiceConnectionName'
    userFraction: '0.5' # 0.0 to 1.0 (0% to 100%)

업데이트 상태

이전에 트랙에 릴리스 rollout 된 애플리케이션의 출시 상태를 업데이트하려면 파이프라인에 Google Play 상태 업데이트 작업을 추가합니다.

  - task: GooglePlayStatusUpdate@2
    inputs:
      authType: ServiceEndpoint
      packageName: 'com.yourCompany.appPackageName'
      serviceEndpoint: 'yourGooglePlayServiceConnectionName'
      status: 'inProgress' # draft | inProgress | halted | completed

앱 번들 만들기

인라인 스크립트 및 보안 파일을 사용하여 앱 번들을 빌드하고 서명할 수 있습니다.

  1. 키 저장소를 다운로드하고 Azure Pipelines 라이브러리에 보안 파일저장합니다.

  2. 및 변수 그룹에 대한 keystore.passwordkey.aliaskey.password 변수를 만듭니다.

YAML 파이프라인에서:

  1. 보안 파일 다운로드 작업을 추가하여 app.keystore 보안 파일을 다운로드합니다.

    - task: DownloadSecureFile@1
      name: keyStore
      displayName: "Download keystore from secure files"
      inputs:
        secureFile: app.keystore
    
  2. Bash 스크립트와 함께 Bash 작업을 사용하여 앱 번들을 빌드하고 서명합니다.

    - task: Bash@3
      displayName: "Build and sign App Bundle"
      inputs:
        targetType: "inline"
        script: |
          msbuild -restore $(Build.SourcesDirectory)/myAndroidApp/*.csproj -t:SignAndroidPackage -p:AndroidPackageFormat=aab -p:Configuration=$(buildConfiguration) -p:AndroidKeyStore=True -p:AndroidSigningKeyStore=$(keyStore.secureFilePath) -p:AndroidSigningStorePass=$(keystore.password) -p:AndroidSigningKeyAlias=$(key.alias) -p:AndroidSigningKeyPass=$(key.password)
    
  3. 파일 복사 작업을 사용하여 앱 번들을 복사합니다.

    - task: CopyFiles@2
      displayName: 'Copy deliverables'
      inputs:
        SourceFolder: '$(Build.SourcesDirectory)/myAndroidApp/bin/$(buildConfiguration)'
        Contents: '*.aab'
        TargetFolder: 'drop'
    

여기에서 빌드 아티팩트 게시 작업을 사용하여 아티팩트를 만들고 저장하거나 Google Play 확장을 사용하여 앱 번들을 게시할 수 있습니다.