rshankras/ci-cd-setup
Generate CI/CD configuration for automated builds, tests, and distribution of iOS/macOS apps. Use when setting up GitHub Actions, Xcode Cloud, or fastlane for continuous integration, TestFlight, or App Store deployment.
npx skills add https://github.com/rshankras/claude-code-apple-skills --skill ci-cd-setup
Generate CI/CD configuration for automated builds, tests, and distribution of iOS/macOS apps.
Before generating, verify:
# Check for existing CI files
ls -la .github/workflows/ 2>/dev/null
ls -la ci_scripts/ 2>/dev/null
ls -la fastlane/ 2>/dev/null
# Find Xcode project/workspace
find . -name "*.xcodeproj" -o -name "*.xcworkspace" | head -5
# Check for SPM vs CocoaPods
ls Package.swift 2>/dev/null
ls Podfile 2>/dev/null
.github/workflows/
├── build-test.yml # PR checks, unit tests
├── deploy-testflight.yml # TestFlight deployment
└── deploy-appstore.yml # App Store submission
ci_scripts/
├── ci_post_clone.sh # Post-clone setup
└── ci_pre_xcodebuild.sh # Pre-build configuration
fastlane/
├── Fastfile # Lane definitions
├── Appfile # App configuration
└── Matchfile # Code signing (if using match)
.swiftlint.yml # from templates/swiftlint/swiftlint.yml
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:
templates/swiftlint/swiftlint.yml.skills/<category>/<skill>/rules/swiftlint.yml; append its
custom_rules entries and union its opt_in_rules.
observable_object_legacyapplies only to iOS 17+/macOS 14+ deployment targets, and
xctest_in_unit_tests must keep its UITests exclusion (XCUITest
legitimately requires XCTest).
build-test.yml runs the lint job automatically once.swiftlint.yml exists (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).
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 # Export from Keychain as .p12, then base64 encode
base64 -i certificate.p12 | pbcopy
brew install fastlane
fastlane init
fastlane match init
fastlane match development
fastlane match appstore
Take rshankras/ci-cd-setup from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference brew.
Without those the skill loads but fails at the first command.