AssemblyRelease не может сгенерировать подписанный apk в gitlab ci - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь создать подписанный apk с помощью gitlab ci, но у меня появилась эта ошибка:

/bin/bash: line 109: -Pandroid.injected.signing.store.file=/builds/MyGitlab/myapp/release.jks: 
No such file or directory

Я добавляю переменные KEYSTORE_FILE, KEYSTORE_PASSWORD, KEY_ALIAS, KEY_PASSWORD со значениями в переменной gitlab ci / cd. Я использовал кодировку base64 моего файла хранилища ключей. Мой .gitlab-ci.yml файл выглядит следующим образом:

image: jangrewe/gitlab-ci-android

before_script:
  - export GRADLE_USER_HOME=$(pwd)/.gradle
  - chmod +x ./gradlew

cache:
  key: ${CI_PROJECT_ID}
  paths:
    - .gradle/

stages:
  - release

assembleRelease:
  stage: release
  script:
    - echo -n %KEYSTORE_FILE% | base64 -di > release.jks
    - >
      ./gradlew assembleRelease --stacktrace
        -Pandroid.injected.signing.store.file=$(pwd)/release.jks
        -Pandroid.injected.signing.store.password=$KEYSTORE_PASSWORD
        -Pandroid.injected.signing.key.alias=$KEY_ALIAS
        -Pandroid.injected.signing.key.password=$KEY_PASSWORD
  artifacts:
    paths:
      - app/build/outputs/apk/dev/release
      - app/build/outputs/apk/prod/release

Есть ли у вас какие-либо идеи для решения этой проблемы? Подобный вопрос существует, но я получил другую ошибку.

1 Ответ

0 голосов
/ 04 мая 2020

Мы не должны хранить файл хранилища ключей и учетные данные в системе контроля версий. Мы можем скрыть учетные данные с помощью создания файла keystore.properties и использования учетных данных из этого файла в подписывающей части конфигурации следующим образом:

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

    signingConfigs {
        release {
            keyAlias keystoreProperties['releaseKeyAlias']
            keyPassword keystoreProperties['releaseKeyPassword']
            storeFile file(rootDir.getCanonicalPath() + '/' + keystoreProperties['releaseKeyStore'])
            storePassword keystoreProperties['releaseStorePassword']
        }
    }

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

    ...
}

keystore.properties содержит учетные данные хранилища ключей:

releaseKeyAlias=Prod
releaseKeyPassword=12345678
releaseKeyStore=release.keystore.jks
releaseStorePassword=12345678

В siging config, файл хранилища ключей release.keystore.jks используется, но мы не будем хранить его в vcs. Итак, нам нужно сгенерировать файл хранилища ключей перед созданием приложения android в непрерывной интеграции.

Разработчик имеет файл хранилища ключей и ключи подписи приложения, которые видны в build.gradle. Я использую это решение для защиты нашего файла хранилища ключей:

Сохранение зашифрованного файла хранилища ключей в системе контроля версий:

Сначала создайте для себя секретный ключ:

openssl enc -aes-256-cbc -k ciappsigningexample-secret -P -md sha1

Генерирует соль, ключ и iv. Мы будем использовать 256-битный секретный ключ. Затем зашифруйте файл хранилища ключей с помощью своего 256-битного секретного ключа:

openssl aes-256-cbc -e -in debug.keystore.jks -out debug.keystore.jks.encrypted -k 99924EB44...

. Он сгенерирует файл debug.keystore.jks.encrypted, и вы сможете скопировать sh этот файл в git. Чтобы расшифровать хранилище зашифрованных ключей в CI, вам необходимо добавить свой 256-битный секретный ключ в CI в качестве среды. Затем вы можете расшифровать файл хранилища ключей с помощью этого секретного ключа на этапе предварительной сборки с помощью следующей команды:

openssl aes-256-cbc -d -in debug.keystore.jks.encrypted -k $DEBUG_ENCRYPT_SECRET_KEY >> debug.keystore.jks
...