发布每日构建
要获得针对当前开发活动的快速反馈,让用户运行每日构建是一种好方法。获得这种反馈的关键之一是让人们尽可能容易地安装每日构建并保持更新。F-Droid工具现在可以让设置在GitLab CI上的应用自动完成整个过程。
F-Droid 每日存储库基于 Android 工具自动生成的标准 Android ~/.android/debug.keystore 建立。 该签名密钥用于对每日构建以及存储库索引进行签名。 这么做是为了便于设置和管理,但它__并不__提供和标准 F-Droid 存储库同等级别的安全性!
由于这是为了平滑开发过程,因此在团队中重用共享的 debug.keystore 也是有意义的。 这样,所有调试版本都是可互换的。 这使得调试某些问题变得更加容易,因为在安装自己的调试版本时可以保留应用状态,例如,添加日志记录。
自动版本代码
对于夜间构建,在 git 中为每个版本设置 versionCode
的正常逻辑就不再有意义。为了让 Android 将每个新版本视为可能的更新,versionCode
必须增加,但是每次都提交给 git 没有意义。所以需要有一些自动逻辑来设置versionCode
:
- 以秒为单位的时间戳 (
date +%s
) 将始终增加 - 递增上一个版本’的
versionCode
(例如,104030034、104030035、104030036) - git commit count (
git rev-list --first-parent --count HEAD
) 提供了一些提示,说明构建的代码位置
对于许多应用,某些组合最有意义。对于 F-Droid,我们有一个用于内部数据库的变量 DB_VERSION
。我们只负责升级数据库,从不降级。所以这需要成为 versionCode 中最重要的部分。任何具有 DB_VERSION = 77
的构建都不应该被具有 DB_VERSION = 75
的任何构建升级。然后次要部分是提交计数,因此它看起来像(7502543、7502544、7702601 等)。用 DB_VERSION
作为前两位数字,然后一个 0 填充的提交计数作为最后 5 位数字。
配置 GitLab CI
这假设应用已经使用 .gitlab-ci.yml 进行设置,并且构建正在 GitLab CI 上运行。这也适用于具有 .gitlab-ci-yml 的主项目的分支。
在正在设置的本地 git 代码库中每日运行
fdroid --show-secret-var
,例如_fdroid/fdroidclient_。它将打印出 SSH 公钥。使用--show-secret-var
将打印出 base 64 文本以粘贴到名为DEBUG_KEYSTORE
的秘密变量中。小心!该文本是整个 debug.keystore,因此请相应地保护它!创建一个新的 GitLab “项目”,将 -nightly 附加到名称上。例如,https://gitlab.com/fdroid/fdroidclient 变成 https://gitlab.com/fdroid/fdroidclient-nightly,https://gitlab.com/eighthave/fdroidclient 变成 https://gitlab.com/eighthave/fdroidclient-nightly
在该新项目中,添加从 debug.keystore 派生的 SSH 公钥作为存储库设置中的部署密钥,例如
https://gitlab.com/eighthave/fdroidclient-nightly/settings/repository
在正在构建的项目的 CI/CD 设置中,将其粘贴到名为
DEBUG_KEYSTORE
的 GitLab CI 秘密变量中,例如https://gitlab.com/eighthave/fdroidclient/settings/ci_cd
然后在同一页面中的受保护部分,设置你的 master 分支以限制泄漏 debug.keystore 的可能性。如果 master 不能被强制推送,那么任何获取存储机密的尝试都会永久写入 git 历史记录。如果没有这种保护,具有推送访问权限的人可以在分支中推送提交以打印出机密,然后删除该提交以隐藏他们的操作。
将 deploy 阶段添加到你的 .gitlab-ci.yml,该阶段仅生成要发布到每日构建,然后每日运行
fdroid
。例如:
deploy_nightly:
stage: deploy
only:
- master
script:
- ./gradlew assembleDebug
- pip3 install fdroidserver
- export PATH=~/.local/bin:$PATH
- fdroid nightly
有关使用 gitlab-ci 的实际例子,请参阅 fdroidclient: * https://gitlab.com/fdroid/fdroidclient-nightly * https://gitlab.com/fdroid/fdroidclient/blob/master/.gitlab-ci.yml
配置 GitHub Actions
GitHub 和 GitHub Actions 都是广泛用于开发自由软件的专有平台。 由于 F-Droid 不推广专有软件,因此 GitHub Actions 没有官方支持。 所有 F-Droid 工具都是自由软件,因此贡献者基于 F-Droid 工具制作了一个 GitHub Action。
在正在设置的本地 git 代码库中每日运行
fdroid --show-secret-var
,例如_fdroid/fdroidclient_。它将打印出 SSH 公钥。使用--show-secret-var
将打印出 base 64 文本以粘贴到名为DEBUG_KEYSTORE
的秘密变量中。小心!该文本是整个 debug.keystore,因此请相应地保护它!创建一个新的 Github “项目”,将 -nightly 附加到名称上。例如,https://github.com/f-droid/fdroidclient 变成 https://github.com/f-droid/fdroidclient-nightly,https://github.com/eighthave/fdroidclient 变成 https://github.com/eighthave/fdroidclient-nightly
在该新项目中,添加从 debug.keystore 派生的 SSH 公钥作为安全设置中的部署密钥,例如
https://github.com/eighthave/fdroidclient-nightly/settings/keys
在正构建项目的设置中,于“安全”部分的“Secrets”项下找到“Actions”。将完整的
DEBUG_KEYSTORE
输出行粘帖到名为DEBUG_KEYSTORE
的新存储库 secret,如https://github.com/eighthave/fdroidclient/settings/secrets/actions
。将 nightly 阶段添加到你的 .github/workflows,该阶段仅生成要发布到每日构建,然后每日运行
fdroid nightly
。例如:
name: Publish nightly build
on:
push:
branches:
- main
jobs:
nightly:
name: Publish nightly build
runs-on: ubuntu-latest
environment: nightly
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Gradle Wrapper Validation
uses: gradle/wrapper-validation-action@v1
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: 11
- name: Build
run: |
# use timestamp as Version Code
export versionCode=$(date '+%s')
sed -i "s,^\(\s*versionCode\) *[0-9].*,\1 $versionCode," app/build.gradle
./gradlew assembleDebug
- name: fdroid nightly
run: |
sudo add-apt-repository ppa:fdroid/fdroidserver
sudo apt-get update
sudo apt-get install apksigner fdroidserver --no-install-recommends
export DEBUG_KEYSTORE=${{ secrets.DEBUG_KEYSTORE }}
fdroid nightly --archive-older 10
有一种基于 Docker 的替代方法,由 @wardvl 维护:wardvl/f-droid-nightly-action
为 GitHub 和 Travis CI 进行配置
- 为每个应用生成一个新的 debug.keystore,因为 GitHub 只允许在单个代码库上使用部署密钥。确保该文件安全,因为它是你每日构建的签名密钥。
keytool -genkey -v -keystore im.zom.messenger-debug.keystore \ -keyalg RSA -keysize 2048 -validity 10000 \ -alias androiddebugkey -storepass android -keypass android \ -dname "CN=Android Debug,O=Android,C=US"
2.设置一个 GitHub 部署密钥,用于
https://github.com/zom/zom-android-nightly
,并转到https://github.com/zom/zom-android-nightly/settings/keys
。 该 SSH 公钥是通过运行以下程序打印出来的。fdroid nightly --keystore im.zom.messenger-debug.keystore
- 在 GitHub Deploy Key 设置中勾选 Allow write access
- 要打印出秘密变量的内容,请使用
--show-secret-var
。小心!该文本是整个 debug.keystore,因此请相应地保护它!这会打印出要粘贴到 ` https://travis-ci.org/zom/Zom-Android/settings中的 Travis CI “环境变量”中的 Base64 文本。调用变量
DEBUG_KEYSTORE` 并确保“在构建日志中显示值”为 OFF。fdroid nightly --keystore im.zom.messenger-debug.keystore --show-secret-var
这是一个简单的示例,说明如何将 fdroidserver 添加到你的 Travis CI 设置中,以使其在成功测试后部署 APK:
sudo: required
language: android
addons:
apt:
sources:
- sourceline: 'ppa:fdroid/fdroidserver'
packages:
- fdroidserver
- openssh-client
android:
components:
- tools
- platform-tools
- build-tools-26.0.2
- android-25
licenses:
- 'android-sdk-license-.+'
script:
- ./gradlew test
after_success:
- fdroid nightly -v
关于一个真实的例子,请参阅 Zom: * https://github.com/zom/Zom-Android-nightly * https://github.com/zom/Zom-Android/blob/master/.travis.yml * https://travis-ci.org/zom/Zom-Android
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论