Azure pipeline build fails with multiple provisioning profiles - ios

Using Azure pipelines, I am trying to build/deploy a Xamarin iOS app that depends on a push notification iOS service extension developed by Airship.
To build an iOS app and a related iOS service extension requires multiple provisioning profiles, one for the app and another for the service extension.
The Azure pipeline build fails, complaining that the service extension provisioning profile does not match the apps provisioning profile.
How do I get an Azure pipeline build to succeed when multiple provisioning profiles are required?
In case it matters, the app is developed using Visual Studio for Mac. I am able to build and run it on a physical test device.
Update #1:
This is the error message we get in the Azure pipeline console. This message is output when trying to build the service extension.
Info.plist : error : Project bundle identifier 'com.orgname.ServiceExtension' does not match specified provisioning profile 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx'
(The xxxxx's represent our apps provisioning profile uuid)
Reviewing the Azure code, it looks like there is no way to tell the build step to use multiple provisioning profiles. If I am understanding the code correctly, it looks like the Xamarin iOS Azure pipeline task can only handle a single provProfileUuid value.
Update #2 - The .yml files:
azure-pipelines-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'
azure-pipeline-build-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'

Related

How to deploy iPhone app and WatchOS app(App extension) on TestFlight using Azure devops pipeline

I have tried below mentioned YML file in Azure pipeline but getting error during the run. Without the extension it was working fine
❌ error: Provisioning profile "watchkit-beta-extension-appstore" has
app ID "dev.app.watchkitapp.watchkitextension", which does not match
the bundle ID "dev.app.watchkitapp". (in target 'Watch' from project
'PORJECT_NAME')
trigger:
- develop
pool:
vmImage: 'macos-latest'
variables:
- group: iOS-build-variables
steps:
# CocoaPods
# Install CocoaPods dependencies for Swift and Objective-C Cocoa projects
- task: CocoaPods#0
inputs:
forceRepoUpdate: false
- task: InstallAppleCertificate#2
inputs:
certSecureFile: 'Distribution_Certificates.p12'
certPwd: '$(key.appCertificatePassword)'
keychain: 'temp'
- task: InstallAppleProvisioningProfile#1
displayName: 'Install MainTarget provisioning profile'
inputs:
provisioningProfileLocation: 'secureFiles'
provProfileSecureFile: 'beta_appstore_profile.mobileprovision'
- task: InstallAppleProvisioningProfile#1
displayName: 'Install Watch app provisioning profile'
inputs:
provisioningProfileLocation: 'secureFiles'
provProfileSecureFile: 'watchkit-beta-appstore.mobileprovision'
- task: InstallAppleProvisioningProfile#1
displayName: 'Install Watch extension app provisioning profile'
inputs:
provisioningProfileLocation: 'secureFiles'
provProfileSecureFile: 'watchkit-beta-extension-appstore.mobileprovision'
- task: Xcode#5
inputs:
actions: 'build'
scheme: '$(key.devrelease.scheme)'
sdk:
configuration: '$(key.devrelease.configuration)'
xcWorkspacePath: 'PORJECT_NAME.xcworkspace'
xcodeVersion: 'default' # Options: 8, 9, 10, 11, 12, default, specifyPath
signingOption: 'manual'
packageApp: true
signingIdentity: $(APPLE_CERTIFICATE_SIGNING_IDENTITY)
provisioningProfileUuid: $(APPLE_PROV_PROFILE_UUID)
- task: CopyFiles#2
inputs:
contents: '**/*.ipa'
targetFolder: '$(build.artifactStagingDirectory)'
overWrite: true
flattenFolders: true
- task: PublishBuildArtifacts#1
inputs:
pathtoPublish: '$(build.artifactStagingDirectory)'
artifactName: 'drop'
publishLocation: 'Container'
- task: AppStoreRelease#1
displayName: 'Publish to the App Store TestFlight track'
inputs:
serviceEndpoint: 'AppleStoreServiceConnection'
appIdentifier: '$(key.devrelease.appPackageName)'
ipaPath: '$(build.artifactstagingdirectory)/**/*.ipa'
shouldSkipWaitingForProcessing: true
installFastlane: false
releaseTrack: 'TestFlight'

Push notifications are not working in the iOS build created using Azure Pipeline

In a Xamarin.forms project I am trying to create the build using below YML script. I have added the tasks to install both Appstore distribution and APNS certificate .p12 file. whole script is working fine, Build is working fine only push notifications are not working, below is the script I am using:
stage: iOSBuildProd
displayName: iOS Build Prod
dependsOn: iOSBuildQA
pool:
vmImage: 'macOS-latest'
jobs:
- job: iOSBuildSolution
displayName: iOS Build Solution
steps:
- script: sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh 5_0_0
displayName: 'Select Xamarin SDK version'
enabled: false
- task: InstallAppleCertificate#2
displayName: installing Build certificate
inputs:
certSecureFile: '$(certAPNSFile)'
certPwd: '$(certificatePassword)'
keychain: 'temp'
deleteCert: true
- task: InstallAppleCertificate#2
displayName: installing Build certificate
inputs:
certSecureFile: '$(certDistributionFile)'
certPwd: '$(certificatePassword)'
keychain: 'temp'
deleteCert: true
- task: InstallAppleProvisioningProfile#1
displayName: installing provisioning profiles
inputs:
provisioningProfileLocation: 'secureFiles'
provProfileSecureFile: $(AppStoreProfileName)
removeProfile: true
- task: NuGetToolInstaller#1
displayName: 'NuGet Installer'
- task: NuGetCommand#2
displayName: 'NuGet Command'
inputs:
restoreSolution: '$(solutionPath)'
- task: XamariniOS#2
displayName: 'iOS Build'
inputs:
solutionFile: '$(iOSSolutionPath)'
configuration: '$(solutionConfiguration)'
args: '/p:IpaPackageDir="$(outputDirectory)"'
packageApp: true
buildForSimulator: false
runNugetRestore: true
signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
signingProvisioningProfileID: '$(APPLE_PROV_PROFILE_UUID)'
- task: PublishBuildArtifacts#1
inputs:
pathtoPublish: '$(outputDirectory)'
ArtifactName: 'prodStage'
I finally got this working using the Firebase.plugin for .Net Maui. I have no idea if the code I posted for installing two Apple Certificates fixed it. I have since tested with the APN server that I built and that works. The Firebase console works too.
If you are having issues getting Firebase.plugin to build on iOS, take a look at this issue. https://github.com/TobiasBuchholz/Plugin.Firebase/issues/51
Here is how I'm doing it. This works.
- task: InstallAppleCertificate#2
inputs:
certSecureFile: 'apple_dev_2022.p12'
certPwd: $(iOSCertPassword)
keychain: 'custom' # Options: default, temp, custom
customKeychainPath: $(Agent.BuildDirectory)/CustomFirstKeyChain.keychain
deleteCustomKeychain: true
keychainPassword: $(iOSCertPassword)
displayName: Install Development Certificate (Dev not Ad Hoc)
- task: InstallAppleCertificate#2
inputs:
certSecureFile: 'apple_dev_push_2022.p12'
certPwd: $(iOSCertPassword)
keychain: 'custom' # Options: default, temp, custom
customKeychainPath: $(Agent.BuildDirectory)/CustomSecondKeyChain.keychain
deleteCustomKeychain: true
keychainPassword: $(iOSCertPassword)
displayName: Install Push Notification Certificate
- task: InstallAppleProvisioningProfile#1
inputs:
provisioningProfileLocation: 'secureFiles'
provProfileSecureFile: 'My_App_Dev_not_Ad_Hoc_3_v2.mobileprovision'

IPA file size getting huge (131MB) in PROD Env but in QA(Pre-Prod) its just 17 MB

i'm having 2 Branches (qa & prod) in project with same code. code is identical.
While generating the IPA build from qa the size is 17MB but its 131MB when generate from prod branch. the only differences are certificate & provision profile name, scheme name and environment in YAML file. Unable to find the reason why IPA build is huge in prod. Please help.
trigger:
- none
resources:
- repo: self
pool:
vmImage: 'macos-latest'
variables:
- group: resfebervariables #Variable name where certificate password has been saved.
steps:
- checkout: self
persistCredentials: true
clean: true
- task: NodeTool#0
displayName: 'Install Node'
inputs:
versionSpec: '18.0.0' # you can use your desired version here
- script: yarn install
displayName: Install Dependencies
- script: |
# Disable autocommit on version bump
yarn config set version-sign-git-tag false
yarn config set version-git-tag false
yarn config set version-commit-hooks false
# Checkout branch where the build is triggered
git checkout $(Build.SourceBranchName)
# Extract existing version of package.json
oldVer=$(jq -r ".version" package.json)
# Bump version
yarn version --patch
# Add bumped version to staging
git add *
# Extract new version of package.json
newVer=$(jq -r ".version" package.json)
# Set environment variables
echo "##vso[task.setvariable variable=OLD_VERSION]$oldVer"
echo "##vso[task.setvariable variable=NEW_VERSION]$newVer"
displayName: 'Bump version and set variables'
- task: ios-bundle-version#1
displayName: 'Bump iOS version'
inputs:
sourcePath: 'packages/res-feber-mobile/ios/resfebermobile/Info.plist'
versionCodeOption: 'buildid'
versionCode: '$(Build.BuildId)'
versionName: '$(NEW_VERSION)'
printFile: false
- task: InstallAppleCertificate#2
displayName: Install Apple Certificate
inputs:
certSecureFile: 'resfeber.p12'
certPwd: '$(p12password)'
keychain: 'temp'
deleteCert: true
- task: InstallAppleProvisioningProfile#1
displayName: 'Install Apple Provisioning Profile'
inputs:
provisioningProfileLocation: 'secureFiles'
provProfileSecureFile: 'resfeber_Enterprise_QA.mobileprovision'
removeProfile: true
- task: CocoaPods#0
displayName: 'Install CocoaPods'
inputs:
workingDirectory: '/Users/runner/work/1/s/packages/res-feber-mobile/ios'
- task: Xcode#5
displayName: 'Build IPA'
inputs:
actions: 'build'
configuration: 'Qa'
sdk: 'iphoneos'
scheme: 'resfebermobileQa'
xcWorkspacePath: '/Users/runner/work/1/s/packages/res-feber-mobile/ios/resfebermobile.xcworkspace'
packageApp: true
exportPath: 'output/$(SDK)/$(Configuration)'
exportMethod: 'enterprise'
signingOption: 'manual'
signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)'
- task: CopyFiles#2
displayName: 'Copy Files to: $(build.artifactstagingdirectory)'
inputs:
SourceFolder: '$(system.defaultworkingdirectory)'
Contents: |
**/*.ipa
**/*.dSYM/**
TargetFolder: '$(build.artifactstagingdirectory)'
overWrite: true
cleanTargetFolder: true
- task: PublishBuildArtifacts#1
displayName: 'Publish Artifact: iOSBuild'
inputs:
ArtifactName: iOSBuild

iOS build pipeline taking more than 50 minutes

I've Created below YAML for iOS Build Pipeline for Monorepo environment and Reactive as frontend. Pipeline is taking so much of time (Nearly 57 minutes) in Azure Devops, specially build step taking 39-43 minutes. Please help to reduce the pipeline build time.
trigger:
- none
resources:
- repo: self
pool:
vmImage: 'macos-latest'
variables:
- group: resfebervariables #Variable name where certificate password has been saved.
steps:
- checkout: self
persistCredentials: true
clean: true
- task: NodeTool#0
displayName: 'Install Node'
inputs:
versionSpec: '18.0.0' # you can use your desired version here
- script: yarn install
displayName: Install Dependencies
- script: |
# Disable autocommit on version bump
yarn config set version-sign-git-tag false
yarn config set version-git-tag false
yarn config set version-commit-hooks false
# Checkout branch where the build is triggered
git checkout $(Build.SourceBranchName)
# Extract existing version of package.json
oldVer=$(jq -r ".version" package.json)
# Bump version
yarn version --patch
# Add bumped version to staging
git add *
# Extract new version of package.json
newVer=$(jq -r ".version" package.json)
# Set environment variables
echo "##vso[task.setvariable variable=OLD_VERSION]$oldVer"
echo "##vso[task.setvariable variable=NEW_VERSION]$newVer"
displayName: 'Bump version and set variables'
- task: ios-bundle-version#1
displayName: 'Bump iOS version'
inputs:
sourcePath: 'packages/res-feber-mobile/ios/resfebermobile/Info.plist'
versionCodeOption: 'buildid'
versionCode: '$(Build.BuildId)'
versionName: '$(NEW_VERSION)'
printFile: false
- task: InstallAppleCertificate#2
displayName: Install Apple Certificate
inputs:
certSecureFile: 'resfeber.p12'
certPwd: '$(p12password)'
keychain: 'temp'
deleteCert: true
- task: InstallAppleProvisioningProfile#1
displayName: 'Install Apple Provisioning Profile'
inputs:
provisioningProfileLocation: 'secureFiles'
provProfileSecureFile: 'resfeber_Enterprise_QA.mobileprovision'
removeProfile: true
- task: CocoaPods#0
displayName: 'Install CocoaPods'
inputs:
workingDirectory: '/Users/runner/work/1/s/packages/res-feber-mobile/ios'
- task: Xcode#5
displayName: 'Build IPA'
inputs:
actions: 'build'
configuration: 'Qa'
sdk: 'iphoneos'
scheme: 'resfebermobileQa'
xcWorkspacePath: '/Users/runner/work/1/s/packages/res-feber-mobile/ios/resfebermobile.xcworkspace'
packageApp: true
exportPath: 'output/$(SDK)/$(Configuration)'
exportMethod: 'enterprise'
signingOption: 'manual'
signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)'
- task: CopyFiles#2
displayName: 'Copy Files to: $(build.artifactstagingdirectory)'
inputs:
SourceFolder: '$(system.defaultworkingdirectory)'
Contents: |
**/*.ipa
**/*.dSYM/**
TargetFolder: '$(build.artifactstagingdirectory)'
overWrite: true
cleanTargetFolder: true
- task: PublishBuildArtifacts#1
displayName: 'Publish Artifact: iOSBuild'
inputs:
ArtifactName: iOSBuild
help needed to reduce the build time.
yarn install function can be used script can be commented.
Pipeline steps and timing
I am able to extend my pipeline time duration for Azure Hosted Agent, I've added 1 job at pipeline root lable with timeout and added time out in each tasks.
trigger:
- none
resources:
- repo: self
variables:
- group: resfebervariables
jobs:
- job: build
timeoutInMinutes: 180
pool:
vmImage: 'macos-latest'
steps:
- checkout: self
persistCredentials: true
clean: true
- task: NodeTool#0
timeoutInMinutes: 180
displayName: 'Install Node'
inputs:
versionSpec: '18.8.0' # you can use your desired version here
- script: yarn install
displayName: Install Dependencies
- script: |
# Disable autocommit on version bump
yarn config set version-sign-git-tag false
yarn config set version-git-tag false
yarn config set version-commit-hooks false
Checkout branch where the build is triggered
git checkout $(Build.SourceBranchName)
# Extract existing version of package.json
oldVer=$(jq -r ".version" package.json)
# Bump version
yarn version --patch
# Add bumped version to staging
git add *
# Extract new version of package.json
newVer=$(jq -r ".version" package.json)
# Set environment variables
echo "##vso[task.setvariable variable=OLD_VERSION]$oldVer"
echo "##vso[task.setvariable variable=NEW_VERSION]$newVer"
displayName: 'Bump version and set variables'
- task: ios-bundle-version#1
timeoutInMinutes: 180
displayName: 'Bump iOS version'
inputs:
sourcePath: 'packages/res-feber-mobile/ios/resfebermobile/Info.plist'
# versionCodeOption: 'buildid'
versionCode: '$(VERSION_CODE)'
versionName: '$(VERSION_NAME)'
printFile: false
- task: InstallAppleCertificate#2
timeoutInMinutes: 180
displayName: Install Apple Certificate
inputs:
certSecureFile: 'resfeber.p12'
certPwd: '$(p12password)'
keychain: 'temp'
deleteCert: true
- task: InstallAppleProvisioningProfile#1
timeoutInMinutes: 180
displayName: 'Install Apple Provisioning Profile'
inputs:
provisioningProfileLocation: 'secureFiles'
provProfileSecureFile: 'resfeber.mobileprovision'
removeProfile: true
- task: CocoaPods#0
timeoutInMinutes: 180
displayName: 'Install CocoaPods'
inputs:
workingDirectory: '/Users/runner/work/1/s/packages/res-feber-mobile/ios'
- task: Xcode#5
timeoutInMinutes: 180
displayName: 'Build IPA'
inputs:
actions: 'build'
configuration: 'Qa'
sdk: 'iphoneos'
scheme: 'resfebermobileQa'
xcWorkspacePath: '/Users/runner/work/1/s/packages/res-feber-mobile/ios/resfebermobile.xcworkspace'
packageApp: true
exportPath: 'output/$(SDK)/$(Configuration)'
exportMethod: 'enterprise'
signingOption: 'manual'
signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)'
- task: CopyFiles#2
timeoutInMinutes: 180
displayName: 'Copy Files to: $(build.artifactstagingdirectory)'
inputs:
SourceFolder: '$(system.defaultworkingdirectory)'
Contents: |
**/*.ipa
**/*.dSYM/**
TargetFolder: '$(build.artifactstagingdirectory)'
overWrite: true
cleanTargetFolder: true
- task: PublishBuildArtifacts#1
timeoutInMinutes: 180
displayName: 'Publish Artifact: iOSBuild'
inputs:
ArtifactName: iOSBuild

Error : Build Xcode using Azure DevOps pipeline for iOS

❌ error: "ProjectName" requires a provisioning profile with the Near Field Communication Tag Reading feature. Select a provisioning profile in the Signing & Capabilities editor. (in target 'ProjectName' from project 'ProjectName')
Before adding certificates it is building successfully. but after I added certificates it is giving error like above.
I have already enable Near Field Communication Tag Reading feature in app and certificate both.
Below is my yaml file code:
trigger:
branches:
include:
- main
paths:
include:
- 'iOS'
pool:
vmImage: 'macos-latest'
steps:
- task: CocoaPods#0
displayName: 'installing pods'
inputs:
workingDirectory: 'iOS/ProjectName'
forceRepoUpdate: false
- task: DownloadSecureFile#1
displayName: 'Download project certificate'
inputs:
secureFile: 'certificates.p12'
- task: DownloadSecureFile#1
displayName: 'Download provisional certificate'
inputs:
secureFile: 'nameOfCertificate.mobileprovision'
- task: InstallAppleCertificate#2
inputs:
certSecureFile: 'certificates.p12'
certPwd: '$(p12password)'
keychain: 'temp'
- task: InstallAppleProvisioningProfile#1
inputs:
provisioningProfileLocation: 'secureFiles'
provProfileSecureFile: 'nameOfCertificate.mobileprovision'
- task: Xcode#5
displayName: 'Build the app using Xcode'
inputs:
actions: 'build'
sdk: 'iphoneos'
scheme: 'projectName'
xcWorkspacePath: 'iOS/FolderName/projectName.xcworkspace'
packageApp: true
signingOption: 'manual'
- task: Xcode#5
displayName: 'Run XCTest/XCUITest'
inputs:
actions: 'test'
sdk: 'iphonesimulator'
xcWorkspacePath: 'iOS/FolderName/projectName.xcworkspace'
scheme: 'projectName'
xcodeVersion: 'default'
useXcpretty: true
publishJUnitResults: true
destinationPlatformOption: 'iOS' # Optional. Options: default, iOS, tvOS, macOS, custom
destinationPlatform: 'iOS Simulator'
destinationTypeOption: 'simulators' # Optional. Options: simulators, devices
destinationSimulators: 'iPhone 8' # Optional. Default value: iPhone8 for Xcode 11 and iPhone 7 for other iOS projects; Apple TV for tvOS projects.
- task: PublishTestResults#2
displayName: 'Publishing test results'
inputs:
testResultsFormat: 'JUnit'
testResultsFiles: '**/junit.xml'
mergeTestResults: true
failTaskOnFailedTests: true

Resources