iOS Continuous Deployment

Back to Library

Prerequisites: Project should be set up for continuous integration with CircleCI.

Goals: Branches that are marked for deployment will automatically be archived and packaged, uploaded to HockeyApp, and distributed to a pre-specified list of users.

This guide assumes that the builds will use an enterprise provisioning profile, though ad hoc builds should work as well.

ProvisionQL may be useful when obtaining the necessary code signing files.

Gather code signing files

Ensure this folder structure exists for your project. The files listed here need to be gathered.

YourApp/ ├── ... └── scripts/ └── CircleCI/ ├── apple.cer ├── ├── dist.cer ├── dist.p12 ├── ├── profile │ └── <YOUR_APP_DISTRIBUTION_PROFILE>.mobileprovision └──

  1. apple.cer
  2. Open OS X Keychain Access
  3. Keychain: login
  4. Category: Certificates
  5. Name: Apple Worldwide Developer Relations Certification Authority
  6. Export as apple.cer
  7. .mobileprovision
  • Obtain the distribution provisioning profile for your app

  • It can be downloaded directly from the Apple Developer Center

  • Or if it has already been setup in Xcode 1. Xcode Preferences > Accounts 2. Select your team 3. View Details…
    1. Find the provisioning profile of interest > right click > Show in Finder
    2. dist.cer
    3. Open OS X Keychain Access
    4. Find the certificate used to sign the provisioning profile (ProvisionQL is helpful here).
  • This may need to be downloaded from the Apple Developer Center if not already present on your machine.
    1. Export as dist.cer
    2. dist.p12
    3. Same as dist.cer, but export as dist.p12
    4. Provide a secure password for the file. This will be referenced later as $KEY_PASSWORD. This will be known and guarded by CircleCI.
    5. — uploads app binary to HockeyApp
    6. — installs code signing files on CircleCI
    7. — clean up code signing

Xcode setup

Ensure that the Xcode Build Settings for Release are configured to use the iOS distribution certificate and distribution provisioning profile that you exported above.

HockeyApp configuration


  • an app has already been created on HockeyApp (an admin might be required for this)

  • an active API token exists for the app

  • a team has been created for the app

  • users that are part of the internal development team should be tagged with $HOCKEYAPP_PRIVATE_RELEASE_TAGS

  • they will receive frequent build notifications (each deployment)

  • users that are part of the external development team should be tagged with $HOCKEYAPP_PUBLIC_RELEASE_TAGS

  • they will receive semi-frequent build notifications (typically end of sprints, when $HOCKEYAPP_PUBLIC_RELEASE_BRANCH is updated

CircleCI configuration

Project Settings > Tweaks > Environment variables

  • App ID from HockeyApp
  • use this string literally: /Users/$USER/$CIRCLE_PROJECT_REPONAME.ipa
  • comma-separated list of HockeyApp tags - users with these tags will be notified for “private” (internal to Originate) builds. E.g. originate
  • the branch from which to deploy publicly (typically master)
  • comma-separated list of HockeyApp tags - users with these tags will be notified for “public” (for partners) builds. E.g. acme
  • Team ID for the app’s team
  • API token for the app
  • password for the exported dist.p12 file


The deployment key within the circle.yml file configures app deployment. The branch subkey specifies which branches should be deployed. All other branches are built and tested by CircleCI, but won’t be pushed out to HockeyApp.

...   deployment: hockey: branch: [dev, master] commands: - ./scripts/CircleCI/ - xcodebuild archive -workspace YourApp.xcworkspace -scheme YourApp -archivePath YourApp.xcarchive - xcodebuild -exportArchive -archivePath YourApp.xcarchive -exportPath ./ -exportFormat ipa -exportProvisioningProfile "YourApp Enterprise Distribution" - ./scripts/CircleCI/ - ./scripts/CircleCI/   ...

Back to Library