CI/CD Setup Generator
Generate CI/CD configuration for automated builds, tests, and distribution of iOS/macOS apps.
When This Skill Activates
- User wants to automate their build and test process
- User mentions GitHub Actions, Xcode Cloud, or fastlane
- User wants to set up TestFlight or App Store deployment
- User asks about continuous integration for their app
Pre-Generation Checks
Before generating, verify:
Existing CI Configuration
# Check for existing CI files ls -la .github/workflows/ 2>/dev/null ls -la ci_scripts/ 2>/dev/null ls -la fastlane/ 2>/dev/nullProject Structure
# Find Xcode project/workspace find . -name "*.xcodeproj" -o -name "*.xcworkspace" | head -5Package Manager
# Check for SPM vs CocoaPods ls Package.swift 2>/dev/null ls Podfile 2>/dev/null
Configuration Questions
1. CI/CD Platform
- GitHub Actions (Recommended) - Full control, extensive marketplace
- Xcode Cloud - Native Apple integration, simpler setup
- Both - GitHub for PRs/tests, Xcode Cloud for releases
2. Distribution Method
- TestFlight - Beta testing via App Store Connect
- App Store - Production releases
- Direct (macOS only) - Notarized DMG/PKG distribution
- All - Full pipeline from dev to production
3. Include fastlane?
- Yes - Advanced automation, match for code signing
- No - Simpler setup using xcodebuild directly
4. Code Signing Approach
- Manual - Certificates in GitHub Secrets
- match (fastlane) - Git-based certificate management
- Xcode Cloud Managed - Apple handles signing
Generated Files
GitHub Actions
.github/workflows/
├── build-test.yml # PR checks, unit tests
├── deploy-testflight.yml # TestFlight deployment
└── deploy-appstore.yml # App Store submission
Xcode Cloud
ci_scripts/
├── ci_post_clone.sh # Post-clone setup
└── ci_pre_xcodebuild.sh # Pre-build configuration
fastlane
fastlane/
├── Fastfile # Lane definitions
├── Appfile # App configuration
└── Matchfile # Code signing (if using match)
SwiftLint
.swiftlint.yml # from templates/swiftlint/swiftlint.yml
Merging Skill Rule Fragments
Skills in this library may ship graduated enforcement as a
rules/swiftlint.yml fragment (opt_in_rules + custom_rules) — prose
rules turned into deterministic lint. When generating .swiftlint.yml:
- Start from
templates/swiftlint/swiftlint.yml. - For each skill the project actually uses, check for
skills/<category>/<skill>/rules/swiftlint.yml; append itscustom_rulesentries and union itsopt_in_rules. - Respect fragment scoping comments — e.g.
observable_object_legacyapplies only to iOS 17+/macOS 14+ deployment targets, andxctest_in_unit_testsmust keep its UITests exclusion (XCUITest legitimately requires XCTest). - The generated
build-test.ymlruns thelintjob automatically once.swiftlint.ymlexists (if: hashFiles('.swiftlint.yml') != '').
Current fragments: security/ (hardcoded secrets), ios/coding-best-practices
(print-in-production, legacy ObservableObject, force_unwrapping/force_try),
testing/tdd-feature (XCTest scoped out of unit tests),
swift/concurrency (@unchecked Sendable without justification).
Integration Steps
GitHub Actions Setup
Add Repository Secrets (Settings > Secrets and variables > Actions):
APP_STORE_CONNECT_API_KEY_ID- API Key IDAPP_STORE_CONNECT_API_ISSUER_ID- Issuer IDAPP_STORE_CONNECT_API_KEY_CONTENT- Private key (.p8 content)CERTIFICATE_P12- Base64-encoded .p12 certificateCERTIFICATE_PASSWORD- Certificate passwordPROVISIONING_PROFILE- Base64-encoded provisioning profile
Create App Store Connect API Key:
- Go to App Store Connect > Users and Access > Keys
- Generate API Key with "App Manager" role
- Download the .p8 file (only available once)
Export Certificate:
# Export from Keychain as .p12, then base64 encode base64 -i certificate.p12 | pbcopy
Xcode Cloud Setup
Enable Xcode Cloud in Xcode:
- Product > Xcode Cloud > Create Workflow
- Connect to App Store Connect
Configure Workflow:
- Set start conditions (branch, PR, tag)
- Configure environment variables
- Set up post-actions (TestFlight, App Store)
Add ci_scripts to repository for customization
fastlane Setup
Install fastlane:
brew install fastlaneInitialize (if starting fresh):
fastlane initSet up match (optional, for code signing):
fastlane match init fastlane match development fastlane match appstore
Best Practices
Caching
- Cache Swift Package Manager dependencies
- Cache DerivedData for faster builds
- Use selective caching to avoid stale artifacts
Secrets Management
- Never commit certificates or keys
- Use environment variables for sensitive data
- Rotate API keys periodically
Build Optimization
- Use incremental builds where possible
- Parallelize test execution
- Skip unnecessary steps on draft PRs
Notifications
- Slack/Discord integration for build status
- Email notifications for failures
- GitHub status checks for PRs