使用github操作构建电容器iOS应用程序捆绑包
#javascript #android #ios #电容器

寻找用电容器构建Android捆绑包? Check out this blog post instead!

在这篇文章中,我们将为iOS电容器应用程序设置一个github操作工作流,该应用程序将产生一个IPA文件,可以通过Transporter应用程序上传到Apple。

在高水平上,我们将:

  • 设置证书,标识符和配置文件
  • 配置github操作秘密使用上述
  • 创建一个github操作工作流程
  • 通过Transporter App提交应用程序

让我们开始! ðÖ©

设置证书,标识符和配置文件

与Android相比,构建iOS应用程序需要一些工作。

首先,我们需要确保至少拥有一张分销证书。通过XCode进行设置>帐户>管理证书> +> Apple Distribution

,这是最简单的。

现在我们有了证书,我们需要添加一个配置文件。我们可以转到Apple Developer site for profiles并添加新的App Store配置文件。

之后,您将选择应用程序ID,这应该是您应用的特定的应用程序,而不是通配符。

然后选择关联的证书。由于您在较早的步骤中从Xcode生成了分发证书,因此应该在此处显示。

命名您的个人资料,然后下载,您应该获得一个.mobileprovision文件。

将您的应用切换到手动签名

为了能够在CI中签名您的构建,您需要禁用“自动管理签名”,并将配置配置文件设置为您在早期步骤中创建的配置文件。在XCode更改此设置后,您将在project.pbxproj中获得一个差异,该差异需要用于GitHub源控制。

设置工作流

您需要的第一件事是关注official GitHub guide called Installing an Apple certificate on macOS runners for Xcode development。您不需要开始创建YAML文件,但是您需要执行所有步骤,以使您的github repos Secrets在设置>秘密和变量>操作下,将变量BUILD_CERTIFICATE_BASE64P12_PASSWORDP12_PASSWORDBUILD_PROVISION_PROFILE_BASE64KEYCHAIN_PASSWORD设置为。<

当它要求您转换为base64的BUILD_CERTIFICATE.p12文件时,您需要返回xcode的证书页面并导出您的分发证书以获取.p12文件:

您还需要为该文件设置密码并将其指定为P12_PASSWORD

当您被要求使用PROVISIONING_PROFILE.mobileprovision时,这是您作为我们执行的先前步骤的一部分生成的配置配置文件。

提供了正确设置所有秘密的设置,在您的回复>秘密和变量>操作的设置下,它应该看起来像这样:

现在该是我们的工作流程了。此工作流程适用于使用npm run build构建的相当典型的电容器应用程序,但我鼓励您浏览文件并调整Xcode版本和Node.js版本之类的内容以匹配您的项目。在.github/workflows/build-ios.yml

下保存此文件
# https://gist.github.com/B45i/2afef964613f0698d881e0647a67fb43
name: Build iOS

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build:
    runs-on: macos-13
    name: Build iOS app
    steps:
      - name: Checkout source
        uses: actions/checkout@v3

      - name: Install the Apple certificate and provisioning profile
        env:
          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
          BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
          KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
        run: |
          # create variables
          CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
          PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
          KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db

          # import certificate and provisioning profile from secrets
          echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
          echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH

          # create temporary keychain
          security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
          security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
          security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH

          # import certificate to keychain
          security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
          security list-keychain -d user -s $KEYCHAIN_PATH

          # apply provisioning profile
          mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
          cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles

      - name: Set up XCode
        uses: maxim-lobanov/setup-xcode@v1
        with:
          xcode-version: 14.3.1

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 19.x

      - name: Install app dependencies
        run: npm install

      - name: Build project app
        run: npm run build

      - name: Capacitor update
        run: npx cap update

      - name: Capacitor copy
        run: npx cap copy

      - name: Build project
        run: xcodebuild -workspace './ios/App/App.xcworkspace' -scheme App -destination generic/platform=iOS -archivePath App.xcarchive archive

      - name: 🍻 Assemble IPA
        run: xcodebuild archive -archivePath App.xcarchive -exportArchive -exportOptionsPlist ./archive.plist -exportPath output -allowProvisioningUpdates

      - name: Upload release bundle
        uses: actions/upload-artifact@v3
        with:
          name: app-ios
          path: output/
          retention-days: 60

      # For use on self-hosted runners, see 
      # https://docs.github.com/en/actions/deployment/deploying-xcode-applications/installing-an-apple-certificate-on-macos-runners-for-xcode-development
      #- name: Clean up keychain and provisioning profile
      #  if: ${{ always() }}
      #  run: |
      #    security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
      #    rm ~/Library/MobileDevice/Provisioning\ Profiles/build_pp.mobileprovision

我们还必须添加一个名为archive.plist的文件,将此文件添加到您的项目的根部:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
<key>provisioningProfiles</key>
<dict>
    <key>place.appreciation.jar</key>
    <string>Deploy GitHub</string>
</dict>
</dict>
</plist>

您必须在此文件中更改的内容是用应用程序ID替换place.appreciation.jar,然后用您的配置配置文件的名称替换Deploy GitHub。我不确定为什么需要此手动步骤,但是如果您省略此过程并使用Xcode构建的第一步中的archive.plist文件,则它没有正确的provisioningProfiles集,因此您将获得以下错误:

error: exportArchive: "App.app" requires a provisioning profile with the Associated Domains and Push Notifications features.

 Error Domain=IDEProvisioningErrorDomain Code=9 ""App.app" requires a provisioning profile with the Associated Domains and Push Notifications features." UserInfo={IDEDistributionIssueSeverity=3, NSLocalizedDescription="App.app" requires a provisioning profile with the Associated Domains and Push Notifications features., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}

** EXPORT FAILED **

通过运输应用程序

传递文件

构建完成后,您可以单击“ github”项目下的构建,然后下载由此产生的工件。

提取此zip文件后,您将拥有一个App.ipa文件。将此文件拖到Transporter app,然后按“交付”将其发送到Apple。

如果您发现构建版本已经使用过的错误,请记住,您必须通过应用程序的常规设置在XCode中手动更新这些版本:

结论

仅使用GITHUB操作构建您的应用程序是可能的,但这绝对不是一个简单的过程。有一些工具,例如Fastlane,当然还有XCode Cloud简化了此过程,但是我的目标是一个不依赖第三方库或服务的解决方案。

祝您CI之旅好运!

James Yarema上的Unsplash