GitHub
[ .NET MAUI ]
Workflow & Project Structure
The repository includes the essential files required to build and deliver your .NET MAUI application for Android and iOS.
CI/CD Workflows (.github/workflows/)
GitHub Actions workflows (linked below) automate the build process for both platforms:
-
Android Build Workflow
build-apk.yml– builds and signs the Android APK. -
iOS Build Workflow
build-ipa.yml– builds and signs the iOS IPA.
Workflow Triggers
These workflows run automatically on:
- Pushes to
mainor feature branches - Pull requests targeting branches
Customization
You can tailor the CI/CD behavior by modifying environment variables and secrets in the repository settings.
This allows you to configure signing credentials, build parameters, and deployment targets as needed.
Workflow Variables
Android
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
TYPE_RELEASE |
Release type (alpha, beta, release) |
alpha |
BUILD_CONFIGURATION |
Build Configuration (Debug, Release) |
Release |
BUILD_FRAMEWORK |
Target Framework for Android | net8.0-android |
APK_NAME |
APK base name (without extension) | com_appambit_testapp |
PROJECT_DIR |
MAUI Project Route | ./AppAmbitTestingApp |
KEYSTORE_ASC |
Name of the GPG encrypted keystore file | appambit.keystore.asc |
KEYSTORE_FILE |
File generated by decrypting the previous one | appambit.keystore |
iOS
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
TYPE_RELEASE |
Release type (alpha, beta, release) |
alpha |
PROJECT_PATH |
Relative path to your iOS project's .csproj file |
AppMauiTestApp/AppMauiTestApp.csproj |
IPA_NAME |
Base name of the IPA file (without .ipa extension) |
ipa_name_ios |
Repository Secrets
These secrets are configured on GitHub:
- Go to the repository on GitHub
- Go to Settings > Secrets > Actions
- Click New repository secret
Secrets and variables
Android
| SECRET | DESCRIPTION |
|---|---|
| ANDROID_KEYSTORE_FILE | Full contents of the encrypted .asc file (copied as plain text) |
| ANDROID_KEYSTORE_PASSWORD | Keystore password |
| ANDROID_KEYSTORE_PASSWORD_ALIAS | Password of the alias within the keystore |
| ANDROID_KEYSTORE_PASSWORD_GPG | Password used to decrypt the .asc file |
iOS
| SECRET | DESCRIPTION |
|---|---|
| IOS_APPLE_P12_PASSWORD | Password of the .p12 certificate used for signing |
| IOS_P12_CERTIFICATE_BASE64 | Base64-encoded .p12 distribution certificate |
| IOS_PROVISIONING_PROFILE_BASE64 | Provisioning profile in Base64 format |
Secrets
If you're not sure about having this credentials you can go to generating variables
[ Android ]
Workflow & Project Structure
The repository includes the essential files required to build and deliver your Android application.
Project Files
- Android Project (
build.gradle.kts)
Defines the project configuration, dependencies, and build settings.
Located at the root of the repository.
CI/CD Workflows (.github/workflows/)
GitHub Actions workflows (linked below) automate the Android build process:
- Android Build Workflow
build-apk.yml– builds and signs the Android APK.
Workflow Triggers
These workflows run automatically on:
- Pushes to
mainor feature branches - Pull requests targeting branches
Customization
You can tailor the CI/CD behavior by modifying environment variables and secrets in the repository settings.
This allows you to adjust signing credentials, build settings, and deployment targets to fit your app’s requirements.
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
| VARIABLE | DESCRIPTION | EXAMPLE / VALUE |
|---|---|---|
PACKAGE_NAME |
Package name of the app | appambit-testapp |
APK_NAME |
APK base name (without extension) | com_appambit_testapp |
SIGNING_KEY_STORE_PATH |
Path to the keystore file | keyname.keystore |
SIGNING_KEY_ALIAS |
Keystore alias | CompanyName |
SIGNING_KEY_PASSWORD |
Password for the keystore alias | SomePassword123 |
SIGNING_STORE_PASSWORD |
Password for the keystore file | SomeDifferentPassword123 |
ENCODED_STRING |
Base64 encoded keystore | <YOUR-BASE64-STRING> |
Variables
Put your variables secure using secrets, don't put this variables in plain text
Repository Secrets
These secrets are configured on GitHub:
- Go to the repository on GitHub
- Go to Settings > Secrets > Actions
- Click New repository secret
Secrets and variables
| SECRET | DESCRIPTION |
|---|---|
SIGNING_KEY_STORE_PATH |
Path where your .keystore file is saved |
SIGNING_KEY_ALIAS |
Keystore alias when you created the .keystore |
SIGNING_STORE_PASSWORD |
Password of the alias within the keystore |
SIGNING_KEY_PASSWORD |
Password of your .keystore |
SIGNING_KEY_STORE_BASE64 |
Keystore base64 string to generate .keystore file |
Secrets
If you're not sure about having this credentials you can go to generating variables
[ iOS ]
Workflow & Project Structure
The repository includes the essential files required to build and deliver your iOS application.
Project Files
- iOS Project (
*.xcodeproj)
Defines the project configuration, dependencies, and build settings.
Located at the root of the repository.
CI/CD Workflows (.github/workflows/)
GitHub Actions workflows (linked below) automate the iOS build process:
- iOS Build Workflow
build-ipa.yml– builds and signs the iOS IPA.
Workflow Triggers
These workflows run automatically on:
- Pushes to
mainor feature branches - Pull requests targeting branches
Customization
You can tailor the CI/CD behavior by modifying environment variables and secrets in the repository settings.
This allows you to configure signing credentials, build options, and deployment targets according to your app’s needs.
Workflow Variables
| VARIABLE | DESCRIPTION | EXAMPLE / VALUE |
|---|---|---|
BUNDLE_IDENTIFIER |
iOS bundle identifier | com.AppAmbit.TestApp |
IPA_NAME |
IPA base name (without extension) | app_appambit_testapp |
CONFIGURATION |
Build configuration (Debug / Release) |
Release |
SDK |
Target SDK for build | iphoneos |
DESTINATION |
Xcode destination | generic/platform=iOS |
XCODE_VERSION |
Version of Xcode to use | 16.2 |
SCHEME |
Xcode scheme name | AppAmbitTestingApp |
IOS_INFO_PLIST |
Path to Info.plist file | AppAmbit-Testing-App-Info-plist |
ARCHIVE_PATH |
Path to the generated xcarchive | AppAmbitTestingApp.xcarchive |
Repository Secrets
These secrets are configured on GitHub:
- Go to the repository on GitHub
- Go to Settings > Secrets > Actions
- Click New repository secret
Secrets and variables
| SECRET | DESCRIPTION |
|---|---|
IOS_P12_CERTIFICATE_BASE64 |
Base64 string of your exported .p12 certificate |
IOS_APPLE_P12_PASSWORD |
Password for your .p12 certificate |
IOS_PROVISIONING_PROFILE_BASE64 |
Base64 string of your provisioning profile |
IOS_ADHOC_PROFILE |
Name of the Ad Hoc provisioning profile |
IOS_APPLE_TEAM_ID |
Your Apple Developer Team ID |
Secrets
If you're not sure about having this credentials you can go to generating variables
[ Flutter ]
Workflow & Project Structure
The repository includes the essential files required to build and deliver your Flutter application for both Android and iOS.
Project Files
- Flutter Project (
pubspec.yml)
Defines the project configuration, dependencies, and supported platforms.
Located at the root of the repository.
CI/CD Workflows (.github/workflows/)
GitHub Actions workflows automate the build process for both platforms:
-
Android Build Workflow
build-apk.yml– builds and signs the Android APK. -
iOS Build Workflow
build-ipa.yml– builds and signs the iOS IPA.
Workflow Triggers
These workflows run automatically on:
- Pushes to
mainor feature branches - Pull requests targeting branches
Customization
You can tailor the CI/CD behavior by modifying environment variables and secrets in the repository settings.
This allows you to configure signing credentials, build configurations, and deployment targets according to your project’s needs.
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
Android
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
KEYSTORE_FILE_NAME |
Keystore file name used for signing the Android build | appambit.keystore |
ARTIFACT_NAME |
Artifact or package name for the build output | app_appambit_testapp |
APK_PATH |
Full path to the generated APK file | appambit_sdk_flutter/appambit_test_app/build/app/outputs/flutter-apk/app-release.apk |
ROOT_DIR |
Root directory of the Flutter SDK project | appambit_sdk_flutter |
TEST_PROJECT_NAME |
Test Example folder name | appambit_test_app |
FLUTTER_VERSION |
Is you actual version for flutter | '3.35.4' |
iOS
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
IOS_INFO_PLIST |
Export options property list used for iOS builds | ExportOptions.plist |
BUNDLE_IDENTIFIER |
Unique iOS app bundle identifier | com.AppAmbit.TestApp |
ARTIFACT_NAME |
Artifact or package name for the generated IPA file | appambit-test-app-release-ipa |
IPA_NAME |
Base name of the IPA file (without .ipa extension) |
app_appambit_testapp |
ROOT_DIR |
Root directory of the Flutter SDK project | appambit_sdk_flutter |
TEST_PROJECT_NAME |
Test Example folder name | appambit_test_app |
FLUTTER_VERSION |
Is you actual version for flutter | '3.35.4' |
Repository Secrets
These secrets are configured on GitHub:
- Go to the repository on GitHub
- Go to Settings > Secrets > Actions
- Click New repository secret
Secrets and variables
Android
| SECRET | DESCRIPTION |
|---|---|
| KEYSTORE_BASE64 | Base64-encoded contents of the Android keystore file |
| KEYSTORE_PASSWORD | Password of the keystore used for signing |
| KEY_ALIAS | Alias name of the key inside the keystore |
| KEY_PASSWORD | Password for the key alias inside the keystore |
iOS
| SECRET | DESCRIPTION |
|---|---|
| IOS_ADHOC_PROFILE | Ad hoc provisioning profile identifier used for distribution |
| IOS_APPLE_P12_PASSWORD | Password of the .p12 certificate used for signing |
| IOS_APPLE_TEAM_ID | Apple Developer Team ID associated with the signing account |
| IOS_KEYCHAIN_PASSWORD | Password used to create or unlock the temporary keychain |
| IOS_P12_CERTIFICATE_BASE64 | Base64-encoded .p12 distribution certificate |
| IOS_PROVISIONING_PROFILE_BASE64. | Base64-encoded iOS provisioning profile file |
Secrets
If you're not sure about having this credentials you can go to generating variables
Running the workflow for the first times
- Verify that the workflow file exists in the repository and is committed to the default branch (e.g., develop or main).
- Open GitHub repository and go to: -> Actions tab.
- Select the workflow named Build Apk or Build IPA.
- Click the
Run workflowbutton to run it manually for the first time. - After this, each run will generate an artifact with the signed APK or IPA and you can download it from summary.
Where to find the generated APK or IPA
- In GitHub Actions, after running the workflow, 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
[ React Native ]
Workflow & Project Structure
The repository includes the essential files required to build and deliver your React Native application for both Android and iOS.
Project Files
- React Native Project (
package.json)
Defines the project configuration, dependencies, and supported platforms.
Located at the root of the repository.
CI/CD Workflows (.github/workflows/)
GitHub Actions workflows automate the build process for both platforms:
-
Android Build Workflow
build-apk.yml– builds and signs the Android APK. -
iOS Build Workflow
build-ipa.yml– builds and signs the iOS IPA.
Workflow Triggers
These workflows run automatically on:
- Pushes to
mainor feature branches - Pull requests targeting branches
Customization
You can tailor the CI/CD behavior by modifying environment variables and secrets in the repository settings.
This allows you to configure signing credentials, build configurations, and deployment targets according to your project’s needs.
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
Android
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
KEYSTORE_FILE_NAME |
Keystore file name used for signing the Android build | appambit.keystore |
ARTIFACT_NAME |
Artifact or package name for the build output | app_appambit_testapp |
APK_PATH |
Full path to the generated APK file | appambit_sdk_react_native/appambit_test_app/android/app/build/outputs/apk/release/app-release.apk |
ROOT_DIR |
Root directory of the SDK project | appambit_sdk_react_native |
TEST_PROJECT_NAME |
Test Example folder name | appambit_test_app |
NODE_VERSION |
Node.js version used | '20' |
iOS
| VARIABLE | DESCRIPTION | EXAMPLE |
|---|---|---|
IOS_INFO_PLIST |
Export options property list used for iOS builds | AppAmbit-Testing-App-Info-plist |
BUNDLE_IDENTIFIER |
Unique iOS app bundle identifier | com.AppAmbit.TestApp |
ARTIFACT_NAME |
Artifact or package name for the generated IPA file | app_appambit_testapp |
IPA_NAME |
Base name of the IPA file (without .ipa extension) |
app_appambit_testapp |
ROOT_DIR |
Root directory of the React Native SDK project | appambit_sdk_react_native |
TEST_PROJECT_NAME |
Test Example folder name | appambit_test_app |
NODE_VERSION |
Node.js version used | '20' |
XCODE_VERSION |
Xcode version used for building the project | 26.0.1 |
Repository Secrets
These secrets are configured on GitHub:
- Go to the repository on GitHub
- Go to Settings > Secrets > Actions
- Click New repository secret
Secrets and variables
Android
| SECRET | DESCRIPTION |
|---|---|
| KEYSTORE_BASE64 | Base64-encoded contents of the Android keystore file |
| KEYSTORE_PASSWORD | Password of the keystore used for signing |
| KEY_ALIAS | Alias name of the key inside the keystore |
| KEY_PASSWORD | Password for the key alias inside the keystore |
iOS
| SECRET | DESCRIPTION |
|---|---|
| IOS_ADHOC_PROFILE | Ad hoc provisioning profile identifier used for distribution |
| IOS_APPLE_P12_PASSWORD | Password of the .p12 certificate used for signing |
| IOS_APPLE_TEAM_ID | Apple Developer Team ID associated with the signing account |
| IOS_P12_CERTIFICATE_BASE64 | Base64-encoded .p12 distribution certificate |
| IOS_PROVISIONING_PROFILE_BASE64. | Base64-encoded iOS provisioning profile file |
Secrets
If you're not sure about having this credentials you can go to generating variables
Running the workflow for the first times
- Verify that the workflow file exists in the repository and is committed to the default branch (e.g., develop or main).
- Open GitHub repository and go to: -> Actions tab.
- Select the workflow named Build Apk or Build IPA.
- Click the
Run workflowbutton to run it manually for the first time. - After this, each run will generate an artifact with the signed APK or IPA and you can download it from summary.
Where to find the generated APK or IPA
- In GitHub Actions, after running the workflow, 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