Thinking > guide
iOS CD Guide

Setting up iOS Continuous Delivery with CircleCI and HockeyApp

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.

├── ...
└── 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
  8. 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...
      4. Find the provisioning profile of interest > right click > Show in Finder
  9. dist.cer
  10. Open OS X Keychain Access
  11. Find the certificate used to sign the provisioning profile (ProvisionQL is helpful here).

  12. Export as dist.cer
  13. dist.p12
  14. Same as dist.cer, but export as dist.p12
  15. Provide a secure password for the file. This will be referenced later as $KEY_PASSWORD. This will be known and guarded by CircleCI.
  16. — uploads app binary to HockeyApp
  17. — installs code signing files on CircleCI
  18. — 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


    • 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.


    branch: [dev, master]
      - ./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/

Recent Posts

Let's talk.

Give Us a Call
(800) 352-2292
Business Inquiries