Azure
[ .NET MAUI ]
Repository Structure
The repository contains the files required to build and deliver your .NET MAUI application.
Project Files
- .NET MAUI Project (
*.csproj)
Defines the project configuration, dependencies, and target platforms.
Located at the root of the repository.
CI/CD Pipeline (Azure DevOps)
Azure Pipelines (linked below) automate the build and signing process for both Android and iOS.
The repository includes two dedicated workflow files:
-
Android Build Pipeline
azure-pipelines-android.yml– builds and signs the Android APK. -
iOS Build Pipeline
azure-pipelines-ios.yml– builds and signs the iOS IPA.
Workflow Triggers
These pipelines run automatically when one of the following events occurs:
- Pushes to
mainor active feature branches - Pull requests targeting branches
Customization
You can customize each workflow by adjusting environment variables and pipeline-level secrets within your Azure DevOps project settings.
This allows you to configure signing certificates, provisioning profiles, build modes, and deployment behavior to match your app’s requirements.
Prerequisites
Ensure your Azure DevOps project includes the pipeline file and required secure variables (such as keystore, passwords, or build configuration values) before running the workflow.
Workflow Variables
These values must be added in Azure's Repository Variables section to be used within the pipeline script.
Android
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
androidKeyAlias |
private key alias name | Appambit |
apkName |
Base name of the apk file (without .apk extension) | app_test |
typeRelease |
Release type (alpha, beta, release) |
alpha |
iOS
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
typeRelease |
Release type (alpha, beta, release) |
alpha |
projectPath |
Relative path to your iOS project's .csproj file |
AppMauiTestApp/AppMauiTestApp.csproj |
ipaName |
Base name of the IPA file (without .ipa extension) |
com_appambit_testapp_ios |
Repository variables
Step 1: Upload Secure Files
- Go to your repository in Azure DevOps
- Navigate to Pipelines > Library > Secure files
- Upload the required files:
- Android
- The .keystore file used for signing
- iOS
- The .p12 distribution certificate
- The .mobileprovision provisioning profile
- Android
Step 2: Create Variable Groups
Navigate to Pipelines > Library and define the required variable groups. Be sure to mark all sensitive entries with “Keep this value secret.”
Important
Ensure that all uploaded files have the proper permissions to be accessed during pipeline execution.
Secrets and variables
Android
| VARIABLE | DESCRIPTION |
|---|---|
| ANDROID_KEYSTORE_FILE | Exact name of the .keystore file uploaded in Secure Files |
| ANDROID_KEYSTORE_PASSWORD | Password for the keystore file |
| ANDROID_KEYSTORE_PASSWORD_ALIAS | Password of the alias inside the keystore |
| ANDROID_KEYSTORE_PASSWORD_GPG | Password used if the file was encrypted with GPG |
iOS
| SECRET | DESCRIPTION |
|---|---|
| IOS_APPLE_P12_PASSWORD | Password of the .p12 certificate used for signing |
| IOS_P12_CERTIFICATE | Exact name of the .p12 certificate file uploaded in Secure Files |
| IOS_PROVISIONING_PROFILE | Exact name of the .mobileprovision profile uploaded in Secure Files |
Info
If you're not sure about having this credentials you can go to generating variables
[ Android ]
Repository Structure
The repository contains the files necessary to build and deliver your Android application through Azure DevOps.
CI/CD Pipeline (Azure DevOps)
Azure Pipelines (linked below) automate the Android build and signing process:
- Android Build Pipeline
azure-devops-pipelines-testapp.yml– builds and signs the Android APK.
Workflow Triggers
This workflow runs automatically when the following events occur:
- Pushes to
mainor active feature branches - Pull requests targeting branches
Customization
You can customize the pipeline by modifying environment variables and secure pipeline secrets within your Azure DevOps project settings.
This allows you to configure signing keys, build variants, and deployment behavior according to your application's requirements.
Prerequisites
Ensure your Azure DevOps project includes the pipeline file and required secure variables (such as keystore, passwords, or build configuration values) before running the workflow.
Android gradle setup
In your Android application within the path app/build.gradle configure the release variables
signingConfigs {
+ create("release") {
+ storeFile = file("../<your-keystore-name>.keystore")
+ storePassword = System.getenv("SIGNING_STORE_PASSWORD")
+ keyAlias = System.getenv("SIGNING_KEY_ALIAS")
+ keyPassword = System.getenv("SIGNING_KEY_PASSWORD")
+ }
}
buildTypes {
release {
+ signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
Workflow Variables
These values must be added in Azure's Repository Variables section to be used within the pipeline script.
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
APK_NAME |
Base name used for the generated APK artifact. | app_appambit_testapp |
PACKAGE_NAME |
The Android package name (application ID) defined in the app’s manifest. | com.appambit.testapp |
DIRECTORY_NAME |
Gradle module name where the app is located, used in the build command. | appambit-testapp |
KEYSTORE_NAME |
Name of the keystore file used for signing the APK. | appambit.keystore |
RELEASE_TYPE |
Build type passed to Gradle for assembling the APK (Release or Debug). |
Release |
Repository variables
Step 1: Upload Secure Files
- Go to your repository in Azure DevOps
- Navigate to Pipelines > Library > Secure files
- Upload the required files:
- Android
- The .keystore file used for signing
- Android
Step 2: Create Variable Groups
Navigate to Pipelines > Library and define the required variable groups. Be sure to mark all sensitive entries with “Keep this value secret.”
Important
Ensure that all uploaded files have the proper permissions to be accessed during pipeline execution.
Secrets and variables
| SECRET | DESCRIPTION |
|---|---|
ANDROID_KEYSTORE_FILE |
Base64-encoded contents of the Android keystore file (.jks or .keystore). |
ANDROID_KEYSTORE_PASSWORD |
Password to unlock the keystore file. |
ANDROID_KEYSTORE_PASSWORD_ALIAS |
Password for the private key associated with the alias inside the keystore. |
ANDROID_KEYSTORE_PASSWORD_GPG |
Password used to decrypt the encrypted keystore file (if stored as .gpg). |
Info
If you're not sure about having this credentials you can go to generating variables
[ iOS ]
Repository Structure
The repository includes the necessary configuration to build and deliver your iOS application using Azure DevOps.
CI/CD Pipeline (Azure DevOps)
Azure Pipelines (linked below) automate the iOS build and signing process:
- iOS Build Pipeline
azure-devops-pipelines-testapp.yml– builds and signs the iOS IPA.
Workflow Triggers
This pipeline runs automatically when the following events occur:
- Pushes to
mainor active feature branches - Pull requests targeting branches
Customization
You can customize the workflow by modifying environment variables and secure pipeline secrets within your Azure DevOps project settings.
This allows you to configure signing identities, provisioning profiles, build configurations, and deployment logic to match your application’s needs.
Prerequisites
Ensure your Azure DevOps project includes the pipeline file and required secure variables (such as signing certificates, provisioning profiles, and build configuration values) before executing the workflow.
Workflow Variables
These values must be added in Azure's Repository Variables section to be used within the pipeline script.
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
sdkOption |
The SDK to be used by Xcode for building the app. | iphoneos |
configurationOption |
The build configuration for Xcode (Release or Debug). |
Release |
projectName |
Name of the Xcode project file (.xcodeproj) to build. | AppAmbitTestingApp.xcodeproj |
schemeName |
Xcode scheme that defines the build targets and settings. | AppAmbitTestingApp |
ArchivePath |
Path where the .xcarchive will be generated during the archive step. |
AppAmbitTestingApp.xcarchive |
ExportIpaPath |
Base name for the exported IPA file. | app_appambit_testapp |
IOS_INFO_PLIST |
Path to the export options plist used by xcodebuild -exportArchive. |
AppAmbit-Testing-App-Info.plist |
BUNDLE_IDENTIFIER |
iOS app bundle identifier, used in the plist and provisioning profile. | com.AppAmbit.TestApp |
XCODE_VERSION |
Version of Xcode to use in the pipeline. | Xcode_16.2 |
COMMAND_CONFIGURATION |
Combined Xcode command line options for build/archive commands | -sdk $(sdkOption) -configuration $(configurationOption) -project $(projectName) -scheme $(schemeName) |
ARTIFACT_NAME |
Name assigned to the published artifact in Azure DevOps. | alpha-ipa |
Repository variables
Step 1: Upload Secure Files
- Go to your repository in Azure DevOps
- Navigate to Pipelines > Library > Secure files
- Upload the required files:
- iOS
- The .p12 distribution certificate
- The .mobileprovision provisioning profile
- iOS
Step 2: Create Variable Groups
Navigate to Pipelines > Library and define the required variable groups. Be sure to mark all sensitive entries with “Keep this value secret.”
Important
Ensure that all uploaded files have the proper permissions to be accessed during pipeline execution.
Secrets and variables
| SECRET | DESCRIPTION |
|---|---|
IOS_P12_CERTIFICATE |
Apple signing certificate file (.p12) used for code signing. |
IOS_APPLE_P12_PASSWORD |
Password to unlock the .p12 certificate. |
IOS_SIGNING_IDENTITY |
Code signing identity (e.g., iPhone Distribution) used in Xcode builds. |
IOS_PROVISIONING_PROFILE_3 |
Secure provisioning profile file used for signing the app. |
IOS_ADHOC_PROFILE |
Name or UUID of the AdHoc provisioning profile used in export plist. |
IOS_APPLE_TEAM_ID |
Apple Developer Team ID for signing and provisioning. |
IOS_APPLE_PROFILE_3 |
Identifier of the provisioning profile used during build/archive commands. |
Info
If you're not sure about having this credentials you can go to generating variables
[ Flutter ]
Repository Structure
The repository includes the required configuration to build and deliver your Flutter application for both Android and iOS using Azure DevOps.
CI/CD Pipelines (Azure DevOps)
Azure Pipelines automate the build and signing process for both platforms:
-
Android Build Pipeline
azure-pipelines-android.yml– builds and signs the Android APK. -
iOS Build Pipeline
azure-pipelines-ios.yml– builds and signs the iOS IPA.
Workflow Triggers
These pipelines execute automatically when the following events occur:
- Pushes to
mainor active feature branches - Pull requests targeting branches
Customization
You can tailor the pipelines by modifying environment variables and secure pipeline secrets in your Azure DevOps project settings.
This allows you to configure signing identities, provisioning profiles, build modes, and deployment logic according to your application’s needs.
Prerequisites
Ensure your Azure DevOps project includes the required pipeline files and the necessary secure variables for signing and configuration before running the workflows.
Android gradle setup
In your Android application within the path app/build.gradle configure the release variables
+ val keystoreProperties = Properties()
+ val keystorePropertiesFile = rootProject.file("key.properties")
+ if (keystorePropertiesFile.exists()) {
+ keystoreProperties.load(FileInputStream(keystorePropertiesFile))
+ }
signingConfigs {
+ create("release") {
+ keyAlias = keystoreProperties["keyAlias"] as String
+ keyPassword = keystoreProperties["keyPassword"] as String
+ storeFile = keystoreProperties["storeFile"]?.let { file(it) }
+ storePassword = keystoreProperties["storePassword"] as String
+ }
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("debug")
+ signingConfig = signingConfigs.getByName("release")
}
}
Workflow Variables
These values must be added in Azure's Repository Variables section to be used within the pipeline script.
Android
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
APK_NAME |
Base name of the generated APK file (without .apk extension) |
app_appambit_testapp |
PROJECT_PATH |
Path to the Flutter test app project | appambit_sdk_flutter/appambit_test_app |
ARTIFACTS_DIR |
Directory where build artifacts will be stored | artifacts |
KEYSTORE_NAME |
Name of the keystore file used for Android signing | appambit.keystore |
iOS
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
IPA_NAME |
Base name of the generated IPA file (without .ipa) |
app_appambit_testapp |
ROOT_DIR |
Root directory of the Flutter SDK project | appambit_sdk_flutter |
BUNDLE_IDENTIFIER |
Unique iOS app bundle identifier | com.AppAmbit.TestApp |
IOS_INFO_PLIST |
Export options property list used for iOS builds | ExportOptions.plist |
TEST_PROJECT_NAME |
Test Example folder name | appambit_test_app |
Repository variables
Step 1: Upload Secure Files
- Go to your repository in Azure DevOps
- Navigate to Pipelines > Library > Secure files
- Upload the required files:
- Android
- The .keystore file used for signing
- iOS
- The .p12 distribution certificate
- The .mobileprovision provisioning profile
- Android
Step 2: Create Variable Groups
Navigate to Pipelines > Library and define the required variable groups. Be sure to mark all sensitive entries with “Keep this value secret.”
Important
Ensure that all uploaded files have the proper permissions to be accessed during pipeline execution.
Secrets and variables
Android
| VARIABLE | DESCRIPTION |
|---|---|
| ANDROID_KEYSTORE_PASSWORD | Password for the keystore file |
| KEY_PASSWORD | Password for the key alias inside the keystore |
| ANDROID_KEYSTORE_ALIAS. | Alias name of the key inside the keystore |
iOS
| SECRET | DESCRIPTION |
|---|---|
| IOS_P12_CERTIFICATE | Exact name of the .p12 certificate file uploaded in Secure Files |
| IOS_APPLE_P12_PASSWORD | Password of the .p12 certificate used for signing |
| IOS_PROVISIONING_PROFILE_3 | Exact name of the .mobileprovision profile uploaded in Secure Files |
| IOS_ADHOC_PROFILE | Ad hoc provisioning profile identifier used for distribution |
| IOS_APPLE_TEAM_ID | Apple Developer Team ID associated with the signing account |
Info
If you're not sure about having this credentials you can go to generating variables
[ React Native ]
Repository Structure
The repository includes the required configuration to build and deliver your React Native application for both Android and iOS using Azure DevOps.
CI/CD Pipelines (Azure DevOps)
Azure Pipelines automate the build and signing process for both platforms:
-
Android Build Pipeline
azure-pipelines-android.yml– builds and signs the Android APK. -
iOS Build Pipeline
azure-pipelines-ios.yml– builds and signs the iOS IPA.
Workflow Triggers
These pipelines execute automatically when the following events occur:
- Pushes to
mainor active feature branches - Pull requests targeting branches
Customization
You can tailor the pipelines by modifying environment variables and secure pipeline secrets in your Azure DevOps project settings.
This allows you to configure signing identities, provisioning profiles, build modes, and deployment logic according to your application’s needs.
Prerequisites
Ensure your Azure DevOps project includes the required pipeline files and the necessary secure variables for signing and configuration before running the workflows.
Android gradle setup
In your Android application within the path app/build.gradle configure the release variables
signingConfigs {
debug {
...
}
+ release {
+ storeFile file('../<your-keystore-name>.keystore')
+ storePassword System.getenv("SIGNING_STORE_PASSWORD")
+ keyAlias System.getenv("SIGNING_KEY_ALIAS")
+ keyPassword System.getenv("SIGNING_KEY_PASSWORD")
+ }
}
buildTypes {
...
release {
signingConfig signingConfigs.debug
+ signingConfig signingConfigs.release
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
Workflow Variables
These values must be added in Azure's Repository Variables section to be used within the pipeline script.
Android
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
APK_NAME |
Name of the generated APK artifact | app_appambit_testapp |
PROJECT_PATH |
Path to the React Native test app project | appambit_sdk_react_native/appambit_test_app |
ARTIFACTS_DIR |
Directory where build artifacts will be stored | artifacts |
KEYSTORE_NAME |
Keystore file name used for Android signing | appambit.keystore |
NODE_VERSION |
Node.js version used | 20 |
JAVA_VERSION |
Java version used | 17 |
ANDROID_SDK_VERSION |
Android SDK version used for the build | 34 |
BUILD_TOOLS_VERSION |
Android build-tools version | 34.0.0 |
ANDROID_NDK_VERSION |
Android NDK version used | 27.1.12297006 |
iOS
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
IPA_NAME |
Base name of the generated IPA artifact | app_appambit_testapp |
ROOT_DIR |
Root directory of the React Native SDK project | appambit_sdk_react_native |
BUNDLE_IDENTIFIER |
Unique iOS app bundle identifier | com.AppAmbit.TestApp |
IOS_INFO_PLIST |
Export options property list used for iOS builds | ExportOptions.plist |
TEST_PROJECT_NAME |
Test Example folder name | appambit_test_app |
CONFIGURATION |
Xcode build configuration | Release |
SDK |
Apple SDK used for building | iphoneos |
DESTINATION |
Xcode build destination | generic/platform=iOS |
ARCHIVE_PATH |
Path to the Xcode archive output | AppambitExample.xcarchive |
SCHEME |
Xcode scheme used for the build | AppambitExample |
WORKSPACE |
Xcode workspace file | AppambitExample.xcworkspace |
NODE_VERSION |
Node.js version used | 20 |
XCODE-VERSION |
Xcode version used for the build | Xcode_26.0.1 |
Repository variables
Step 1: Upload Secure Files
- Go to your repository in Azure DevOps
- Navigate to Pipelines > Library > Secure files
- Upload the required files:
- Android
- The .keystore file used for signing
- iOS
- The .p12 distribution certificate
- The .mobileprovision provisioning profile
- Android
Step 2: Create Variable Groups
Navigate to Pipelines > Library and define the required variable groups. Be sure to mark all sensitive entries with “Keep this value secret.”
Important
Ensure that all uploaded files have the proper permissions to be accessed during pipeline execution.
Secrets and variables
Android
| VARIABLE | DESCRIPTION |
|---|---|
| SIGNING_STORE_PASSWORD. | Password for the keystore file |
| SIGNING_KEY_PASSWORD | Password for the key alias inside the keystore |
| SIGNING_KEY_ALIAS. | Alias name of the key inside the keystore |
iOS
| SECRET | DESCRIPTION |
|---|---|
| IOS_P12_CERTIFICATE | Exact name of the .p12 certificate file uploaded in Secure Files |
| IOS_APPLE_P12_PASSWORD | Password of the .p12 certificate used for signing |
| IOS_PROVISIONING_PROFILE_3 | Exact name of the .mobileprovision profile uploaded in Secure Files |
| IOS_ADHOC_PROFILE | Ad hoc provisioning profile identifier used for distribution |
| IOS_APPLE_TEAM_ID | Apple Developer Team ID associated with the signing account |
Info
If you're not sure about having this credentials you can go to generating variables
Workflow activation
This pipeline activates automatically on pushes to the develop branch.
To activate:
- Go to the pipelines section
- Select Azure Git repos
- Select your repository
- Select an existing Azure pipelines YAML file
- Select the branch where the YAML file is located
- Select the path to the YAML file (which is in the repository root)
- Select cotinue
- Click on Run
Where to find the generated APK and iOS
- In Azure Devops, after running the pipeline, go to the corresponding run.
- In the Artifacts section, download the APK or IPA.
Delivering Builds with Push to AppAmbit
Once your CI/CD pipeline is configured, you’re ready to deliver builds to testers or users. Next Step: Push to AppAmbit to distribute your app directly from your CI pipeline.
Once your build setup is complete and you've pushed to AppAmbit, you can view and manage your releases directly from the dashboard.
AppAmbit website Dashboard > Releases tab