ios - Azure 管道构建因多个预配配置文件而失败
问题描述
使用 Azure 管道,我正在尝试构建/部署一个 Xamarin iOS 应用程序,该应用程序依赖于 Airship 开发的推送通知 iOS 服务扩展。
要构建 iOS 应用程序和相关的 iOS 服务扩展,需要多个配置文件,一个用于应用程序,另一个用于服务扩展。
Azure 管道构建失败,抱怨服务扩展配置文件与应用程序配置文件不匹配。
当需要多个预配配置文件时,如何使 Azure 管道构建成功?
万一重要,该应用程序是使用 Visual Studio for Mac 开发的。我能够在物理测试设备上构建和运行它。
更新#1:
这是我们在 Azure 管道控制台中收到的错误消息。尝试构建服务扩展时会输出此消息。
Info.plist : error : Project bundle identifier 'com.orgname.ServiceExtension' does not match specified provisioning profile 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx'
(xxxxx 代表我们的应用程序配置文件 uuid)
查看 Azure 代码,似乎无法告诉构建步骤使用多个配置文件。如果我正确理解代码,看起来Xamarin iOS Azure 管道任务只能处理单个provProfileUuid
值。
更新 #2 - .yml 文件:
天蓝色管道prod.yml
variables:
productName: 'OurAppName'
projectBuildNumber: $[counter('', 800)]
versionName: $[format('{0:yyyy}.{0:MM}.{0:dd}', pipeline.startTime)]
name: $(versionName) ($(projectBuildNumber))
jobs:
- template: pipelines/build-ios.yml
parameters:
productionBuild: true
provisioningProfile: 'match_AppStore_com_orgname_appname.mobileprovision'
serviceExtensionProvisioningProfile: 'orgname_appname_service_ext.mobileprovision'
天蓝色管道构建 ios.yml
parameters:
- name: productionBuild
type: boolean
default: false
- name: provisioningProfile
displayName: 'Provisioning Profile'
type: string
- name: serviceExtensionProvisioningProfile
displayName: 'Provisioning Profile for App Extension'
type: string
jobs:
- job: iOS
pool:
vmImage: 'macOS-latest'
variables:
iosRoot: '$(system.defaultworkingdirectory)/$(productName).iOS'
iosProjectPath: '$(iosRoot)/*iOS.csproj'
NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages
buildConfiguration: 'Release'
outputDirectory: '$(build.binariesDirectory)/$(buildConfiguration)'
infoPlist: '$(iosRoot)/Info.plist'
# if not a production build, add the QA build symbol for compiler switches
${{ if eq(parameters.productionBuild, false) }}:
buildArgs: '/p:DefineConstants="QA"'
${{ if eq(parameters.productionBuild, true) }}:
buildArgs: ''
steps:
# restore and run unit tests
- template: unit-tests.yml
# Set build number and version Name
- task: ios-bundle-version@1
displayName: 'Set build number and version Name'
inputs:
sourcePath: '$(infoPlist)'
versionCodeOption: 'buildid'
versionCode: '$(projectBuildNumber)'
versionName: '$(versionName)'
printFile: true
# Install signing certificate
- task: InstallAppleCertificate@2
displayName: 'Install signing certificate'
inputs:
certSecureFile: 'AppleSigningCertificate.p12'
certPwd: '$(ios-cert-key)'
# Install Provisioning Profile
- task: InstallAppleProvisioningProfile@1
displayName: 'Install Provisioning Profile'
inputs:
provProfileSecureFile: ${{ parameters.provisioningProfile }}
# Install App Extension Provisioning Profile
- task: InstallAppleProvisioningProfile@1
displayName: 'Install Provisioning Profile for App Extension'
inputs:
provProfileSecureFile: ${{ parameters.serviceExtensionProvisioningProfile }}
# Build iOS ipa package
- task: XamariniOS@2
displayName: Build iOS ipa package
inputs:
solutionFile: '$(iosProjectPath)'
configuration: '$(buildConfiguration)'
buildForSimulator: false
packageApp: true
signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
signingProvisioningProfileID: '$(APPLE_PROV_PROFILE_UUID)'
args: /p:IpaPackageDir="$(Build.ArtifactStagingDirectory)" /p:OutputPath="$(outputDirectory)/iPhone/" /p:RestorePackages=false $(buildArgs)"
# Archive dSYM
- task: ArchiveFiles@2
displayName: 'Archive dSYM'
inputs:
rootFolderOrFile: '$(outputDirectory)/iPhone/$(productName).iOS.app.dSYM'
includeRootFolder: false
archiveType: 'zip'
archiveFile: '$(Build.ArtifactStagingDirectory)/$(productName).iOS.app.dSYM.zip'
replaceExistingArchive: true
# on non-prod builds, make a simulator build
- ${{ if eq(parameters.productionBuild, false) }}:
# Create simulator build
- task: XamariniOS@2
displayName: 'Create simulator build'
inputs:
solutionFile: '$(iosProjectPath)'
configuration: '$(buildConfiguration)'
buildForSimulator: true
packageApp: false
args: /p:OutputPath="$(outputDirectory)/iPhoneSimulator/" /p:RestorePackages=false $(buildArgs)
# Archive Simulator Build
- task: ArchiveFiles@2
displayName: 'Archive Simulator Build'
inputs:
rootFolderOrFile: '$(outputDirectory)/iPhoneSimulator/$(productName).iOS.app'
includeRootFolder: false
archiveType: 'zip'
archiveFile: '$(Build.ArtifactStagingDirectory)/$(productName).iOS.app.zip'
replaceExistingArchive: true
# Archive Simulator dSYM
- task: ArchiveFiles@2
displayName: 'Archive Simulator dSYM'
inputs:
rootFolderOrFile: '$(outputDirectory)/iPhoneSimulator/$(productName).iOS.app.dSYM'
includeRootFolder: false
archiveType: 'zip'
archiveFile: '$(Build.ArtifactStagingDirectory)/$(productName).iOS.app.Simulator.dSYM.zip'
replaceExistingArchive: true
# publish artifacts to pipeline
- task: PublishBuildArtifacts@1
displayName: 'publish artifacts to pipeline'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
解决方案
推荐阅读
- python - 查找列表中的第一个元素,其中所有后续值都递增一个
- python - 如何在 heroku python 应用程序上使用自定义模块
- python - 如何从fasta文件中删除重复项,但根据标题每组至少保留一个
- java - 如何修复我的 KivyMD 应用程序中的 ReferenceError?
- java - JavaFX:如何覆盖自定义对话框中的按钮操作
- c++ - 调用 vkQueueSubmit 时导致 VK_ERROR_DEVICE_LOST 的原因是什么?
- javascript - React:如何编写 id 来获得动态 axios 请求
- excel - 将多个顶级 XML 导入 Excel
- javascript - 添加到购物车按钮在 Woocommerce 的单个产品页面上不起作用
- python - 为什么在 pandas 中获取反向索引的速度如此之慢?