发布每日构建

要获得针对当前开发活动的快速反馈,让用户运行每日构建是一种好方法。获得这种反馈的关键之一是让人们尽可能容易地安装每日构建并保持更新。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@v4

- name: Gradle Wrapper Validation

uses: gradle/wrapper-validation-action@v3

- name: Set up JDK 17

uses: actions/setup-java@v2

with:

distribution: 'adopt'

java-version: 17

- 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=$

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