DPSMobile Builds & Releases

Mobile builds & releases

DPS treats mobile delivery as three independent layers that can be mixed-and-matched:

  1. Executionwhere the binary is built (client repo Actions, DPS-hosted runners, Bitrise/CircleCI, or your laptop).
  2. Artifacts — verified .ipa / .apk / .aab stored in DPS, each with size + SHA-256 + provenance.
  3. 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:

ModeRequired filesWhat you get
managedpackage.json + .dps/config.json + .github/workflows/dps-build.ymlDashboard / CLI “Trigger Build” runs in your own repo’s GitHub Actions
artifact-onlynoneUpload 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 production

Equivalent to the managed dashboard path.

3. Local build → publish

dps publish ./build/app.aab --app <appId> \
  --version 1.2.3 --channel production --auto-publish

4. 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: production

Or call the REST endpoints directly (POST /api/v1/artifacts/upload-urlPUT 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

TabPurpose
SourceRepo connection + Repository Compatibility panel (mode chip, detected files, re-validate, trigger build)
BuildsTrigger build + history; mode badge shows execution path
ArtifactsVerified binaries (size, SHA-256, version, provenance, download)
ReleasesChannel-scoped bundles, publish / rollback
PublishingStore submissions (App Store, Play Store, TestFlight)
CredentialsiOS signing + Android keystore + service accounts