개발자 블로그

Azure DevOps Pipeline - 4. 배포 자동화 본문

프로그래밍/DevOps

Azure DevOps Pipeline - 4. 배포 자동화

로이드.Roid 2022. 8. 24. 23:20
✔ Firebase 관련 안내

이 예제에서는 배포 도구로 Firebase App Distribution을 사용합니다.
아직 Firebase 구성을 시작하지 않았다면 먼저 Firebase 프로젝트 설정을 완료해주세요.

https://console.firebase.google.com/
✔ App Distribution 관련 안래

Firebase App Distribution을 사용하기 위해서는 몇 가지 설정을 먼저 진행해주셔야 합니다. 여기서는 해당 절차들에 대해서는 설명하지 않습니다. 자세한 내용은 아래 링크를 참고하세요.

● Firebase App Distrubution 개요
  - https://firebase.google.com/docs/app-distribution?hl=ko

● 테스터를 위한 설정
  - https://firebase.google.com/docs/app-distribution/android/set-up-for-testing?hl=ko

● Gradle을 사용하여 앱 배포
  - https://firebase.google.com/docs/app-distribution/android/distribute-gradle?hl=ko
✔ 릴리즈 빌드를 위한 gradle signing 설정

릴리즈 빌드를 위해서는 앱 사이닝 절차가 필요합니다. App 수준의 gradle 파일에 signingConfigs를 추가하면 자동으로 사이닝이 됩니다.
아래는 그 예시 코드입니다.

android {
	...
    signingConfigs {
    	release {
            storeFile file("your_keystore_filename.keystore")
            storePassword "your_keystore_password"
            keyAlias "your_key_alias"
            keyPassword "your_key_pasword"
        }
    }
    ...
}

 

배포를 위한 gradle 설정

firebaseAppDistribution {
    releaseNotes="릴리즈 노트"
    groups="tester_group_name, another_group_name"
    testers="testerA@test.com, testerB@test.com"
}

 

파이프라인 스크립트 수정

  • gradle 설정을 모두 파쳤다면 이제 빌드 파이프라인을 수정할 차례입니다.
  • 아래는 수정하기 전 파이프라인 스크립트입니다.
trigger:
- azure-pipelines

pool:
  vmImage: 'macos-latest'
  
steps:
- task: Gradle@2
  inputs:
    workingDirectory: ''
    gradleWrapperFile: 'gradlew'
    gradleOptions: '-Xmx3072m -Dorg.gradle.java.home=$(JAVA_HOME_11_X64)'
    publishJUnitResults: false
    testResultsFiles: '**/TEST-*.xml'
    tasks: 'assembleDebug'
  • 참고로 브랜치는 "azure-pipelines"라는 이름으로 새로 생성했습니다.
  • gradleOptions에 "-Dorg.gradle.java.home=$(JAVA_HOME_11_X64)" 옵션은 디폴트로 붙는 옵션은 아닌데, 안드로이드 프로젝트의 gradle 버전이 최신이라면 추가해줘야 합니다.
    • 위 옵션과 과련해서 더 자세한 내용은 아래 링크를 참고하세요.
✔ JDK 버전 문제 해결

TODO : 링크 추가
  • 배포 자동화를 위해서 수정할 내용은 알와 같습니다.
    1. 릴리즈 버전을 배포하기 위해서 gradle task를 수정
    2. Firebase에 APK 업로드를 위한 gradle task 추가
  • 아래는 위 수정사항을 적용한 파이프라인 스크립트입니다.
trigger:
- azure-pipelines

pool:
  vmImage: 'macos-latest'
  
steps:
- task: Gradle@2
  inputs:
    workingDirectory: ''
    gradleWrapperFile: 'gradlew'
    gradleOptions: '-Xmx3072m -Dorg.gradle.java.home=$(JAVA_HOME_11_X64)'
    publishJUnitResults: false
    testResultsFiles: '**/TEST-*.xml'
    tasks: 'assembleMarketRelease appDistributionUploadMarketRelease'
  • task의 이름은 gradle에서 설정한 build flavor에 따라 다를 수 있습니다. 자세한 내용은 아래 링크를 참고해주세요.
✔ 빌드 변경 구성

https://developer.android.com/studio/build/build-variants?hl=ko
  • 참고로 전체 gradle task 목록은 아래 명령어로 확인 가능합니다.
./gradlew tasks --all
  • 이렇게 파이프라인 수정이 모두 끝났습니다. 하지만 아직 한가지 단계가 더 남아있습니다.

 

파이프라인 Variable 추가

  • Firebase에 APK를 업로드 하기 위해서는 인증 절차가 필요합니다. 자세한 내용은 페이지 상단의 링크에서 확인 가능합니다.
  • 이 예제에서는 인증 토큰을 사용한 방법으로 진행합니다.
  • 인증토큰 생성을 완료했다면, 해당 값을 파이프라인 Variables에 추가해줘야 합니다.
  • YAML 편집 화면에서 상단에 있는 "Variables" 버튼을 클릭합니다.

  • 그 다음 아래 이미지처럼 Name 항목에는 "FIREBASE_TOKEN"을 입력하고, Value 항목에는 생성된 인증 토큰 값을 입력합니다.

  • "Keep this value secret" 옵션 체크는 선택사항입니다. 해당 체크박스를 체크하게되면 나중에 값을 다시 확인할 수 없습니다. 보안이 요구되는 항목에는 체크를 권장합니다.
    • 다만 체크를 하게 되면 명시적으로 환경 변수로 매핑해야 됩니다.
✔ Secret value 안내

To use a secret variable in script, you must explicitly map it as and environment variable.
  • OK 버튼을 누르고, 모든 변경 사항을 저장합니다.
  • 저장을 하면 azure-pipelines.yml 파일이 변경되기 때문에 자동으로 트리거되어 파이프라인이 실행되는데, 다음 예제를 위해 일단은 취소시킵니다.

 

Push를 통해 파이프라인 트리거

  • 축하합니다! 빌드 파이프라인 구축이 모두 완료되었습니다.
  • 트리거 브랜치("azure-pipelines")에 변경이 발생하면 빌드 파이프라인이 자동으로 동작합니다. 그렇게 되면 수작업으로 APK 파일을 테스터한테 배포할 필요 없이 자동으로 APK 파일이 전달됩니다.
  • 트리거링을 위해서는 해당 브랜치에 commit, push, merge 등의 명령을 통해서 변경을 발생시키면 됩니다. 이 예제에서는 push를 사용해보겠습니다.
  • Android Studio나 VCS 툴을 사용해서 코드를 수정 한 뒤 해당 브랜치에 push를 해줍니다.
  • 저는 간단하게 아래와 같이 gradle 파일을 수정하였습니다.
firebaseAppDistribution {
    releaseNotes="Azure DevOps Pipeline Test"
    testers="email address here"	// 테스터의 이메일 주소를 입력해주세요.
}
  • push를 한 뒤 azure에서 파이프라인을 확인합니다.

  • 자동으로 빌드 파이프라인이 실행 된 것을 확인 할 수 있습니다.
  • 파이프라인 수행이 모두 완료되면 Firebase App Distribution에 들어가서 APK 파일이 정상적으로 업로드 되었는지 확인합니다.

  • 릴리즈 노트와 배포 타겟 모두 gradle 파일에서 설정한 대로 정상적으로 배포 된 것을 확인 할 수 있습니다.
  • 테스터에게는 Firebase에서 자동으로 메일이 발송됩니다.

  • 테스트 앱 설치는 메일에 안내 된 절차대로 진행하면 됩니다.

 

이걸로 끝?

  • 지금까지의 과정을 통해 코드 커밋 한 번으로 테스터에게 자동으로 APK 파일을 전달할 수 있는 환경을 설정하였습니다.
  • 하지만 이것은 시작에 불과합니다.

  • 지금의 빌드 파이프라인은 런닝 타임이 13분에 달할 정도로 속도가 매우 느립니다. 이 시간이면 지금 제가 쓰고 있는 3년전 i7따리 구형 맥북에서도 진작에 빌드 끝내고 배포까지 한 다음에 커피 한 잔 할 수 있는 시간입니다.
  • 이제 이 문제를 개선해보겠습니다.

 

Comments