hey24sheep/azure-flutter-tasks

iOS build fails with: "Xcode couldn't find any iOS App Development provisioning profiles matching..."

MiroLiebschner opened this issue ยท 20 comments

The pipeline fails at the iOS build step. This is the error output: Error (Xcode): No profiles for 'com.addiscaTraining' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'com.addiscaTraining'. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild.

My export options file:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>generateAppStoreInformation</key>
	<false/>
	<key>manageAppVersionAndBuildNumber</key>
	<true/>
	 <key>provisioningProfiles</key>
    <dict>
        <key>com.addiscaTraining</key>
        <string>iOS_Profile.mobileprovision</string>
	<key>method</key>
	<string>app-store</string>
	<key>signingStyle</key>
	<string>manual</string>
	<key>stripSwiftSymbols</key>
	<true/>
	<key>teamID</key>
	<string>$(teamId)</string>
	<key>uploadBitcode</key>
	<false/>
	<key>uploadSymbols</key>
	<true/>
</dict>
</plist>

and my pipeline was created with the help of this medium article.
This is my pipeline:

  - master

pool:
  vmImage: macOS-12

stages:
- stage: AndroidStage
  dependsOn: []
  displayName: Android
  jobs:

  - job: AndroidJob
    displayName: Android
    steps: 

    - task: DownloadSecureFile@1
      name: keyprop
      displayName: Download key properties file
      inputs:
        secureFile: 'key.properties'

    - task: DownloadSecureFile@1
      name: key
      displayName: Download signing key
      inputs:
        secureFile: 'key.jks'

    - task: Bash@3
      displayName: Copy config files
      inputs:
        targetType: 'inline'
        script: |
          cp $(keyprop.secureFilePath) $(Build.SourcesDirectory)/android/key.properties
          cp $(key.secureFilePath) $(Build.SourcesDirectory)/android/app/key.jks
          
          echo "key.properties copied to $(Build.SourcesDirectory)/android/key.properties"
          echo "key.jks copied to $(Build.SourcesDirectory)/android/app/key.jks"
    - task: FlutterInstall@0
      displayName: "Install Flutter SDK"
      inputs:
        mode: 'auto'
        channel: 'stable'
        version: 'latest'
    
    
    - task: FlutterCommand@0
      inputs:
        projectDirectory: '.'
        arguments: 'pub get'
    - task: FlutterCommand@0
      inputs:
       projectDirectory: '.'
       arguments: 'pub run build_runner build'     

    - task: FlutterBuild@0
      displayName: "Build application"
      inputs:
        target: 'aab'
        projectDirectory: '$(Build.SourcesDirectory)'

    - task: FlutterTest@0
      displayName: "Run unit tests"
      inputs:
        generateCodeCoverageReport: true
        projectDirectory: '$(Build.SourcesDirectory)'

    - task: CopyFiles@2
      displayName: "Copy app to staging directory"
      inputs:
        sourceFolder: '$(Agent.BuildDirectory)'
        contents: '**/bundle/**'
        targetFolder: '$(Build.StagingDirectory)'
        flattenFolders: true

    - task: PublishBuildArtifacts@1
      displayName: "Publish AAB file"
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'AAB'
        publishLocation: 'Container'

- stage: iOSStage
  dependsOn: []
  displayName: iOS
  jobs:
 
  - job: iOSJob
    displayName: iOS
    steps: 
          
    - task: InstallAppleCertificate@2
      displayName: Install certificate
      inputs:
        certSecureFile: 'iosKey'
        certPwd: 'myCertPwd'
        keychain: 'temp'
    
    - task: InstallAppleProvisioningProfile@1
      displayName: Install provisioning file
      inputs:
        provisioningProfileLocation: 'secureFiles'
        provProfileSecureFile: 'iOS_Profile.mobileprovision'
  
    - task: FlutterInstall@0
      displayName: "Install Flutter SDK"
      inputs:
        mode: 'auto'
        channel: 'stable'
        version: 'latest'

    - task: FlutterBuild@0
      displayName: "Build application"
      inputs:   
        target: ipa
        iosCodesign: false
        projectDirectory: '$(Build.SourcesDirectory)'
        exportOptionsPlist: 'ios/ExportOptions.plist'

    - task: FlutterTest@0
      displayName: "Run unit tests"
      inputs:
        generateCodeCoverageReport: true
        projectDirectory: '$(Build.SourcesDirectory)'

    - task: CopyFiles@2
      displayName: "Copy app to staging directory"
      inputs:
        sourceFolder: '$(Agent.BuildDirectory)'
        contents: '**/ipa/*.ipa'
        targetFolder: '$(Build.StagingDirectory)'
        flattenFolders: true

    - task: PublishBuildArtifacts@1
      displayName: "Publish IPA file"
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'IPA'
        publishLocation: 'Container'

Any help is highly appreciated, trying to get this to work for 2 days now :D

This is a very common yet frustrating error. For some reason the provisioning profiles are not linked to the build on XCode and they fail during CI/CD. Give this , this and this a thorough read. Try to build locally once with XCode and remove and then re-apply the provisioning again in the settings.

It's mostly a try and error kind of a problem. I remember, I had this error a few years back and I had to re-create profiles and re-apply everything from the start. The issue is basically with Apple here. Let me know if you solve it by closing this issue.

This is a very common yet frustrating error. For some reason the provisioning profiles are not linked to the build on XCode and they fail during CI/CD. Give this , this and this a thorough read. Try to build locally once with XCode and remove and then re-apply the provisioning again in the settings.

It's mostly a try and error kind of a problem. I remember, I had this error a few years back and I had to re-create profiles and re-apply everything from the start. The issue is basically with Apple here. Let me know if you solve it by closing this issue.

Unfortunately, it doesn't work for me. I think there is a problem with the azure mac agent or mac os related problem.

I have tested on codemagic and everything works without any error.

Just chiming in that I've also tried those steps and have no success. I get the same error. My setup and environment is very similar.

I see, I am so confused. It works for our deployments. I will re-open this issue, if anyone from the community can shed some light. I do not have a Mac so, I cannot test anything much.

This is the pool named in my azure-pipelines.yml

pool:
  vmImage: 'macos-latest'

Which one do you use? I will try anything at this point.

This is the pool named in my azure-pipelines.yml

pool:
  vmImage: 'macos-latest'

Which one do you use? I will try anything at this point.

I have tried with macos-latest and macos-12. No luck.

Maybe @hey24sheep can you share your ExportOptions.plist by hiding any sensitive info?

I do not have access to the DevOps anymore (I am looking for better jobs) so I do not know the settings. I can confirm one thing, we use flutter build ios.

I can recommend one thing, Try local hosted agent? Check if that works, if anyone can.

I can give you these details about the builds I setup in my org are as follows: (These worked before I was left from DevOps, few months back)

export_option.plist looks like this

<?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>co.organization.app</key>
		<string>Organization iOS Distribution</string>
	</dict>
</dict>
</plist>

1 - add Flutter install

2 - pod repo update

After that these steps follow

To generate IOS

steps:
- task: Hey24sheep.flutter.flutter-build.FlutterBuild@0
  displayName: 'Flutter Build ios'
  inputs:
    target: ios
    projectDirectory: project
    buildFlavour: your_flavor
    buildNumber: '$(Build.BuildNumber)'
    buildName: '$(buildTimeStamp)'
    entryPoint: 'lib/main_flavor.dart'
    iosCodesign: false
    extraArgs: '--no-tree-shake-icons'

To install Apple Cert

steps:
- task: InstallAppleCertificate@2
  displayName: 'Install an Apple certificate'
  inputs:
    certSecureFile: 'xyz_distribution.p12'
    certPwd: xyz
    setUpPartitionIdACLForPrivateKey: false

To install Apple Provisioning Profile

steps:
- task: InstallAppleProvisioningProfile@1
  displayName: 'Install an Apple provisioning profile'
  inputs:
    provProfileSecureFile: 'your_Distribution.mobileprovision'

To bump bundle version

/usr/libexec/Plistbuddy -c "Set CFBundleVersion $BUILD_BUILDNUMBER" Info.plist

To generate Archive

xcodebuild -workspace ios/Runner.xcworkspace -scheme Runner archive -sdk iphoneos -configuration Release-development -archivePath Runner CODE_SIGN_STYLE=Manual CODE_SIGN_IDENTITY="iPhone Distribution: XYZ(ABC)" PROVISIONING_PROFILE= XYZ-GUID-HERE
PROVISIONING_PROFILE_SPECIFIER="SPECIFIER HERE"

To generate IPA

xcodebuild -exportArchive -archivePath Runner.xcarchive -exportPath Runner -exportOptionsPlist ios/export_options.plist

(if any) The only issues related to Provisioning Profiles got solved by deleting and recreating profiles and then re-linking them in XCode and uploading the same new profiles to Azure Devops. I know this build system is old but this is all I can give for IOS. I hope it can help you people.

If your apps are building locally on XCode or Flutter on Mac. Then something is definitely wrong with Azure or how it is interacting with this extension. Looking at a higher look (if you read the code), this extension just wraps the 'Flutter CLI' in fancy UI for Azure. I wish I can help more but this is all I got right now.

I have added 'HelpWanted', if someone from the community is kind enough to shed some light or solution.

You can also have a look here. but, I know this isn't working for some of you.

I'm facing the same issue, here are my pipeline steps:

- task: Hey24sheep.flutter.flutter-install.FlutterInstall@0
  displayName: 'Flutter Install'
  inputs:
    version: custom
    customVersion: 3.3.4

- task: Hey24sheep.flutter.flutter-command.FlutterCommand@0
  displayName: 'pub get'
  inputs:
    arguments: 'pub get '

- task: CocoaPods@0
  displayName: 'pod install'
  inputs:
    workingDirectory: ios
    forceRepoUpdate: true

- task: InstallAppleCertificate@2
  displayName: 'Install an Apple certificate '
  inputs:
    certSecureFile: iosbuild.p12
    setUpPartitionIdACLForPrivateKey: false

- task: InstallAppleProvisioningProfile@1
  displayName: 'Install an Apple provisioning profile'
  inputs:
    provProfileSecureFile: '${{parameters.profile}}.mobileprovision'

- task: Hey24sheep.flutter.flutter-build.FlutterBuild@0
  displayName: 'build ios'
  inputs:
    target: 'ipa'
    projectDirectory: '.'
    buildFlavour: '${{parameters.ambiente}}'
    iosCodesign: true
    additionalArguments: '--obfuscate --split-debug-info=$(Build.SourcesDirectory)/build'

Output:
image

Are these builds working on local or other CI/CD? I have shared my pipeline/workflow above, is any of that helpful?

As I stated above, I have no access to the DevOps server or a Mac. I can only ask community to help here, sorry.

Azure DevOps Pipelines CI/CD

I'm trying some of this suggestions, I'll keep you informed
In first time I was trying to use iosCodesign to true with profile install before the build

The only way to solve this is using the xcode task too

1 - Install Apple Certificate
2 - Install an Apple provisioning profile
3 - Build with flutter and iosCodesign: false
4 - Generate ipa with xcode

My yaml:

- task: InstallAppleCertificate@2
  displayName: 'Install an Apple certificate'
  inputs:
    certSecureFile: iosbuild.p12
    setUpPartitionIdACLForPrivateKey: false

- task: InstallAppleProvisioningProfile@1
  displayName: 'Install an Apple provisioning profile'
  inputs:
    provProfileSecureFile: '${{parameters.profile}}.mobileprovision'

- task: Hey24sheep.flutter.flutter-build.FlutterBuild@0
  displayName: 'flutter build ios'
  inputs:
    target: 'ios'
    projectDirectory: '.'
    buildFlavour: '${{parameters.ambiente}}'
    iosCodesign: false
    exportOptionsPlist: 'ios/exportOptions.plist'
    extraArgs: '--release --obfuscate --split-debug-info=$(Build.SourcesDirectory)/build'

- task: Xcode@5
  displayName: 'Xcode Archive iOS'
  inputs:
    actions: 'archive'
    configuration: ${{parameters.config}}
    xcWorkspacePath: 'ios/Runner.xcworkspace'
    scheme: '${{parameters.ambiente}}'
    packageApp: true
    signingOption: 'manual'
    signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
    provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)'

APPLE_CERTIFICATE_SIGNING_IDENTITY and APPLE_CERTIFICATE_SIGNING_IDENTITY are auto generated by step 1 and 2.

@humanolaranja - Could you show us your ios/exportOptions.plist?

Thank you

@ElaineBSchwaner

<?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>uploadBitcode</key>
	<true/>
	<key>compileBitcode</key>
	<true/>
	<key>uploadSymbols</key>
	<true/>
    <key>stripSwiftSymbols</key>
    <true/>
    <key>teamID</key>
    <string>********</string>
    <key>method</key>
    <string>app-store</string>
    <key>signingStyle</key>
    <string>manual</string>
    <key>signingCertificate</key>
    <string>Apple Distribution: **** S.A. (********)</string>
    <key>provisioningProfiles</key>
    <dict>
        <key>com.****.dev</key>
        <string>Azure DEV</string>
        <key>com.****.qas</key>
        <string>Azure QA</string>
        <key>com.****</key>
        <string>Azure PROD</string>
    </dict>
</dict>
</plist>

Thank you @humanolaranja!

What is configuration: ${{parameters.config}} ?

@MiroLiebschner Hi, Miro. Could you fix it?
Thank you

Thank you @humanolaranja!

What is configuration: ${{parameters.config}} ?

The build configuration
image

Thank you @humanolaranja

For anyone still interested, I have another solution that may be better suited for some - it's certainly simpler and more robust for me.
The goal is to disable all signing other than what is defined in the "exportOptions.plist" file.

The key issue appears to be that the compile stage of the xcode task is code signing with what is configured in the pbxproj (even though "iosCodeSign=false") and that signature is then overwritten by the signing that occurs during the IPA export step. It means that you have to be careful to make sure that your xcode project is set up to work both on your dev machine, and during the various flavours of your CI builds (adhoc, appstore, etc) - threading the needle if you will.

So, all we need to do is disable the first codesign so that during CI, only the 'exportOptions.plist' file matters.
You can disable that by adding the following variables to your pipeline like this

  - job: iOSJob
    displayName: iOS
    variables:
      # FYI: Did you know, all Azure Pipeline variables are added to the build system environment?
      # The following variables will prevent Xcode from code-signing during build.
      # This is necessary, because we do not want to CI builds to be sensitive to code-signing settings configured by 
      # developers during development.
      # The 'exportOptions' will ultimately handle the code signing with the correct cert/prov profile.
      FLUTTER_XCODE_CODE_SIGN_IDENTITY: ""
      FLUTTER_XCODE_CODE_SIGNING_REQUIRED: NO 

Note:
Any variables prefixed with "FLUTTER_XCODE_" are picked up by the flutter build tool, and added to the xcodebuild command - after stripping the prefix of course.

The exportOptionsPlist: 'ios/exportOptions.plist' will still do the code signing that you have declared.

With this, I can have my "debug" xcode project use automatic signing to allow direct USB deployment and debugging on my device or simulator, but when built by CI, it will skip the code signing during compilation, and sign as per my exportOptions.plist - Ad-Hoc cert/prov-profile for my staging/QA builds, and AppStore cert/prov-profile for my finalised production builds.

It's also nice to know that I can mess about with my signing settings in the xcode project without having any effect on CI whatsoever.

@humanolaranja This worked for me as well. Thanks a bunch for sharing. This is very much appreciated.

I am assuming this issue is solved, I am closing this issue. Please, feel free to reopen in case it is not yet solved.