返回介绍

发布每日构建

发布于 2023-08-06 23:35:04 字数 8834 浏览 0 评论 0 收藏 0

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

  1. 在正在设置的本地 git 代码库中每日运行 fdroid --show-secret-var,例如_fdroid/fdroidclient_。它将打印出 SSH 公钥。使用 --show-secret-var 将打印出 base 64 文本以粘贴到名为 DEBUG_KEYSTORE 的秘密变量中。小心!该文本是整个 debug.keystore,因此请相应地保护它!

  2. 创建一个新的 GitLab “项目”,将 -nightly 附加到名称上。例如,https://gitlab.com/fdroid/fdroidclient 变成 https://gitlab.com/fdroid/fdroidclient-nightlyhttps://gitlab.com/eighthave/fdroidclient 变成 https://gitlab.com/eighthave/fdroidclient-nightly

  3. 在该新项目中,添加从 debug.keystore 派生的 SSH 公钥作为存储库设置中的部署密钥,例如https://gitlab.com/eighthave/fdroidclient-nightly/settings/repository

  4. 在正在构建的项目的 CI/CD 设置中,将其粘贴到名为 DEBUG_KEYSTORE 的 GitLab CI 秘密变量中,例如https://gitlab.com/eighthave/fdroidclient/settings/ci_cd

  5. 然后在同一页面中的受保护部分,设置你的 master 分支以限制泄漏 debug.keystore 的可能性。如果 master 不能被强制推送,那么任何获取存储机密的尝试都会永久写入 git 历史记录。如果没有这种保护,具有推送访问权限的人可以在分支中推送提交以打印出机密,然后删除该提交以隐藏他们的操作。

  6. 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。

  1. 在正在设置的本地 git 代码库中每日运行 fdroid --show-secret-var,例如_fdroid/fdroidclient_。它将打印出 SSH 公钥。使用 --show-secret-var 将打印出 base 64 文本以粘贴到名为 DEBUG_KEYSTORE 的秘密变量中。小心!该文本是整个 debug.keystore,因此请相应地保护它!

  2. 创建一个新的 Github “项目”,将 -nightly 附加到名称上。例如,https://github.com/f-droid/fdroidclient 变成 https://github.com/f-droid/fdroidclient-nightlyhttps://github.com/eighthave/fdroidclient 变成 https://github.com/eighthave/fdroidclient-nightly

  3. 在该新项目中,添加从 debug.keystore 派生的 SSH 公钥作为安全设置中的部署密钥,例如https://github.com/eighthave/fdroidclient-nightly/settings/keys

  4. 在正构建项目的设置中,于“安全”部分的“Secrets”项下找到“Actions”。将完整的 DEBUG_KEYSTORE输出行粘帖到名为 DEBUG_KEYSTORE的新存储库 secret,如 https://github.com/eighthave/fdroidclient/settings/secrets/actions

  5. 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 进行配置

  1. 为每个应用生成一个新的 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
    
  2. 在 GitHub Deploy Key 设置中勾选 Allow write access
  3. 要打印出秘密变量的内容,请使用 --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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文