My last post was a bit of a long one as it covered a bunch of steps for setting up the bits and pieces required for signing an application for different platforms. In this post I just wanted to provide a complete example that shows a single multi-stage (6 in total) Azure Pipelines pipeline for building a Uno application for iOS, Android and Windows (UWP) and releasing them to App Center.
Secure Files
In my last post I showed how to create and populate Secure Files in Azure Pipelines. Any certificate or provisioning profile you need to use in your pipeline should be added to the Secure Files section of the Library in Azure Pipeline. My list of Secure Files looks like this:
Here we can see that we have the signing certificates for iOS and Windows, and the keystore for Android. Then we have two iOS provisioning profiles, one for my XF application and the other for my Uno application.
Variable Groups
I’ve extracted most of the variables I use in my pipeline into one of two variable groups:
The Common Build Variables are those variables that can be reused across multiple projects.
The Inspector Uno Build Variables are those variables that are specific to this project. For example it includes the AppCenter ids for the iOS, Android and Windows applications. It also includes the iOS provisioning profile which is specifically tied to this application.
Pipeline
Here’s the entire pipeline:
resources:
repositories:
- repository: builttoroam_templates
type: github
name: builttoroam/pipeline_templates
ref: refs/tags/v0.5.0
endpoint: github_connection
variables:
- group: 'Common Build Variables'
- group: 'Inspector Uno Build Variables'
- name: ios_enabled
value: 'true'
- name: windows_enabled
value: 'true'
- name: android_enabled
value: 'true'
stages:
- template: azure/mobile/build-xamarin-android.yml@builttoroam_templates
parameters:
# Stage name and whether it's enabled
stage_name: 'Build_Android'
build_android_enabled: $(android_enabled)
# Version information
full_version_number: '$(version_prefix).$(Build.BuildId)'
# Signing information
secure_file_keystore_filename: '$(android_keystore_filename)'
keystore_alias: '$(android_keystore_alias)'
keystore_password: '$(android_keystore_password)'
# Solution to build
solution_filename: $(solution_file)
solution_build_configuration: $(solution_build_config)
# Output information
artifact_folder: $(artifact_android_folder)
application_package: $(android_application_package)
- template: azure/mobile/deploy-appcenter.yml@builttoroam_templates
parameters:
# Stage name and dependencies
stage_name: 'Deploy_Android'
depends_on: 'Build_Android'
deploy_appcenter_enabled: $(android_enabled)
environment_name: $(appcenter_environment)
# Build artifacts
artifact_folder: $(artifact_android_folder)
application_package: $(android_application_package)
# Signing information (for Android repack to APK)
secure_file_keystore_filename: '$(android_keystore_filename)'
keystore_alias: '$(android_keystore_alias)'
keystore_password: '$(android_keystore_password)'
# Deployment to AppCenter
appcenter_service_connection: $(appcenter_service_connection)
appcenter_organisation: $(appcenter_organisation)
appcenter_applicationid: $(appcenter_android_appid)
- template: azure/mobile/build-xamarin-windows.yml@builttoroam_templates
parameters:
# Stage name and whether it's enabled
stage_name: 'Build_Windows'
build_windows_enabled: $(windows_enabled)
# Version information
full_version_number: '$(version_prefix).$(Build.BuildId)'
# Signing information
windows_cert_securefiles_filename: '$(windows_signing_certificate_securefiles_filename)'
windows_cert_password: '$(windows_signing_certificate_password)'
# Solution to build
solution_filename: $(solution_file)
solution_build_configuration: $(solution_build_config)
# Output information
artifact_folder: $(artifact_windows_folder)
application_package: $(windows_application_package)
- template: azure/mobile/deploy-appcenter.yml@builttoroam_templates
parameters:
# Stage name and dependencies
stage_name: 'Deploy_Windows'
depends_on: 'Build_Windows'
deploy_appcenter_enabled: $(windows_enabled)
environment_name: $(appcenter_environment)
# Build artifacts
artifact_folder: $(artifact_windows_folder)
application_package: $(windows_application_package)
# Deployment to AppCenter
appcenter_service_connection: $(appcenter_service_connection)
appcenter_organisation: $(appcenter_organisation)
appcenter_applicationid: $(appcenter_windows_appid)
- template: azure/mobile/build-xamarin-ios.yml@builttoroam_templates
parameters:
# Stage name and whether it's enabled
stage_name: 'Build_iOS'
build_ios_enabled: $(ios_enabled)
# Version information
full_version_number: '$(version_prefix).$(Build.BuildId)'
# Solution to build
solution_filename: $(solution_file)
solution_build_configuration: $(solution_build_config)
# Signing information
ios_plist_filename: 'src/Apps/DotNet/Uno/InspectorUno/InspectorUno/InspectorUno.iOS/Info.plist'
ios_cert_password: '$(ios_signing_certificate_password)'
ios_cert_securefiles_filename: '$(ios_signing_certificate_securefiles_filename)'
ios_provisioning_profile_securefiles_filename: '$(ios_provisioning_profile_securefiles_filename)'
# Output information
artifact_folder: $(artifact_ios_folder)
application_package: $(ios_application_package)
- template: azure/mobile/deploy-appcenter.yml@builttoroam_templates
parameters:
# Stage name and dependencies
stage_name: 'Deploy_iOS'
depends_on: 'Build_iOS'
deploy_appcenter_enabled: $(ios_enabled)
environment_name: $(appcenter_environment)
# Build artifacts
artifact_folder: $(artifact_ios_folder)
application_package: $(ios_application_package)
# Deployment to AppCenter
appcenter_service_connection: $(appcenter_service_connection)
appcenter_organisation: $(appcenter_organisation)
appcenter_applicationid: $(appcenter_ios_appid)
Pipeline Templates v0.5.0
Most of the v0.5.0 release has been tidying things up, reducing the number of required parameters by making the template smarter and increasing consistency across the templates
Breaking Changes:
- build-xamarin-android.yml – changed build_platform to solution_target_platform parameter
- build-xamarin-windows.yml – changed build_platform to solution_target_platform parameter
- build-xamarin-windows.yml – changed windows_appxupload_name parameter to windows_upload_name to reflect support for msix
Other Changes:
- build-xamarin-[iOS/android/windows].yml – added depends_on parameter so that the stages can be ordered
- build-xamarin-[iOS/android/windows].yml – artifact_name, artifact_folder and application_package are no longer required and have default values
- build-xamarin-android.yml – supports building either aab or apk based on the application_package parameter
- build-xamarin-windows.yml – windows_upload_name parameter isn’t required as it has a default value based on the bundle name
- deploy-appcenter.yml – added conditions to all steps so that pipeline doesn’t break if build stage doesn’t generate any output
- All template – documentation added to parameters and steps
Hi Nick
Thanks for these. I’ve had to take a local copy of the templates because we have nuget packages in a private store, could you parameterise nuget-install-and-restore to allow a vstsFeed id to be passed to it?
Also, I’m a fool, and it took me a while to realise your scripts have a dependency on having the Magic Chunks and Mobile App Tasks installed in the devops organisation.
Cheers
Ed
Ed – help yourself. At some point I’ll probably remove the dependency on Magic Chunks to make it easier to install into private devops orgs but for now it’s a needed dependency.
I also meant to say – feel free to raise an issue on the github repo and even submit a PR with the change 🙂