이 튜토리얼에서는 Google Cloud에서 서버리스 모바일 제공 파이프라인을 만드는 방법을 설명합니다.
- 먼저 로컬 머신에서 Gradle 명령어를 사용하여 빌드 및 배포할 수 있는 테스트 Android 애플리케이션을 설정하는 과정을 안내합니다. 이러한 명령어는 Android 애플리케이션 패키지(APK)를 빌드하고 베타 테스터 배포용 Firebase 앱 배포에 업로드합니다.
- 그런 다음 이 프로세스를 자동화하기 위해 Cloud Build용 Android Builder를 설치하고 빌드 트리거를 설정하면 소스 코드를 변경한 Android 애플리케이션의 빌드 및 배포를 자동으로 트리거할 수 있습니다.
목표
- 서명된 APK를 빌드하는 빌드 작업을 만듭니다.
- Firebase 앱 배포를 사용하여 새 빌드를 배포하는 빌드 작업을 만듭니다.
- 필요한 Android SDK 종속 항목이 포함된 Android Builder를 설치합니다.
- Google Cloud에서 Android Builder를 사용해 빌드 트리거를 만들어 서명된 APK를 빌드하고 Firebase 앱 배포를 통해 배포합니다.
비용
이 튜토리얼에서는 다음과 같은 비용이 청구될 수 있는 Google Cloud 구성요소를 사용합니다.
기본 Android Builder 이미지는 약 1.9GB입니다. 가격 계산기는 2GB 환경의 스토리지 비용을 한 달에 약 $0.05로 예상합니다. 기본 Android Builder 이미지를 빌드하는 데 약 11분 정도 걸리고 비용은 $0.03입니다. 빌드를 추가할 때마다 약 5분이 걸리고 비용은 $0.02입니다. 자세한 내용은 Cloud Build 가격 책정을 참조하세요.
시작하기 전에
- Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
-
Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
-
Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.
-
Compute Engine API 사용 설정
- Google Cloud CLI를 설치합니다.
-
gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.
gcloud init
-
Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
-
Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.
-
Compute Engine API 사용 설정
- Google Cloud CLI를 설치합니다.
-
gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.
gcloud init
- 컴퓨터에 Gradle이 설치되었는지 확인합니다.
- 컴퓨터에 Android Studio가 설치되었는지 확인합니다.
- 컴퓨터에 Git가 설치되었는지 확인합니다.
이 튜토리얼은 다음과 같은 가정을 바탕으로 진행됩니다.
- macOS 또는 Linux를 실행해야 합니다. 이 절차 중 일부는 Windows 환경에 맞게 조정할 수 있지만 이 튜토리얼에서는 해당 사용 사례에 대한 전체 안내를 제공하지 않습니다.
- Android 개발, Android Studio, Gradle, Git 사용 경험이 있어야 합니다.
서명된 Android 베타 빌드 로컬 작동
이 섹션에서는 Android Studio에서 테스트 Android 애플리케이션을 설정합니다. 이 애플리케이션은 컴퓨터의 터미널 창에서 실행되는 Gradle 빌드 작업을 사용해서 빌드하고 배포할 수 있습니다.
빌드할 테스트 Android 애플리케이션 만들기
Android Studio에서 빈 작업을 사용하는 새 Android 프로젝트를 만듭니다.
다음 스크린샷은 마법사에서 이 작업을 수행하는 단계를 보여줍니다.
컴퓨터의 터미널 창에서 테스트 애플리케이션을 만든 디렉터리로 변경합니다.
cd ${HOME}/android-apps/TestAndroidBuild
해당 디렉터리에서 Git 저장소를 초기화합니다.
git init && git checkout -b develop
.gitignore
파일을 수정하고 Git이 소스 코드 저장소에 푸시하지 않도록 파일 및 확장 이름을 추가합니다.cat >> .gitignore <<EOF google-services.json app-distro.json keystore.properties EOF
저장소에 애플리케이션을 커밋합니다.
git add -A git commit -m "empty application"
프로젝트를 사용하도록 Google Cloud CLI를 구성합니다.
[PROJECT_NAME]
에는 선택했거나 만든 프로젝트 이름을 사용합니다.PROJECT=[PROJECT_NAME] gcloud config configurations create $PROJECT gcloud config config set project $PROJECT
Android 애플리케이션의 Cloud Source Repository를 만듭니다.
gcloud source repos create android-application
Android 애플리케이션의 원격 저장소로 Cloud Source Repository를 추가합니다.
git remote add google \ https://source.developers.google.com/p/${PROJECT}/r/android-application
애플리케이션에 Firebase 추가
Firebase Console로 이동합니다.
프로젝트 추가를 클릭합니다.
프로젝트 이름 입력에서 이전에 만든 Google Cloud 프로젝트를 선택합니다.
.
Firebase Blaze 결제 요금제를 확인합니다.
Google 애널리틱스 사용 설정 여부를 선택합니다. 이 튜토리얼에서는 애널리틱스를 사용하지 않아도 됩니다.
Firebase 프로젝트가 생성될 때까지 기다린 다음 계속을 클릭합니다.
Android 프로젝트에 Firebase 추가의 안내에 따라 Firebase를 Android 애플리케이션에 추가합니다.
google-services.json
파일이 다음 디렉터리로 이동하는지 확인합니다.{HOME}/android-apps/TestAndroidBuild
Firebase Crashlytics 시작하기의 안내에 따라 Firebase Crashlystics를 Android 프로젝트에 추가합니다.
디렉터리를 프로젝트의 앱 수준 디렉터리로 변경합니다.
cd {HOME}/android-apps/TestAndroidBuild/app
Firebase 관리자 역할로 Google Cloud 서비스 계정을 만듭니다.
gcloud iam service-accounts create app-distro --display-name=app-distro APP_DISTRO_SA=$(gcloud iam service-accounts list --filter="displayName:app-distro" --format='value(email)') gcloud projects add-iam-policy-binding $PROJECT --role roles/firebase.admin --member serviceAccount:$APP_DISTRO_SA gcloud iam service-accounts keys create app-distro.json $APP_DISTRO_SA
서명 키 및 키 저장소 만들기
출시 전 Android 애플리케이션을 배포하려면 자바 키 저장소(.jks
) 파일에 저장된 인증서를 사용해 애플리케이션을 서명해야 합니다.
터미널 창에서 애플리케이션의 상위 디렉터리로 변경합니다.
cd ${HOME}/AndroidStudioProjects/TestAndroidBuild
애플리케이션 서명을 위한 자바 키 저장소 및 키를 만들고, 키 별칭, 암호, 키 저장소 파일의 상대 경로를 저장하는
keystore.properties
파일을 만듭니다.JKS_PASSWORD=$(openssl rand -base64 12) keytool -genkey -noprompt -keystore ../signing/android.jks \ -alias android-key \ -dname "CN=example.com, OU=IT, O=Example, L=Sunnyvale, S=California, C=US" \ -storepass ${JKS_PASSWORD} \ -keypass ${JKS_PASSWORD} cat > ../signing/keystore.properties <<EOF storeFile=../signing/android.jks storePassword=${JKS_PASSWORD} keyPassword=${JKS_PASSWORD} keyAlias=android-key EOF
Android 보안 비밀 파일을 암호화하여 소스 저장소에 추가
키 관리 서비스를 사용 설정합니다.
gcloud services enable cloudkms.googleapis.com
키를 저장할 키링을 만듭니다.
gcloud kms keyrings create my-app --location=global
보안 비밀을 저장할 키를 만듭니다.
gcloud kms keys create android-builder \ --location=global \ --keyring=my-app \ --purpose=encryption
Cloud Build 서비스 계정에 암호화/복호화 역할을 추가합니다.
CLOUDBUILD_ACCOUNT=$(gcloud projects get-iam-policy $PROJECT \ --filter="(bindings.role:roles/cloudbuild.builds.builder)" \ --flatten="bindings[].members" \ --format="value(bindings.members[])" | tail -1) gcloud kms keys add-iam-policy-binding android-builder --location=global \ --keyring=my-app --member="${CLOUDBUILD_ACCOUNT} \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
keystore.properties
파일을 암호화합니다.gcloud kms encrypt --plaintext-file=signing/keystore.properties \ --ciphertext-file=signing/keystore.properties.enc --location=global \ --keyring=my-app --key=android-builder
소스 저장소에 서명 파일을 추가합니다.
git add signing git commit -m "encrypted signing information"
google-services.json
파일을 암호화합니다.gcloud kms encrypt --plaintext-file=app/google-services.json \ --ciphertext-file=app/google-services.json.enc --location=global \ --keyring=my-app --key=android-builder
google-services.json.enc
파일을 소스 저장소에 추가합니다.git add app/google-services.json.enc git commit -m "encrypted application account"
app-distro.json
파일을 암호화합니다.gcloud kms encrypt --plaintext-file=app-distro.json \ --ciphertext-file=app-distro.json.enc \ --location=global \ --keyring=my-app --key=android-builder
app-distro.json.enc
파일을 소스 저장소에 추가합니다.git add app-distro.json.enc git commit -m "encrypted service account"
Firebase 앱 배포 추가
- Gradle을 사용하여 테스터에게 Android 앱 배포의 안내에 따라 Firebase 앱 배포를 애플리케이션에 추가합니다.
Firebase 배포 그룹 만들기
Firebase Console로 이동합니다.
Firebase용으로 만든 앱을 클릭합니다. 이름은 Cloud 프로젝트의 이름과 유사합니다.
앱 배포를 클릭합니다.
테스터를 클릭합니다.
테스터 추가를 클릭합니다.
이메일 주소를 입력합니다.
테스터 그룹 만들기를 클릭합니다.
이름을 beta-testers로 입력합니다.
테스터 추가를 클릭합니다.
beta-testers 그룹에 이메일 주소를 추가합니다.
서명 및 Firebase 배포 구성을 포함하도록 build.gradle 파일 업데이트
아래에 굵게 표시된 줄로
{HOME}/AndroidStudioProjects/TestAndroidBuild/build.gradle
파일을 업데이트합니다.buildscript { ext.kotlin_version = '1.3.41' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.5.0' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version' classpath 'com.google.firebase:firebase-appdistribution-gradle:2.0.0' classpath 'com.google.gms:google-services:4.3.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
{HOME}/AndroidStudioProjects/TestAndroidBuild/app/build.gradle
파일에 다음 스니펫을 추가합니다.android { // ... def debugKeystorePropertiesFile = rootProject.file("signing/keystore.properties") def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(debugKeystorePropertiesFile)) //... android { //... signingConfigs { debug { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile'].trim()) storePassword keystoreProperties['storePassword'] } } buildTypes { debug { firebaseAppDistribution { releaseNotesFile="release-notes.txt" groups="beta-testers" } } // ... packagingOptions { exclude "app-distro.json" } } }
Gradle 파일의 테스트 종속 항목 수정
아래의 굵게 표시된 줄이 있는지
${HOME}/AndroidStudioProjects/TestAndroidBuild/app/build.gradle
파일에 확인합니다.dependencies { //... androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }
컴퓨터에서 앱 빌드 및 배포
터미널 창에서 테스트 애플리케이션의 상위 디렉터리에 있는지 확인합니다.
{HOME}/AndroidStudioProjects/TestAndroidBuild
앱을 빌드하고 배포합니다.
gradle assembleDebug appDistributionUploadDebug
사용자가 애플리케이션을 설치할 수 있는 링크가 포함된 이메일이 배포 그룹으로 전송됩니다.
소스 저장소의 빌드 변경사항 저장
소스 저장소의 변경사항을 커밋합니다.
git add app/build.gradle && git commit -m "Update build for distribution."
Cloud Build에서 Android 빌드 만들기
이제 Android 애플리케이션을 빌드하고 배포하는 작동 가능한 Gradle 빌드 작업이 준비되었습니다. 이 섹션에서는 Cloud Source Repository의 마스터 분기가 변경될 때마다 이러한 빌드 작업을 실행하도록 Cloud Build를 설정합니다.
PROJECT
환경 변수를 설정합니다.export PROJECT=$(gcloud config get-value project)
Android Builder가 빌드 간 종속 항목을 저장하는 데 사용할 스토리지 버킷을 만듭니다.
gsutil mb gs://$PROJECT-cache-bucket
Android Builder가 Android 빌드 번호를 증가시키는 데 사용할 스토리지 버킷을 만듭니다.
gsutil mb gs://$PROJECT-config-bucket
Android Builder가 아티팩트를 저장하는 데 사용할 스토리지 버킷을 만듭니다.
gsutil mb gs://$PROJECT-artifact-bucket
Android Builder 만들기
터미널 창에서 커뮤니티 빌더 저장소를 Android 애플리케이션의 디렉터리 외부의 디렉터리에 클론합니다.
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community
GitHub 저장소에는 커뮤니티에서 유지관리되는 빌더가 포함됩니다.
tar
빌더가 있는 디렉터리로 변경합니다.cd cloud-builders-community/tar
프로젝트에
tar
빌더를 추가합니다.gcloud builds submit --config=cloudbuild.yaml
Android Builder가 있는 디렉터리로 변경합니다.
cd ../android
Android Builder를 만들고 대상 SDK 버전을 대체 버전으로 전달합니다.
gcloud builds submit --config=cloudbuild.yaml \ --substitutions=_ANDROID_VERSION=28
Android 애플리케이션 빌드 트리거 만들기
이 섹션에서는 이전 섹션의 Android Builder를 사용해 Android 애플리케이션을 빌드하고 배포하는 애플리케이션 빌드 트리거를 만듭니다.
터미널 창에서 Android Builder
examples/
디렉터리의cloudbuild.yaml
예시 파일을 테스트 Android 애플리케이션 디렉터리에 복사합니다.cd ${HOME}/android-apps/TestAndroidBuild cp ${HOME}/cloud-builders-community/android/examples/build-test-deploy-firebase-distro.yaml \ ./cloudbuild.yaml
소스 저장소의
develop
분기에 새cloudbuild.yaml
파일을 추가합니다.git add cloudbuild.yaml && git commit -m "Add android builder to project."
Google Cloud Console에서 빌드 트리거 페이지로 이동합니다.
트리거 만들기를 클릭합니다.
android-application 저장소를 선택합니다.
이름에 android-application-build를 입력합니다.
구성에서 Cloud Build 구성 파일(yaml 또는 json)을 선택합니다.
cloudbuild.yaml 위치에
/cloudbuild.yaml
을 입력합니다.항목 추가를 클릭합니다. 그러면 빌드 변수를 설정할 수 있습니다.
다음 표의 각 변수에 대해 변수 이름(선행 밑줄 포함)을 입력한 후 프로젝트의 값을 입력합니다.
변수 값 용도 _CONFIG_BUCKET
빌드 번호를 저장하는 데 사용되는 버킷gs://[PROJECT_NAME]-config-bucket
빌드 번호를 저장하는 데 사용할 버킷의 URL입니다. _CACHE_BUCKET
빌드 종속 항목을 캐싱하는 데 사용할 버킷gs://[PROJECT_NAME]-cache-bucket
Gradle이 각 빌드에 대해 인터넷에서 동일한 종속 항목을 다운로드하지 않도록 방지합니다. _ARTIFACT_BUCKET
빌드 아티팩트를 저장하는 데 사용되는 Cloud Storage 버킷gs://[PROJECT_NAME]-artifact-bucket
Android Builder는 빌드 중에 중간 및 기타 아티팩트를 저장합니다. 트리거 만들기를 클릭합니다.
애플리케이션 빌드 트리거 실행
이제 애플리케이션 빌드 트리거가 작동하는지 테스트하고 애플리케이션이 이메일에 배포되었는지 확인할 수 있습니다.
터미널 창에서 테스트 Android 애플리케이션 프로젝트의 최상위 디렉터리로 변경합니다.
cd ${HOME}/android-apps/TestAndroidBuild
빌드를 트리거하려면 소스 코드 저장소의 마스터 분기로 푸시합니다.
git push google develop
Google Cloud Console에서 Cloud Build 페이지로 이동합니다.
진행 중인 최신 빌드를 클릭하여 애플리케이션 빌드의 빌드 출력을 확인합니다.
삭제
이 튜토리얼을 마쳤으면 나중에 요금이 청구되지 않도록 Google Cloud에서 만든 리소스를 삭제해야 합니다. 다음 섹션에서는 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하려면 다음 안내를 따르세요.
- Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
- 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.
이미지 레지스트리 삭제
Android SDK 이미지 및 Android 애플리케이션 이미지의 이미지 레지스트리를 삭제합니다.
- Google Cloud Console의 왼쪽 탐색 메뉴에서 도구 섹션으로 스크롤하여 Container Registry > 이미지를 클릭합니다.
모든 이미지를 선택합니다.
삭제를 클릭합니다.
Cloud Storage 버킷 삭제
Android 서명 정보 및 Fabric 속성이 포함된 Cloud Storage 버킷을 삭제합니다. Cloud Shell에서 다음 명령어를 사용하되 각 자리표시자를 적절한 값으로 바꿉니다.
PROJECT
환경 변수를 설정합니다.export PROJECT=$(gcloud config get-value project)
빌드용으로 만든 스토리지 버킷을 삭제합니다.
gsutil rm gs://$PROJECT-cache-bucket gsutil rm gs://$PROJECT-config-bucket gsutil rm gs://$PROJECT-artifact-bucket
빌드 트리거 삭제
- 기본 Android SDK 빌드 트리거를 삭제합니다.
- Android 빌드 트리거를 삭제합니다.
Firebase에서 애플리케이션 삭제
Firebase Console로 이동합니다.
튜토리얼용으로 만든 Firebase 프로젝트를 선택합니다. 이름은 [PROJECT_NAME]과 비슷해야 합니다.
설정 메뉴에서 프로젝트 설정을 선택합니다.
페이지 하단으로 스크롤하여
아이콘을 클릭합니다.
다음 단계
- Android 문서에서 자세한 내용을 참조합니다.
- Firebase 문서 자세히 살펴보기