Tutorial: Build Android apps with GitLab Mobile DevOps
In this tutorial, you’ll create a pipeline by using GitLab CI/CD that builds your Android mobile app, signs it with your credentials, and distributes it to app stores.
To set up mobile DevOps:
- Set up your build environment
- Configure code signing with fastlane and Gradle
- Set up Android apps distribution with Google Play integration and fastlane
Before you begin
Before you start this tutorial, make sure you have:
- A GitLab account with access to CI/CD pipelines
- Your mobile app code in a GitLab repository
- A Google Play developer account
fastlane
installed locally
Set up your build environment
Use GitLab-hosted runners, or set up self-managed runners for complete control over the build environment.
Android builds use Docker images, offering multiple Android API versions.
Create a
.gitlab-ci.yml
file in your repository root.Add a Docker image from Fabernovel:
test: image: fabernovel/android:api-33-v1.7.0 stage: test script: - fastlane test
Configure code signing with fastlane and Gradle
To set up code signing for Android:
Create a keystore:
Run the following command to generate a keystore file:
keytool -genkey -v -keystore release-keystore.jks -storepass password -alias release -keypass password \ -keyalg RSA -keysize 2048 -validity 10000
Put the keystore configuration in the
release-keystore.properties
file:storeFile=.secure_files/release-keystore.jks keyAlias=release keyPassword=password storePassword=password
Upload both files as Secure Files in your project settings.
Add both files to your
.gitignore
file so they aren’t committed to version control.
Configure Gradle to use the newly created keystore. In the app’s
build.gradle
file:Immediately after the plugins section, add:
def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('.secure_files/release-keystore.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) }
Anywhere in the
android
block, add:signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] } }
Add the
signingConfig
to the release build type:signingConfig signingConfigs.release
The following are sample fastlane/Fastfile
and .gitlab-ci.yml
files with this configuration:
fastlane/Fastfile
:default_platform(:android) platform :android do desc "Create and sign a new build" lane :build do gradle(tasks: ["clean", "assembleRelease", "bundleRelease"]) end end
.gitlab-ci.yml
:build: image: fabernovel/android:api-33-v1.7.0 stage: build script: - apt update -y && apt install -y curl - curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | bash - fastlane build
Set up Android apps distribution with Google Play integration and fastlane
Signed builds can be uploaded to the Google Play Store by using the Mobile DevOps Distribution integrations.
- Create a Google service account in Google Cloud Platform and grant that account access to the project in Google Play.
- Enable the Google Play integration:
- On the left sidebar, select Search or go to and find your project.
- Select Settings > Integrations.
- Select Google Play.
- Under Enable integration, select the Active checkbox.
- In Package name, enter the package name of the app. For example,
com.gitlab.app_name
. - In Service account key (.JSON) drag or upload your key file.
- Select Save changes.
- Add the release step to your pipeline.
The following is a sample fastlane/Fastfile
:
default_platform(:android)
platform :android do
desc "Submit a new Beta build to the Google Play store"
lane :beta do
upload_to_play_store(
track: 'internal',
aab: 'app/build/outputs/bundle/release/app-release.aab',
release_status: 'draft'
)
end
end
The following is a sample .gitlab-ci.yml
:
beta:
image: fabernovel/android:api-33-v1.7.0
stage: beta
script:
- fastlane beta
For an overview, see Google Play integration demo.
Congratulations! Your app is now set up for automated building, signing, and distribution. Try creating a merge request to trigger your first pipeline.
Related topics
See the Mobile DevOps Android Demo project for a complete build, sign, and release pipeline example for Android.
For additional reference materials, see the DevOps section of the GitLab blog.
Docs
Edit this page to fix an error or add an improvement in a merge request.
Create an issue to suggest an improvement to this page.
Product
Create an issue if there's something you don't like about this feature.
Propose functionality by submitting a feature request.
Feature availability and product trials
View pricing to see all GitLab tiers and features, or to upgrade.
Try GitLab for free with access to all features for 30 days.
Get help
If you didn't find what you were looking for, search the docs.
If you want help with something specific and could use community support, post on the GitLab forum.
For problems setting up or using this feature (depending on your GitLab subscription).
Request support