Android 배포 자동화를 구현하는 방법

미션

codecommit 에 source 가 push 되면, cloudwatch가 감지하고, 이를 codepipeline 동작시킨다. 빌드는 안드로이드 서명키와 함께, 빌드가 완료되고, 완료된 파일은 S3에 업로드 한다. 안드로이드 서명키를 안전하게 보관하면서 이를 수행할수 있는 방법은 무엇인가

우선 비공개 키보관 S3 버킷을 생성하여 보관하고 이를 빌드시점에 copy 하여 서명을 완료하고, 완료된 apk 파일은 배포용 s3에 업로드 하도록 하면된다. 여기서는 비공개 키보관 S3버킷명을 android-certkey-123 라고 정하겠다.


storePassword=password
keyPassword=password
keyAlias=alias
storeFile=../cert/cert.jks

그리고 두개의 파일을 android-certkey-123 버킷에 업로드 한다.

keystore.properties
cert/cert.jks

:app 모듈내 gradle 을 아래와 같이 수정한다.


//region signing
// Create a variable called keystorePropertiesFile, and initialize it to your
// keystore.properties file, in the rootProject folder.
def keystorePropertiesFile = rootProject.file("keystore.properties")

// Initialize a new Properties() object called keystoreProperties.
def keystoreProperties = new Properties()

// Load your keystore.properties file into the keystoreProperties object.
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

//endregion

android {
    defaultConfig {
    }

    signingConfigs {
        config {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.all {
            def flavor = variant.name
            def versionCode = variant.versionCode
            def versionName = variant.versionName
            outputFileName = "app-${flavor}-v${versionName}_${versionCode}.apk"
        }
    }

    compileOptions {
    }
}

dependencies {

}

project root 폴더에 buildspec.yml 파일을 넣는다.

  • aws s3 cp s3://${S3_BUCKET} . --recursive <– 이 부분이 중요하다. 서명키와 패스워드를 빌드 머신안 쪽으로 카피한다.

version: 0.2

env:
  variables:
    S3_BUCKET: "android-certkey-123"

phases:
  build:
    commands:
      - aws s3 cp s3://${S3_BUCKET} . --recursive
      - ./gradlew assembleRelease
artifacts:
  files:
    - app/build/outputs/apk/release/**
  discard-paths: yes

이렇게 해 놓고, codepipeline 에서 배포용 apk 파일 버킷에다가 복사하는 job을 구성하면 미션 완료,