Continuous integration
The Home Assistant iOS repository uses GitHub Actions together with Fastlane for linting, testing, building, localization updates, and distribution.
Main CI workflow
CI runs on pull requests and pushes to main.
Linting jobs
On every pull request, CI runs the same linters described in the code style guide:
- Check Swift formatting with SwiftFormat
- Lint Swift code with SwiftLint, including the repository's custom rules
- Lint Ruby (Fastlane) code with RuboCop
- Lint YAML files (workflows and configuration)
These run on Linux in containers, which keeps style checks fast and independent from the macOS build environment.
Pull request safety checks
The repository has additional pull request-only checks:
SwiftLint disable detection
If a PR adds new // swiftlint:disable lines, CI comments on the pull request so maintainers can review whether that suppression is necessary.
Unused localization detection
CI runs Tools/detect_unused_strings.py and comments on pull requests when unused localized strings are found.
Test job
The test job runs on macOS and uses:
- the current CI Xcode version
- Bundler for Ruby dependencies
- CocoaPods for Apple platform dependencies
bundle exec fastlane test
The default Fastlane test lane runs the Tests-Unit scheme in HomeAssistant.xcworkspace on the simulator configured for CI. For the exact Xcode and simulator versions, refer to ci.yml.
CI also uploads:
- Code coverage from the
Tests-Unit.xcresultbundle - Test logs and crash diagnostics
- A simulator
.appartifact for quick validation and frontend-only testing
Distribution workflow
The distribute.yml workflow runs on pushes to main and on manual dispatch by maintainers with write access to the repository. It builds:
- iOS App Store artifacts
- macOS artifacts, including Developer ID and App Store packaging
Those builds use Fastlane lanes for signing, archiving, export, notarization, and upload to Apple services.
Other workflows
Localization updates
download_localized_strings.yml runs on a schedule and can also be triggered manually by maintainers with write access to the repository. It syncs localized strings with Lokalise and opens a pull request when updates are available.
Push server tests
push_ci.yml runs swift test for changes under Sources/PushServer/**.
Version bumps
set_version.yml updates Configuration/Version.xcconfig through Fastlane and opens a pull request with the version change.
What this means for you
CI validates more than just compilation: style, strings, and artifacts are part of the review loop too. See the code style guide for linting and the get started guide for running tests locally before pushing.