首页 > 解决方案 > 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'

标签: iosxamarinazure-pipelinesprovisioning-profileurbanairship.com

解决方案


推荐阅读