Mobile builds & releases
DPS treats mobile delivery as three independent layers that can be mixed-and-matched:
- Execution — where the binary is built (client repo Actions, DPS-hosted runners, Bitrise/CircleCI, or your laptop).
- Artifacts — verified
.ipa/.apk/.aabstored in DPS, each with size + SHA-256 + provenance. - Releases — a channel-scoped bundle of artifacts that can be published to App Store / Play Store / TestFlight / Firebase.
This page covers all five execution paths, the repo contract that unlocks the managed path, and the dashboard/CLI surfaces you use day to day.
Repo compatibility modes
When an app connects a GitHub repository, DPS runs a validator that classifies the repo as one of:
| Mode | Required files | What you get |
|---|---|---|
| managed | package.json + .dps/config.json + .github/workflows/dps-build.yml | Dashboard / CLI “Trigger Build” runs in your own repo’s GitHub Actions |
| artifact-only | none | Upload artifacts manually or via external CI; releases + publishing still work |
Mode is shown in the dashboard under App → Source → Repository
Compatibility and can be re-checked any time. It’s also available
locally with dps doctor
or server-side with dps repo check --app <appId>.
.dps/config.json (managed)
{
"platforms": ["ios", "android"],
"build": {
"ios": {
"production": "npx eas build --platform ios --profile production --local --output build/app.ipa",
"preview": "npx eas build --platform ios --profile preview --local --output build/app.ipa"
},
"android": {
"production": "npx eas build --platform android --profile production --local --output build/app.aab",
"preview": "npx eas build --platform android --profile preview --local --output build/app.apk"
}
},
"artifact": {
"ios": { "production": "build/app.ipa", "preview": "build/app.ipa" },
"android": { "production": "build/app.aab", "preview": "build/app.apk" }
}
}.github/workflows/dps-build.yml (managed)
A thin wrapper that delegates to the centrally-versioned reusable workflow:
name: DPS Build
on:
workflow_dispatch:
inputs:
app_id: { required: true, type: string }
platform: { required: true, type: string } # ios | android
profile: { required: false, type: string, default: production }
jobs:
build:
uses: duabalabs/dps-workflows/.github/workflows/dps-build-reusable.yml@v1
with:
platform: ${{ inputs.platform }}
profile: ${{ inputs.profile }}
app_id: ${{ inputs.app_id }}
api_url: https://api.dps.example.com
secrets:
DPS_TOKEN: ${{ secrets.DPS_TOKEN }}Add DPS_TOKEN as a GitHub repository secret. Create the token under
Dashboard → Account Settings → Deploy Tokens with scopes
artifact:upload, release:create.
Execution paths
All five converge into the same artifact + release pipeline.
1. Dashboard “Trigger Build” (managed)
App → Builds → Trigger New Build
When the repo is managed, the badge shows
Managed · runs in client repo and the button calls
dps_build_dispatch, which posts workflow_dispatch to
dps-build.yml in the client’s own repo using the GitHub App
installation token. The workflow then uploads back through
/api/v1/artifacts/upload-url.
When the repo is artifact-only, the badge shows
Artifact-only · DPS-hosted build and the button falls back to
dps_triggerMobileWorkflow (centralized dps-workflows).
2. CLI
dps build trigger --app <appId> --platform android --profile productionEquivalent to the managed dashboard path.
3. Local build → publish
dps publish ./build/app.aab --app <appId> \
--version 1.2.3 --channel production --auto-publish4. External CI (Bitrise / CircleCI / your own runners)
Use the reusable composite action:
- uses: duabalabs/dps-workflows/actions/upload@v1
with:
token: ${{ secrets.DPS_TOKEN }}
api-url: https://api.dps.example.com
app-id: <appId>
artifact: ./build/app.aab
platform: android
create-release: "true"
release-channel: productionOr call the REST endpoints directly (POST /api/v1/artifacts/upload-url
→ PUT to the returned URL → POST /finalize).
5. Manual dashboard upload
App → Artifacts → drag & drop a file. Useful for occasional builds and for verifying credentials end-to-end.
Releases & publishing
dps release create --app <appId> \
--artifact <iosId> --artifact <androidId> \
--version 1.2.3 --channel production --notes "Bug fixes"
dps release publish <releaseId> --target play-store
dps release rollback <releaseId> --to <previousReleaseId>Equivalent UI lives at App → Releases and App → Publishing.
Dashboard surfaces
| Tab | Purpose |
|---|---|
| Source | Repo connection + Repository Compatibility panel (mode chip, detected files, re-validate, trigger build) |
| Builds | Trigger build + history; mode badge shows execution path |
| Artifacts | Verified binaries (size, SHA-256, version, provenance, download) |
| Releases | Channel-scoped bundles, publish / rollback |
| Publishing | Store submissions (App Store, Play Store, TestFlight) |
| Credentials | iOS signing + Android keystore + service accounts |
Related
@duabalabs/dps-cli— full command reference.- dps-workflows — reusable workflow + upload action sources.
- API Reference — REST endpoints under
/api/v1.