GitHub Actions deploy to PlayMarket

Кто-то делал деплой при помощи GitHub Actions в PlayMarke? Сейчас столкнулся с проблемой, что я не могу понять как настроить Gradle так чтобы он понимал мой keystore.properties, а когда его нет то брал из enviroment.

Нашел, одну статью для флаттера, откуда и взял как настроить envroments: https://medium.com/@danieln.llewellyn/flutter-github-actions-for-a-signed-apk-fcdf9878f660

Но тогда, у меня возникает проблема, что локально я не могу собрать подписанный проект.

Мой Gradle:

apply plugin: ...

def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
  ...

  signingConfigs {
    release {
        storeFile file("../MyKey.jks")
        storePassword keystoreProperties['RELEASE_STORE_PASSWORD']
        keyAlias keystoreProperties['RELEASE_KEY_ALIAS']
        keyPassword keystoreProperties['RELEASE_KEY_PASSWORD']
    }
    debug {
        storeFile file('../debug.keystore')
    }
  }

  buildTypes {
    release {
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        minifyEnabled false
        signingConfig signingConfigs.release
        buildConfigField "String", "PIN_ALIAS", keystoreProperties['PIN_ALIAS']
        buildConfigField "String", "DB_PASS_ALIAS", keystoreProperties['DB_PASS_ALIAS']
    }
    debug {
        minifyEnabled false
        signingConfig signingConfigs.debug
        buildConfigField "String", "PIN_ALIAS", keystoreProperties['PIN_ALIAS']
        buildConfigField "String", "DB_PASS_ALIAS", keystoreProperties['DB_PASS_ALIAS']
    }
  }
}

dependencies {
  ...
}

Может быть у кого есть более толковый подход, буду благодарен.


Ответы (1 шт):

Автор решения: Valeriy

Решение не идеальное, но в полне рабочее, а в будущем будет отимизироваться:

def keystoreProperties = new Properties()
if (rootProject.file("keystore.properties").exists()) {
  keystoreProperties.load(new FileInputStream(rootProject.file("keystore.properties")))
  release_store_password = keystoreProperties['RELEASE_STORE_PASSWORD']
  release_key_password = keystoreProperties['RELEASE_KEY_PASSWORD']
  release_key_alias = keystoreProperties['RELEASE_KEY_ALIAS']
  pin_alias = keystoreProperties['PIN_ALIAS']
  db_pass_alias = keystoreProperties['DB_PASS_ALIAS']
} else {
  release_store_password = System.env.RELEASE_STORE_PASSWORD
  release_key_password = System.env.RELEASE_KEY_PASSWORD
  release_key_alias = System.env.RELEASE_KEY_ALIAS
  pin_alias = System.env.PIN_ALIAS
  db_pass_alias = System.env.DB_PASS_ALIAS
}

def versionPropsFile = rootProject.file('version.properties')
Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
def verCode = versionProps['VERSION_CODE'].toInteger()

android {

  defaultConfig {
    ...
    versionCode verCode
    versionName "1.1.$verCode"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def buildType = variant.buildType.name
            output.outputFileName = "notification_tracker" + "." + buildType + ".apk"
        }
    }
    kapt {
        arguments {
            arg("room.schemaLocation", "$projectDir/schemas")
        }
    }
}

signingConfigs {
    release {
        storeFile file("../MyKey.jks")
        storePassword = release_store_password
        keyAlias = release_key_alias
        keyPassword = release_key_password
    }
    debug {
        storeFile file('../debug.keystore')
    }
}

buildTypes {
    release {
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        minifyEnabled false
        signingConfig signingConfigs.release
        buildConfigField "String", "PIN_ALIAS", "\"$pin_alias\""
        buildConfigField "String", "DB_PASS_ALIAS", "\"$db_pass_alias\""
    }
    debug {
        minifyEnabled false
        signingConfig signingConfigs.debug
        buildConfigField "String", "PIN_ALIAS", "\"1234\""
        buildConfigField "String", "DB_PASS_ALIAS", "\"1234\""
    }
  }
}

def static getTime() {
  return new Date().format("ddMMHHmm", TimeZone.getDefault())
}

dependencies {
  ...
}

Workflow:

build:
  runs-on: ubuntu-latest
  name: Build release-apk and deploy to PlayMarket
  steps:
    - uses: actions/checkout@v2
    - name: set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    # Without NDK not compile and not normal error message. NDK is required
    - name: Install NDK
      run: echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "ndk;20.0.5594570" --sdk_root=${ANDROID_SDK_ROOT}
    # Some times is have problems with permissions for ./gradle file. Then uncommit it code
    #    - name: Make gradlew executable
    #      run: chmod +x ./gradlew
    - name: Output version code
      run: echo VERSION_CODE=${{ github.run_number }} > ./version.properties
    - name: Build with Gradle
      run: ./gradlew assemble
      env:
        RELEASE_STORE_PASSWORD: ${{ secrets.RELEASE_STORE_PASSWORD }}
        RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }}
        RELEASE_KEY_ALIAS: ${{ secrets.RELEASE_KEY_ALIAS }}
        PIN_ALIAS: ${{ secrets.PIN_ALIAS }}
        DB_PASS_ALIAS: ${{ secrets.DB_PASS_ALIAS }}
    - name: Upload APK
      uses: actions/upload-artifact@v2
      with:
        name: notification_tracker
        path: app/build/outputs/apk/release/notification_tracker.release.apk

Готовое решение можно найти тут: workflow, Gradle. Общую инструкцию можно найти тут.

→ Ссылка