Skip to content

Commit

Permalink
Merge pull request #429 from nimblehq/feature/#315-codemagic-ci-cd-su…
Browse files Browse the repository at this point in the history
…pport

[#315] CI/CD - Add support for Codemagic CI/CD service
  • Loading branch information
vnntsu authored Feb 24, 2023
2 parents 1157ec7 + 912a958 commit 4f326fb
Show file tree
Hide file tree
Showing 7 changed files with 200 additions and 5 deletions.
60 changes: 60 additions & 0 deletions .github/wiki/CodeMagic.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# CodeMagic

Use the CodeMagic template to start a new project with CodeMagic as the CI/CD tool.

## Workflows and Steps

Out of the box, the CodeMagic Template has the following workflows and steps:

| test | deploy_app_store | deploy_staging_firebase | deploy_release_firebase |
| --------------------------- | ------------------------------------------------------- | --------------------------------------------------- | ----------------------------------------------------- |
| Install bundle | Install bundle | Install bundle | Install bundle |
| Run CocoaPods install | Run CocoaPods install | Run CocoaPods install | Run CocoaPods install |
| Fastlane - Build and Test | Fastlane - Build and Test | Fastlane - Build and Test | Fastlane - Build and Test |
| Fastlane - Clean Up Xcov | Fastlane Match | Fastlane Match | Fastlane Match |
| Fastlane - Build and deploy | Fastlane - Build and Upload Production App to App Store | Fastlane - Build and Upload Staging App to Firebase | Fastlane: Build and Upload Production App to Firebase |
| Danger | N/A | N/A | N/A |

## Trigger Map

| Workflow | Trigger |
| ----------------------- | ----------------------- |
| test | Create or Update a PR |
| deploy_staging | Push branch `develop` |
| deploy_release_firebase | Push branch `release/*` |
| deploy_app_store | Push branch `main` |

## Environment

### Variables

| Key | Description |
| --------------------------- | ------------------------------------------------------------ |
| MATCH_PASSWORD | The password is used to encrypt/decrypt the Match repository to store the distribution certificates and provisioning profiles. |
| MATCH_SSH_KEY | The SSH private key is used for cloning the Match repository that contains your distribution certificates and provisioning. |
| KEYCHAIN_PASSWORD | The password to access the keychain. |
| FIREBASE_CLI_TOKEN | [Firebase token](https://firebase.google.com/docs/cli#cli-ci-systems) for uploading build to Firebase Distributions and Analytics. |
| APPSTORE_CONNECT_API_KEY | [App Store Connect API](https://docs.fastlane.tools/actions/app_store_connect_api_key/) for uploading build to TestFlight or App Store. It should be `base64` encoded. |
| API_KEY_ID | The key identifier of your App Store Connect API key. |
| ISSUER_ID | The issuer of your App Store Connect API key. |
| BUMP_APP_STORE_BUILD_NUMBER | The boolean flag to determine if the Fastlane should bump the app store build number. |
| GITHUB_TOKEN | The token of GitHub to run Danger. |

## Installation

1. Follow the setup instruction in [`README.md`](https://github.com/nimblehq/ios-templates#readme).

2. To connect the repository to CodeMagic, please follow the instruction on [Adding the app to CodeMagic](https://docs.codemagic.io/yaml-quick-start/building-a-native-ios-app).

3. Provide all the required variables and secrets.

The final project directory structure should be like this:

```
ROOT
├── ExampleApp.xcworkspace
├── codemagic.yaml
├──...
```

4. Push changes to SCM.
1 change: 1 addition & 0 deletions .github/wiki/_Sidebar.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
- [[Github Actions]]
- [[Self Hosted Github Actions]]
- [[Bitrise]]
- [[CodeMagic]]
- [[Fastlane]]

## Operations
Expand Down
2 changes: 1 addition & 1 deletion Dangerfile
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ swiftlint.lint_files(
)

xcresultPath = "./fastlane/test_output/{PROJECT_NAME} Staging.xcresult"
scheme = "'{PROJECT_NAME} Staging'"
scheme = "{PROJECT_NAME} Staging"
workspace = "./{PROJECT_NAME}.xcworkspace"
xcovOutputDirectory = "./fastlane/xcov_output"

Expand Down
126 changes: 126 additions & 0 deletions codemagic.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
workflows:
deploy_staging_firebase:
name: Deploy Staging Build To Firebase
instance_type: mac_mini_m1
environment:
groups:
- fastlane
xcode: latest
cocoapods: default
cache:
cache_paths:
- $HOME/Library/Caches/CocoaPods
triggering:
events:
- push
branch_patterns:
- pattern: 'develop'
include: true
source: true
scripts:
- name: Install bundle
script: bundle install --path vendor/bundle
- name: Install Pods Dependencies
script: bundle exec pod install
- name: Build and Test
script: bundle exec fastlane buildAndTest
- name: Match Ad-hoc
script: bundle exec fastlane syncAdHocStagingCodeSigning
- name: Build App and Distribute to Firebase
script: bundle exec fastlane buildStagingAndUploadToFirebase
artifacts:
- ./Output/*.ipa
- ./Output/*.dSYM.zip
deploy_production_firebase:
name: Deploy Production Build To Firebase
instance_type: mac_mini_m1
environment:
groups:
- fastlane
xcode: latest
cocoapods: default
cache:
cache_paths:
- $HOME/Library/Caches/CocoaPods
triggering:
events:
- push
branch_patterns:
- pattern: 'release/*'
include: true
source: true
scripts:
- name: Install bundle
script: bundle install --path vendor/bundle
- name: Install Pods Dependencies
script: bundle exec pod install
- name: Build and Test
script: bundle exec fastlane buildAndTest
- name: Match Ad-hoc
script: bundle exec fastlane syncAdHocProductionCodeSigning
- name: Build App and Distribute to Firebase
script: bundle exec fastlane buildProductionAndUploadToFirebase
artifacts:
- ./Output/*.ipa
- ./Output/*.dSYM.zip
deploy_app_store:
name: Deploy Build To App Store
instance_type: mac_mini_m1
environment:
groups:
- fastlane
xcode: latest
cocoapods: default
cache:
cache_paths:
- $HOME/Library/Caches/CocoaPods
triggering:
events:
- push
branch_patterns:
- pattern: 'main'
include: true
source: true
scripts:
- name: Install bundle
script: bundle install --path vendor/bundle
- name: Install Pods Dependencies
script: bundle exec pod install
- name: Build and Test
script: bundle exec fastlane buildAndTest
- name: Match AppStore
script: bundle exec fastlane syncAppStoreCodeSigning
- name: Build App and Distribute to AppStore
script: bundle exec fastlane buildAndUploadToAppStore
artifacts:
- ./Output/*.ipa
- ./Output/*.dSYM.zip
test:
name: Test
instance_type: mac_mini_m1
environment:
groups:
- fastlane
xcode: latest
cocoapods: default
cache:
cache_paths:
- $HOME/Library/Caches/CocoaPods
triggering:
events:
- pull_request
branch_patterns:
- pattern: '*'
include: true
source: true
scripts:
- name: Install bundle
script: bundle install --path vendor/bundle
- name: Install Pods Dependencies
script: bundle exec pod install
- name: Build and Test
script: bundle exec fastlane buildAndTest
- name: Clean Up
script: bundle exec fastlane cleanUpOutput
- name: Danger
script: bundle exec danger
8 changes: 7 additions & 1 deletion deliverable_setup.sh
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
#!/bin/sh
read -p "Which CI/CD service do you use (Can be edited later) [(g)ithub/(b)itrise/(l)ater]: " ciService
read -p "Which CI/CD service do you use (Can be edited later) [(g)ithub/(b)itrise/(c)odemagic/(l)ater]: " ciService

if [ "$ciService" = "g" -o "$ciService" = "github" ]; then
echo "Setting template for Github Actions"
rm bitrise.yml
rm codemagic.yaml
elif [ "$ciService" = "b" -o "$ciService" = "bitrise" ]; then
echo "Setting template for Bitrise"
rm -rf .github/workflows
rm codemagic.yaml
elif [ "$ciService" = "c" -o "$ciService" = "codemagic" ]; then
echo "Setting template for CodeMagic"
rm -rf .github/workflows
rm bitrise.yml
else
echo "You can manually setup the template later."
fi
Expand Down
6 changes: 4 additions & 2 deletions fastlane/Constants/Constant.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ enum Constant {
// MARK: Platform

static var platform: PlatformType {
if EnvironmentParser.bool(key: "BITRISE_IO") {
if EnvironmentParser.bool(key: "CM_BRANCH") {
return .codeMagic
} else if EnvironmentParser.bool(key: "BITRISE_IO") {
return .bitrise
} else if EnvironmentParser.bool(key: "GITHUB_ACTIONS") {
return .gitHubActions
Expand Down Expand Up @@ -129,7 +131,7 @@ extension Constant {

enum PlatformType {

case gitHubActions, bitrise, unknown
case gitHubActions, bitrise, codeMagic, unknown
}
}

Expand Down
2 changes: 1 addition & 1 deletion fastlane/Helpers/Build.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ enum Build {
sh(command: "echo DSYM_OUTPUT_PATH=\(dsymPath ?? "") >> $GITHUB_ENV")
sh(command: "echo BUILD_NUMBER=\(buildNumber ?? "") >> $GITHUB_ENV")
sh(command: "echo VERSION_NUMBER=\(Version.versionNumber) >> $GITHUB_ENV")
case .bitrise:
case .bitrise, .codeMagic:
sh(command: "envman add --key BUILD_PATH --value '\(Constant.outputPath)'")
default: break
}
Expand Down

0 comments on commit 4f326fb

Please sign in to comment.