跳过主要内容
CI/CD

自动 Capacitor Android 构建与 GitLab

如何在 5 分钟内使用 fastlane 和 GitLab 为您的 Android Ionic 应用程序设置 CI/CD pipeline

文章来源

马丁·多纳迪厄

作者

瓦莱里亚

审阅者

乔丹

编辑

自动Capacitor Android 构建与 GitLab

自动 Android 构建与 GitLab CI

设置 CI/CD 以及Capacitor 应用程序的过程可能会很复杂和耗时。以下是您需要了解的内容:

先决条件

开始之前,您需要设置:

  • 一个具有管理员访问权限的 GitLab 帐户
  • 您的应用程序已在Google Play商店中以正确的签名发布
  • Android签名密钥和keystore文件
  • Google Cloud Console项目中启用了Play Store API
  • 具有适当权限的服务帐户
  • 了解GitLab CI/CD工作流
  • 了解Fastlane配置
  • 维护和调试管道所需的时间

Capgo 由 Capgo 为 CI/CD 构建

跳过Fastlane、Gradle runner、keystore和上传脚本的维护 Capgo 构建 在您的现有 CI/CD pipeline 中生成并运行已签名的原生 Android 构建。

  • 从您的现有CI/CD管道中运行已签名的原生Android构建:: 在 GitLab CI、GitHub Actions、Jenkins 或本地脚本之后触发 Capgo 构建 npx cap sync.
  • 自动从 CI 秘钥中签名: 在 CI 秘密中保留 Android 密钥库、密钥别名、密码和 Play Console 服务账户 JSON
  • 无本地运行器维护: Capgo Build 提供维护的 Android 构建环境,因此您不需要管理 SDK 图像、Gradle 缓存问题或 Fastlane 轨道
  • 构建物和提交: 下载签名的艺术品用于 QA 或通过 Capgo CLI 提交发布构建

Pricing

  • Capgo 计划从每月 12 美元起价
  • : 包括 OTA 更新和约 15 个本地构建/月
  • : 额外的构建分钟通过信用额度按分钟计费

: 在 CI/CD 中设置 Capgo Build

手动设置指南

您需要做的就是:

本文的步骤

  1. 复制 Fastlane 文件
  2. 在 GitLab 中存储加密的机密
  3. 创建并存储 Google Play 服务帐号密钥
  4. 存储您的 Android 签名密钥
  5. 设置您的 GitLab 工作流 .yml 文件

1. 复制 Fastlane 文件

Fastlane 是一款 Ruby 库,用于自动化移动开发任务。使用 Fastlane,可以配置自定义的“车道”,这些车道包含一系列的“动作”,这些动作执行您通常使用 Android Studio 执行的任务。您可以在 Fastlane 中做很多事情,但在本教程中,我们将仅使用核心动作的一小部分。

在项目根目录创建一个 Fastlane 文件夹,并复制以下文件: Fastlane

default_platform(:android)

KEYSTORE_KEY_ALIAS = ENV["KEYSTORE_KEY_ALIAS"]
KEYSTORE_KEY_PASSWORD = ENV["KEYSTORE_KEY_PASSWORD"]
KEYSTORE_STORE_PASSWORD = ENV["KEYSTORE_STORE_PASSWORD"]

platform :android do
    desc "Deploy a beta version to the Google Play"
    private_lane :verify_changelog_exists do |version_code: |
      changelog_path = "android/metadata/en-US/changelogs/#{version_code}.txt"
      UI.user_error!("Missing changelog file at #{changelog_path}") unless File.exist?(changelog_path)
      UI.message("Changelog exists for version code #{version_code}")
    end

    private_lane :verify_upload_to_staging do |version_name: |
      UI.message "Skipping staging verification step"
    end
    lane :beta do
				keystore_path = "#{Dir.tmpdir}/build_keystore.keystore"
				File.write(keystore_path, Base64.decode64(ENV['ANDROID_KEYSTORE_FILE']))
				json_key_data = Base64.decode64(ENV['PLAY_CONFIG_JSON'])
				previous_build_number = google_play_track_version_codes(
					package_name: ENV['DEVELOPER_PACKAGE_NAME'],
					track: "internal",
					json_key_data: json_key_data,
				)[0]

				current_build_number = previous_build_number + 1
				sh("export NEW_BUILD_NUMBER=#{current_build_number}")
        gradle(
          task: "clean bundleRelease",
          project_dir: 'android/',
          print_command: false,
          properties: {
            "android.injected.signing.store.file" => "#{keystore_path}",
            "android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
            "android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
            "android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
						'versionCode' => current_build_number
          })
        upload_to_play_store(
					package_name: ENV['DEVELOPER_PACKAGE_NAME'],
					json_key_data: json_key_data,
          track: 'internal',
          release_status: 'completed',
          skip_upload_metadata: true,
          skip_upload_changelogs: true,
          skip_upload_images: true,
          skip_upload_screenshots: true,
        )
    end
    lane :build do
      gradle(
        task: "clean bundleRelease",
        project_dir: 'android/',
        print_command: false,
        properties: {
          "android.injected.signing.store.file" => "#{keystore_path}",
          "android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
          "android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
          "android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
        })
    end
    lane :prod_release do
      build_gradle = File.read("../android/app/build.gradle")

      verify_changelog_exists(version_code: build_gradle.match(/versionCode (\d+)/)[1])
      verify_upload_to_staging(version_name: build_gradle.match(/versionName '([\d\.]+)'/)[1])

      supply(
        track_promote_to: 'beta',
        skip_upload_apk: true,
        skip_upload_aab: true,
        skip_upload_metadata: false,
        skip_upload_changelogs: false,
        skip_upload_images: false,
        skip_upload_screenshots: false
      )
    end
end

在 GitLab CI/CD 变量中存储您的机密

GitLab 提供了一个存储加密 CI/CD 变量的方式,类似于 GitHub 的仓库密钥。为了安全地存储您的敏感信息。

  1. 前往您的 GitLab 项目的设置。
  2. 导航到 CI/CD > 变量
  3. 添加以下变量:
  • ANDROID_KEYSTORE_FILE:存储了 Android 构建所需的 base64 编码的 .jks 或 .keystore 前往您的 GitLab 项目的设置。
  • 导航到 CI/CD > 变量
  • 添加以下变量:
  • ANDROID_KEYSTORE_FILE:存储了 Android 构建所需的 base64 编码的
  • KEYSTORE_KEY_PASSWORD:与密钥库文件相关的密码
  • KEYSTORE_KEY_ALIAS:密钥库别名(Key Store Alias)

创建 Google Play 服务帐户密钥

为了生成密钥,请遵循以下步骤: PLAY_CONFIG_JSON 步骤如下:

  1. 去到 创建一个新项目或选择一个现有的项目
  2. 启用 Google Play Android 开发者 API
  3. Enable the Google Play Android Developer API
  4. 访问 “IAM & Admin” > “服务帐户”
    • 点击 “创建服务帐户”
    • 为其命名并添加描述
    • 点击 “创建并继续”
    • 启用 Google Play Android 开发者 __CAPGO_KEEP_0__
    • 跳过角色分配并点击“完成”
  5. 生成 JSON 密钥:
    • 在列表中找到您的服务帐户
    • 点击三点菜单>“管理密钥”
    • 点击“添加密钥”>“创建新密钥”
    • 选择 JSON 格式
    • 点击“创建”
  6. 为您的应用程序在 Play Console 中授予服务帐户访问权限:
    • 前往 Google Play 控制台
    • 导航到“用户和权限”
    • 点击“邀请新用户”
    • 输入服务帐户电子邮件(以 @*.iam.gserviceaccount.com 结尾)
    • 授予“发布到生产环境”权限
    • 点击“邀请用户”
  7. 将 JSON 密钥转换为 base64:
    base64 -i path/to/your/service-account-key.json | pbcopy
  8. 将 base64 编码的字符串添加到 GitLab 中作为 PLAY_CONFIG_JSON 变量

设置您的 GitLab CI/CD pipeline

创建一个 .gitlab-ci.yml 文件,位于您的项目根目录中,来定义您的 CI/CD pipeline。以下是如何结构您的 pipeline 的示例:


image: mingc/android-build-box:latest

stages:
  - build
  - upload_to_capgo
  - build_and_upload_android

build:
  stage: build
  tags:
    - saas-linux-xlarge-amd64
  cache:
    - key:
        files:
          - bun.lockb
      paths:
        - .node_modules/
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - node_modules/
      - dist/
  only:
    - master

upload_to_capgo:
  stage: upload_to_capgo
  tags:
    - saas-linux-xlarge-amd64
  script:
    - npx @capgo/cli@latest bundle upload -a $CAPGO_TOKEN -c dev
  dependencies:
    - build
  when: manual
  only:
    - master

build_and_upload_android:
  tags:
    - saas-linux-xlarge-amd64
  stage:    build_and_upload_android
  cache:
    - key:
        files:
          - android/gradle/wrapper/gradle-wrapper.properties
      paths:
        - ~/.gradle/caches/
  script:
    - npx cap sync android
    - npx cap copy android
    - bundle exec fastlane android beta # We do create a tag for the build to trigger XCode cloud builds
  dependencies:
    - build
  when: manual
  only:
    - master

触发管道

当您推送新的标签到您的 GitLab 仓库时,GitLab CI/CD 将自动触发定义的管道,这将使用 Fastlane 构建和部署您的 Android 应用。

确保根据您的项目结构和要求调整路径和依赖项。这一设置将有助于您在 GitLab CI/CD 中自动部署 Android 应用。

结论

通过配置 GitLab CI/CD 与 mingc/android-build-box Docker 镜像,能够自动化 Android 应用程序构建过程,使您的开发工作流程更加高效和可靠。这一自动化将释放您的时间,让您专注于应用开发的核心方面,从而更高效地交付高质量的 Android 应用程序。

Keep going from Automatic Capacitor Android build with GitLab

如果您正在使用 Automatic Capacitor Android build with GitLab 与其连接 Capgo 自动化构建 为产品工作流程在Capgo CI/CD中 Capgo 原生构建 为产品工作流程中的Capgo原生构建 Capgo 集成 为产品工作流程在Capgo集成中 CI/CD 集成 CI/CD集成的实现细节 GitHub Actions集成 GitHub Actions集成的实现细节

Capacitor应用的实时更新

当web层bug实时出现时,通过Capgo将修复推送,而不是等待几天的应用商店审批。用户在后台接收更新,而原生变化仍在正常审批路径中

最新博客

Capgo为您提供创建真正专业的移动应用所需的最佳见解