- Android PWA/WASM launcher with glassmorphism UI - Loads https://admin.dark.side directly on launch - Complete GitLab CI/CD pipeline configuration - Automated builds for Debug, Release, and AAB - Full WASM support with optimized WebView - Material Design 3 theme - Comprehensive documentation Features: - Auto-load target URL on app launch - Glassmorphism components (frosted glass effects) - Full PWA/WASM support - Room database for future extensions - Jetpack Compose UI - CI/CD with artifact storage Built for SilverLABS
10 KiB
GitLab CI/CD Setup for SilverDROID
Complete guide for setting up automated Android builds on your GitLab CE instance.
🎯 Overview
This CI/CD pipeline automatically:
- ✅ Builds Debug and Release APKs
- ✅ Runs lint checks and unit tests
- ✅ Generates Android App Bundles (AAB)
- ✅ Stores build artifacts
- ✅ Creates deployment environments
- ✅ Sends build notifications
📋 Prerequisites
1. GitLab CE Instance
URL: https://gitlab.silverlabs.uk
Access Token: glpat-wqUcD7mg53F1mgM-N-PdiW86MQp1OjEH.01.0w074ox93
2. GitLab Runner
You need at least one GitLab Runner configured with:
- Docker executor
- Sufficient resources (4GB RAM, 20GB disk)
🚀 Quick Setup
Step 1: Initialize Git Repository
cd /mnt/c/Production/Source/SilverLABS/SilverDROID
# Initialize git (if not already)
git init
# Add remote
git remote add origin https://gitlab.silverlabs.uk/SilverLABS/silverdroid.git
# Add all files
git add .
# Commit
git commit -m "Initial commit - SilverDROID Dark Side Admin"
# Push to GitLab
git push -u origin main
Step 2: Create GitLab Project
Via GitLab Web UI:
- Go to https://gitlab.silverlabs.uk
- Click "New Project"
- Choose "Create blank project"
- Project name:
silverdroid - Namespace:
SilverLABS - Visibility:
Private - Click "Create project"
Or via API:
curl --request POST "https://gitlab.silverlabs.uk/api/v4/projects" \
--header "PRIVATE-TOKEN: glpat-wqUcD7mg53F1mgM-N-PdiW86MQp1OjEH.01.0w074ox93" \
--header "Content-Type: application/json" \
--data '{
"name": "SilverDROID",
"path": "silverdroid",
"namespace_id": <SilverLABS_group_id>,
"visibility": "private",
"description": "Android PWA/WASM Launcher - Dark Side Admin"
}'
Step 3: Configure GitLab Runner
Check existing runners:
# On your GitLab server
gitlab-runner list
Register a new runner (if needed):
gitlab-runner register \
--url https://gitlab.silverlabs.uk \
--registration-token <PROJECT_REGISTRATION_TOKEN> \
--executor docker \
--docker-image mingc/android-build-box:latest \
--description "Android Build Runner" \
--tag-list "android,docker" \
--docker-privileged=false \
--docker-volumes "/cache"
🏗️ Pipeline Architecture
Stages
stages:
- prepare # Download dependencies
- test # Lint, unit tests, security scan
- build # Build APKs and AAB
- deploy # Deploy artifacts, notifications
Jobs Overview
| Job | Stage | Trigger | Output |
|---|---|---|---|
prepare:dependencies |
prepare | All branches | Cached Gradle deps |
lint |
test | All branches | Lint reports |
unit_tests |
test | All branches | Test results |
security:scan |
test | main/develop | Security report |
build:debug |
build | All branches | app-debug.apk |
build:release |
build | main/tags | app-release.apk |
build:bundle |
build | main/tags | app-release.aab |
deploy:staging |
deploy | develop | Staging deployment |
deploy:production |
deploy | tags | Production (manual) |
apk:info |
deploy | main/develop | Build metadata |
notify:* |
deploy | main | Notifications |
🔧 Configuration
Pipeline Variables
Set these in GitLab: Settings → CI/CD → Variables
Required Variables
None! Pipeline works out of the box.
Optional Variables (for signed APKs)
KEYSTORE_FILE # Base64 encoded keystore
KEYSTORE_PASSWORD # Keystore password
KEY_ALIAS # Key alias
KEY_PASSWORD # Key password
Branches Strategy
main- Production builds (Release APK)develop- Staging builds (Debug APK)feature/*- Feature branches (Debug APK only)tags- Release tags (Signed Release + AAB)
📦 Build Artifacts
Artifact Storage
All artifacts are stored in GitLab and accessible via:
Project → CI/CD → Pipelines → [Pipeline] → Jobs → [Job] → Browse
Download URLs
Debug APK:
https://gitlab.silverlabs.uk/SilverLABS/silverdroid/-/jobs/artifacts/main/raw/app/build/outputs/apk/debug/app-debug.apk?job=build:debug
Release APK:
https://gitlab.silverlabs.uk/SilverLABS/silverdroid/-/jobs/artifacts/main/raw/app/build/outputs/apk/release/app-release-unsigned.apk?job=build:release
Retention
- Debug APKs: 30 days
- Release APKs: 90 days
- Test reports: 7 days
- AAB bundles: 90 days
🎨 Pipeline Badges
Add to your README.md:
[](https://gitlab.silverlabs.uk/SilverLABS/silverdroid/-/commits/main)
[](https://gitlab.silverlabs.uk/SilverLABS/silverdroid/-/commits/main)
🔐 Signing Release APKs
Step 1: Create Keystore
keytool -genkey -v -keystore silverdroid.keystore \
-alias silverdroid -keyalg RSA -keysize 2048 -validity 10000
Step 2: Encode Keystore
base64 -w 0 silverdroid.keystore > keystore.base64
Step 3: Add to GitLab Variables
- Go to Settings → CI/CD → Variables
- Add these variables (all marked as "Protected" and "Masked"):
KEYSTORE_FILE = <contents of keystore.base64>
KEYSTORE_PASSWORD = <your keystore password>
KEY_ALIAS = silverdroid
KEY_PASSWORD = <your key password>
Step 4: Update .gitlab-ci.yml
Add signing configuration to build:release:
build:release:
stage: build
before_script:
- echo $KEYSTORE_FILE | base64 -d > silverdroid.keystore
- export KEYSTORE_FILE=silverdroid.keystore
script:
- ./gradlew assembleRelease \
-Pandroid.injected.signing.store.file=$KEYSTORE_FILE \
-Pandroid.injected.signing.store.password=$KEYSTORE_PASSWORD \
-Pandroid.injected.signing.key.alias=$KEY_ALIAS \
-Pandroid.injected.signing.key.password=$KEY_PASSWORD
after_script:
- rm -f silverdroid.keystore
🔄 TeamCity Integration
Trigger TeamCity builds from GitLab:
Add to .gitlab-ci.yml:
trigger:teamcity:
stage: deploy
script:
- |
curl -X POST "https://cis1.silverlabs.uk/app/rest/buildQueue" \
-H "Authorization: Bearer eyJ0eXAiOiAiVENWMiJ9.eWxqS3hnMTNlS0Ezb0hMX0tuSHhkUDJ2eFUw.Y2M1NzRiMzQtNTE2Yy00MjMyLWE5MmEtZTg5OGVjYWNiMjc1" \
-H "Content-Type: application/xml" \
-d "<build><buildType id='SilverDROID_Build'/></build>"
only:
- main
📊 Monitoring
Pipeline Status
View pipeline status:
https://gitlab.silverlabs.uk/SilverLABS/silverdroid/-/pipelines
Job Logs
Access detailed logs:
Project → CI/CD → Jobs → [Select Job]
Build Duration
Average pipeline duration: ~5-8 minutes
- prepare: ~1 min
- test: ~2 min
- build: ~3-5 min
- deploy: ~30 sec
🐛 Troubleshooting
Pipeline Fails on First Run
Issue: Gradle dependencies download timeout
Solution:
- Increase job timeout: Settings → CI/CD → General pipelines → Timeout
- Set to 30 minutes for first run
- Subsequent runs use cache (~5 min)
Runner Out of Memory
Issue: Build fails with "Out of memory" error
Solution:
Edit runner config (/etc/gitlab-runner/config.toml):
[[runners]]
[runners.docker]
memory = "4g"
memory_swap = "4g"
Restart runner:
gitlab-runner restart
Gradle Wrapper Not Executable
Issue: Permission denied: ./gradlew
Solution: Already fixed in pipeline with:
before_script:
- chmod +x ./gradlew
Artifacts Not Appearing
Issue: Can't find APK after build
Solution:
- Check job artifacts tab
- Verify artifact expiration hasn't passed
- Check
paths:in.gitlab-ci.yml
🔔 Notifications
Slack/Mattermost Integration
Update notification jobs in .gitlab-ci.yml:
notify:success:
script:
- |
curl -X POST "YOUR_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d "{
\"text\": \"✅ Build #${CI_PIPELINE_ID} succeeded\",
\"username\": \"GitLab CI\",
\"icon_emoji\": \":white_check_mark:\"
}"
Email Notifications
Configure in GitLab:
- Settings → Integrations → Pipelines emails
- Add recipient emails
- Check events to notify
📈 Advanced Features
Parallel Builds
Build multiple variants simultaneously:
build:variants:
stage: build
parallel:
matrix:
- VARIANT: [debug, release]
script:
- ./gradlew assemble${VARIANT}
Merge Request Pipelines
Automatic builds on MRs (already configured):
only:
- merge_requests
Scheduled Pipelines
Nightly builds:
- CI/CD → Schedules → New schedule
- Cron:
0 2 * * *(2 AM daily) - Target branch:
develop - Variables:
BUILD_TYPE=nightly
📝 Testing the Pipeline
Trigger a Build
# Make a change
echo "# Test" >> README.md
# Commit and push
git add README.md
git commit -m "Test CI/CD pipeline"
git push origin main
Monitor Progress
# View pipeline status
curl "https://gitlab.silverlabs.uk/api/v4/projects/SilverLABS%2Fsilverdroid/pipelines?per_page=1" \
--header "PRIVATE-TOKEN: glpat-wqUcD7mg53F1mgM-N-PdiW86MQp1OjEH.01.0w074ox93"
✅ Checklist
- GitLab project created
- Repository pushed to GitLab
- Runner registered and active
- Pipeline executed successfully
- Artifacts generated and downloadable
- (Optional) Signing configured
- (Optional) Notifications configured
- (Optional) TeamCity integration added
📞 Support
Resources
- GitLab Docs: https://docs.gitlab.com/ee/ci/
- Docker Image: https://github.com/mingchen/docker-android-build-box
- Pipeline File:
.gitlab-ci.yml(in project root)
SilverLABS Infrastructure
- GitLab: https://gitlab.silverlabs.uk
- TeamCity: https://cis1.silverlabs.uk
- Token: (See ~/.claude/CLAUDE.md)
🎉 You're All Set!
Your Android CI/CD pipeline is ready to:
- Automatically build APKs on every push
- Run tests and quality checks
- Store artifacts for download
- Deploy to staging/production
Push your code and watch the magic happen! ✨