寻找用电容器构建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_BASE64
,P12_PASSWORD
,P12_PASSWORD
,BUILD_PROVISION_PROFILE_BASE64
和KEYCHAIN_PASSWORD
设置为。< P>
当它要求您转换为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之旅好运!
摄