최근 채용 공고를 살펴보면 iOS 개발자에게도 CI/CD 경험은 이제 선택이 아닌 필수가 되고 있다.
CI/CD는 개발부터 배포까지의 모든 과정을 자동화하여 개발팀의 효율을 극대화하는 소프트웨어 개발 방식이다.
단어를 그대로 풀이하면 다음과 같다.
CI (Continuous Integration) - 지속적 통합
main, develop 브랜치)에 병합(Merge)하고, 병합될 때마다 자동으로 빌드 및 테스트를 수행하여 문제 여부를 빠르게 피드백받는 과정.CD (Continuous Delivery/Deployment) - 지속적 전달/배포
| 구분 | Continuous Delivery (지속적 전달) | Continuous Deployment (지속적 배포) |
|---|---|---|
| 정의 | 코드가 자동으로 스테이징 서버나 TestFlight까지 전달되지만, 최종 배포(App Store 출시)는 수동으로 결정. | 코드가 모든 테스트를 통과하면 자동으로 App Store까지 출시(배포)됨. |
| 결정권 | 사람이 최종 승인 | 시스템이 자동 승인 |
CI/CD 파이프라인은 특히 iOS 개발 환경에서 다음과 같은 고유한 문제점들을 해결해주기 때문에 자주 활용된다.
Certificate), 식별자(Identifier), 프로비저닝 프로파일(Provisioning Profile) 관리이다.iOS 개발 환경에서 CI/CD 파이프라인을 구축할 때 주로 사용되는 도구와 단계는 다음과 같다.
코드 변경을 감지하고 빌드/테스트를 실행하는 서버 환경.
| 도구 | 특징 |
|---|---|
| GitHub Actions | GitHub 레포지토리에 내장되어 설정이 매우 간편하며, yaml 파일로 파이프라인을 정의. |
| Jenkins | 가장 오래되고 강력한 오픈소스. 자체 서버를 구축해야 하지만, 세밀한 커스터마이징 가능. |
| GitLab CI | GitLab의 내장 CI/CD 솔루션. GitLab 사용자에게 강력한 통합 환경 제공. |
iOS/Android 배포 자동화를 위해 가장 널리 사용되는 루비 기반의 도구, CI/CD 플랫폼의 실제 작업(Job)을 수행.
| Fastlane 기능 (Lane) | CI/CD 단계 | 설명 |
|---|---|---|
scan | CI (테스트) | 모든 유닛 테스트와 UI 테스트를 실행하고 결과를 레포트. |
gym | CI (빌드) | 앱스토어 또는 테스트 목적으로 앱을 아카이브하고 .ipa 파일을 생성. |
cert & sigh | CD 준비 | 인증서 및 프로비저닝 프로파일을 자동으로 생성/관리하여 코드 사이닝 문제를 해결. |
pilot | CD (배포) | 생성된 .ipa 파일을 TestFlight(내부/외부 테스터)에 업로드하고 배포 노트를 작성. |
# GitHub Actions 설정 예시 (Workflow)
jobs:
build_and_test:
runs-on: macos-latest # Apple 환경에서 실행
steps:
- uses: actions/checkout@v4
- name: Install Fastlane
run: bundle install
# CI: 테스트 실행
- name: Run Tests
run: fastlane scan # 'scan' lane을 실행하여 테스트 진행
# CI: 빌드
- name: Build App
run: fastlane build_internal # TestFlight 배포용 아카이브 생성
# CD: TestFlight에 배포
- name: Deploy to TestFlight
run: fastlane beta # 'pilot'을 이용하여 App Store Connect에 업로드
오늘은 CI/CD의 개념과 이것이 iOS 개발 워크플로우에 얼마나 큰 이점을 주는지 알아보았다. 특히 복잡한 코드 사이닝과 지루한 수동 배포 과정을 자동화하는 Fastlane은 활용성이 무궁무진해 보였고, 실제로 사용해볼 수 있으면 좋겠다고 생각했다.
채용 공고에서 CI/CD 경험을 요구하는 것은 이제 단순히 '해봤다'를 넘어, 효율적인 팀 개발 문화를 만들고 복잡한 iOS 환경을 자동화하여 문제를 스스로 해결할 수 있는 능력을 가진 개발자를 찾는다는 의미가 아닐까? 아직은 너무 어려운 이야기같다.