37
Setup CI pipeline for iOS projects on gitlab.com
.gitlab-ci.yml
- bundler (optional, if you have dependency for Ruby gems like cocoapods/fastlane, etc.)
- jq (optional, for processing the code coverage report)
-
brew install jq
Pipelines
are the top-level component of continuous integration, delivery, and deployment.
Jobs
defines what to do, executed by runners
Stages
defines when to run the jobs
stages:
- prebuild
- build
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- my-project-path/.bundle
- my-project-path/vendor
install_dependencies:
stage: prebuild
script:
- unset cd
- cd my-project-path
- bundle config set --local deployment 'true'
- bundle install
tags:
- macos_11-2-3
- xcode_12-4
- ios_14-4
build_project:
stage: build
script:
- unset cd
- cd my-project-path
- xcodebuild clean build test -project my-project.xcodeproj -scheme "CI" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
- xcrun xccov view --report --json DerivedData/my-project-path/Logs/Test/*.xcresult > xcresult.json
- cat xcresult.json | jq ".lineCoverage" -j | awk '{printf "XCTEST_COVERAGE=%0.2f%%\n",$1*100}'
tags:
- macos_11-2-3
- xcode_12-4
- ios_14-4
line 1-3: defined a pipeline with 2 stages,
prebuild
and build
line 5-9: defined the paths that will be cached between the jobs
line 11-21: defined the
install_dependencies
Jobline 23-34: defined the
build_project
Jobline 28: build and test the Xcode project
line 29-30: gather the code coverage stat
my-project-path/.bundle
is storing the bundle configmy-project-path/.vendor
is storing the installed gems${CI_COMMIT_REF_SLUG}
is the branch or tag name for which project is builtWithout cache, the gems installed in the
prebuild
stage will be deleted when the build
stage is executed, even the Jobs are executed on the same machineThe example will share the caches across the same branch
when
rvm
is used, it will redefine the cd
command as below:cd ()
{
__zsh_like_cd cd "$@"
}
cd
command is used in the Job, it will throw ERROR: Build failed with: exit status 1
and exit immediatelyunset cd
is used to reset cd
to be the shell builtin command
- it can be added before the step that used the
cd
command (as in the example) - or can be added in
.bash_profile
tags
must match the configs in the Runners section in gitlab.com -> project settings -> CI/CD.gitlab-ci.yml
should be placed in the root of the git repo
To configure the pipeline status:
- Name:
Pipeline Status
- Link:
https://gitlab.com/%{project_path}/-/commits/%{default_branch}
- Badge image URL:
https://gitlab.com/%{project_path}/badges/%{default_branch}/pipeline.svg

Get the code coverage report in JSON format after the project is built
xcrun xccov view --report --json DerivedData/my-project/Logs/Test/*.xcresult > xcresult.json
Print the code coverage to the job log
cat xcresult.json | jq ".lineCoverage" -j | awk '{printf "XCTEST_COVERAGE=%0.2f%%\n",$1*100}'
the above line is to
lineCoverage
field from the JSONnoted that the percentage sign
%
must be included for Test coverage parsingXCTEST_COVERAGE=(\d+.\d+%)
- Name:
Code Coverage
- Link:
https://gitlab.com/%{project_path}/-/commits/%{default_branch}
- Badge image URL:
https://gitlab.com/%{project_path}/badges/%{default_branch}/pipeline.svg
37