Подпись release APK ключом из GitHub Secrets - #7
Merged
Conversation
app/build.gradle.kts: signingConfig читается из переменных окружения KEYSTORE_PATH / KEYSTORE_PASSWORD / KEY_ALIAS / KEY_PASSWORD. Ключ и пароли в репозиторий не попадают. Если KEYSTORE_PATH не задан, signingConfig не создается вовсе, поэтому локальная сборка и сборка в форках продолжают работать без доступа к ключу. release.yml: ключ приезжает из секрета KEYSTORE_BASE64, раскладывается во временный каталог раннера и удаляется шагом с if: always(). Отдельный шаг печатает отпечаток сертификата подписи, чтобы можно было сверить SHA-256 с тем, что показывает RuStore. Workflow не падает, если секреты не заданы: тогда выпускается debug APK с прежним предупреждением о несовпадении подписи. Так релизы продолжат работать и до того, как секреты будут добавлены. .gitignore: *.jks, *.keystore, keystore.properties, signing.properties. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Отвечает на вопрос «можно ли прикрутить подпись от RuStore к GitHub приватно». Да, через GitHub Actions Secrets — но с оговоркой, она в конце.
Что меняется
app/build.gradle.kts—signingConfigчитается из переменных окруженияKEYSTORE_PATH,KEYSTORE_PASSWORD,KEY_ALIAS,KEY_PASSWORD. Ни ключ, ни пароли в репозиторий не попадают.Если
KEYSTORE_PATHне задан,signingConfigне создаётся вовсе — локальная сборка и сборка в форках продолжают работать без доступа к ключу и просто выдают неподписанный APK..github/workflows/release.yml— ключ приезжает из секретаKEYSTORE_BASE64, раскладывается во временный каталог раннера и удаляется шагом сif: always(), то есть даже если сборка упала.Отдельный шаг после сборки печатает отпечаток сертификата через
apksigner verify --print-certs. Сверьте SHA-256 с тем, что показывает RuStore, — так вы убедитесь, что ключ тот самый и обновление встанет поверх магазинной версии.Workflow не ломается, если секретов нет. Тогда, как и раньше, собирается debug APK с предупреждением о несовпадении подписи. Так что этот PR можно мержить до того, как вы добавите секреты.
.gitignore—*.jks,*.keystore,keystore.properties,signing.properties.Что сделать вам
Четыре секрета в Settings → Secrets and variables → Actions. Не присылайте мне пароли и не вставляйте их в чат — задайте их сами:
Три последние команды спросят значение интерактивно, не отображая его. На macOS вместо
base64 -w0нужноbase64 -i release.jks -o keystore.b64.Оговорка, которую надо понимать
Секреты GitHub шифруются и маскируются в логах, но любой, у кого есть право записи в репозиторий, может их извлечь — достаточно добавить workflow, который отправит их куда угодно. Маскирование ловит прямой вывод, но не, скажем, base64 от секрета.
Для ключа, которым подписан RuStore-релиз, цена утечки высокая: чужая сборка сможет установиться как обновление вашего приложения.
Что снижает риск, по убыванию пользы:
release, привяжите секреты к нему, включите required reviewers — тогда job не стартует, пока вы вручную не подтвердите запуск. Скажите, если нужно, — добавлюenvironment: releaseв workflow.pull_request_target.Если такой риск не устраивает — рабочая альтернатива: подписывать локально и прикладывать APK к релизу руками, а CI оставить только для тестов и сборки. Скажите, и я переделаю.
🤖 Generated with Claude Code