Building an iOS app on a local machine is routine that consumes team time. With five or more developers, every commit turns into waiting for a build. We automate this process using Bitrise — cloud CI/CD tailored for mobile development. Its main distinction from GitHub Actions or GitLab CI: all steps are ready-made blocks from the Workflow Editor with UI configuration. Most mobile scenarios are configured without writing yaml from scratch. For teams without a DevOps expert, this lowers the entry barrier by three times.
Workflow Editor: bitrise.yml structure
Bitrise stores configuration in bitrise.yml in the repository root. It can be edited via the UI or directly in yaml. A basic iOS workflow:
workflows: primary: steps: - activate-ssh-key: {} - git-clone: {} - certificate-and-profile-installer: {} - cocoapods-install: inputs: - is_cache_disabled: "false" - xcode-test: inputs: - scheme: MyApp - simulator_device: iPhone 15 - xcode-archive: inputs: - scheme: MyApp - distribution_method: ad-hoc - deploy-to-bitrise-io: {} - firebase-app-distribution: inputs: - app: $FIREBASE_APP_ID - groups: qa-team certificate-and-profile-installer is a Bitrise-specific step that downloads certificates from the Bitrise Code Signing tab. There, .p12 and .mobileprovision files are uploaded via UI or API. This is simpler than fastlane match, but means storing certificates on Bitrise servers.
How does Bitrise manage code signing?
Bitrise has a built-in Code Signing Manager. Upload via Web UI:
- Distribution certificate (.p12 + passphrase)
- Provisioning profile (.mobileprovision)
The xcode-archive step automatically uses the uploaded certificates via BITRISE_CERTIFICATE_URL and BITRISE_CERTIFICATE_PASSPHRASE environment variables. Xcode Automatic Signing is disabled in xcode-archive:
- xcode-archive: inputs: - automatic_code_signing: api-key # or certificate The api-key mode uses App Store Connect API Key — the best option as it doesn't expire, unlike a certificate.
How does Bitrise manage secrets?
Bitrise provides a separate Secrets section for storing tokens, passwords, and keys. Variables like $FIREBASE_APP_ID are substituted in all Steps. It is not recommended to store secrets in bitrise.yml — use the Workflow → Secrets tab. Our engineers set up key rotation once a quarter.
Why is Bitrise more advantageous than self-hosted CI?
| Criterion | Bitrise | Self-hosted (Jenkins) |
|---|---|---|
| Setup time | 2–4 days | 2–3 weeks |
| macOS support | Built-in Xcode stacks | Need to set up runner with macOS |
| Code signing | Automatic installation | Manual setup |
| SPM/CocoaPods caching | Built-in Steps | Manual setup |
| App Store integration | 1 click | Via scripts |
Bitrise reduces CI/CD deployment time by 70% compared to Jenkins. However, the cloud solution has limitations: runners only on macOS (Xcode 15/16), and with intensive development by a team of five, cloud minutes run out quickly. If you need builds for every commit and nightly UI tests on real devices, we combine Bitrise with Device Testing (Firebase Test Lab or your own device farm).
How to set up parallel workflows?
Bitrise supports multiple workflows with different triggers:
trigger_map: - push_branch: main workflow: deploy - push_branch: "feature/*" workflow: test-only - pull_request_target_branch: main workflow: pr-check The test-only workflow runs only tests without archiving — saving up to 10 minutes on each push to a feature branch. Dependency caching speeds up builds by another 30%:
| Cache type | Key | Path |
|---|---|---|
| CocoaPods | cocoapods-{{ checksum "Podfile.lock" }} |
./Pods |
| SPM | spm-{{ checksum "Package.resolved" }} |
~/Library/Developer/Xcode/DerivedData |
Typical errors when implementing Bitrise
- Mismatch between bundle ID in provisioning profile and
PRODUCT_BUNDLE_IDENTIFIERin xcconfig —xcode-archivefails withNo profile for... signed for running on device. - CocoaPods version on Bitrise stack differs from local — add
gem install cocoapods --version X.X.Xin Script Step. -
BITRISE_SCHEMEnot set —xcode-testuses the first available scheme, which may be wrong. - Cache issues: if
Podfile.lockdoesn't change, cache is not refreshed — fixed by addingis_cleanup: true.
What is included in our setup
- Analysis of the current project and selection of optimal configuration.
- Creation of
bitrise.ymlwith workflows for building, testing, and deployment. - Code signing setup via Code Signing Manager.
- Integration with Git repository and trigger map configuration.
- Dependency caching to accelerate builds.
- Configuration documentation and team training.
- Support during the implementation phase (2 weeks).
Timeline: basic setup (test + archive + TestFlight) — 2–4 days. Full configuration with parallel workflows, Device Testing, caching, Slack/Jira integration — 1–1.5 weeks. Pricing is calculated individually. Order iOS CI/CD setup — we guarantee a stable pipeline. Contact us for a consultation and project assessment.
Our experience: we have been automating CI/CD for mobile applications for over five years. During this time, we have implemented more than 50 projects on iOS and Android. We use Bitrise, GitHub Actions, GitLab CI — we select the tool according to the client's needs. We guarantee pipeline stability and post-implementation support.







