CI/CD를 왜 도입했을까?

6주라는 한정된 기간 동안, 저희 파일럿츠 팀은 매주 계획-설계-구현-테스트-배포를 1주 단위로 반복했습니다. 기능 구현에도 턱없이 부족한 시간이었기에, 테스트와 배포에 소모되는 시간을 줄이기 위해 CI/CD 환경을 도입했습니다.


CI (Continous Integration)

빌드 테스트

빠르게 작업을 진행하다 보면, PR을 올릴 때 빌드 가능 여부를 확인하는 것을 간혹 잊어버릴 때가 있습니다. 이러한 문제는 코드 리뷰 과정에서도 쉽게 발견하기 어렵습니다. 따라서, 새로운 작업을 develop 브랜치에 병합하기 전에 빌드 가능 여부를 자동으로 확인하여, 안전하게 다음 작업을 진행할 수 있도록 테스트를 진행했습니다. 인증서와 프로비저닝 등록없이 진행하기 위해 빌드는 시뮬레이터를 대상으로 테스트 했습니다. 아래는 워크플로우입니다. 해당 워크플로우는 develop 브랜치로 PR이 올라오면 자동으로 실행됩니다.

name: Build Test

on:
  pull_request:
    branches:
      - develop

jobs:
  Build:
    runs-on: macos-latest

    steps:
      # 저장소의 코드를 가져옴
      - name: Checkout project
        uses: actions/checkout@v4

      # 빌드 가능 여부 확인
      - name: Build AirplaIN
        run: |
          xcodebuild \\
            -workspace AirplaIN.xcworkspace \\
            -scheme AirplaIN \\
            -configuration Debug \\
            -sdk iphonesimulator \\
            clean build

도메인 모듈 테스트

파일럿츠 팀은 클린 아키텍처를 도입하면서, 핵심 로직을 Domain 레이어의 유즈케이스로 구현했습니다. 팀원마다 맡은 기능이 달랐기 때문에, 추후 안전하고 빠르게 통합할 수 있도록 각 유즈케이스 별로 테스트 코드를 작성했습니다. 아래는 워크플로우입니다. 워크플로우는 Domain 모듈에 변경사항이 있고, 새로운 PR이 올라왔을 때 자동으로 실행됩니다.

name: Domain Test

on:
  pull_request:
    paths:
      - 'Domain/**'

jobs:
  Domain_Test:
    runs-on: macos-14

    steps:
      # 저장소의 코드를 가져옴
      - name: Checkout project
        uses: actions/checkout@v4

      # 도메인 테스트 코드 실행
      - name: Run Domain module tests
        run: |
          set -o pipefail && \\
          xcodebuild \\
            -workspace AirplaIN.xcworkspace \\
            -scheme DomainTests \\
            -destination 'platform=iOS Simulator,name=iPhone 15 Pro,OS=17.5' \\
            clean test | xcpretty --test --color

CD (Continuous Deployment)

프로젝트 초기에는 부스트캠프 엔터프라이즈 개발자 계정에 저희 Apple 계정을 등록했습니다. 이후 매주 금요일, 구글 스프레드시트에 엔터프라이즈 내 배포를 위한 링크를 기재해야 했습니다.

드롭박스를 이용한 배포

가장 처음 배포를 진행할 때는 직접 manifest.plist 파일과 ipa 파일을 드롭박스에 업로드하는 방식을 시도했는데요, 이 과정이 굉장히 번거롭게 느껴졌습니다.

<aside> 📦

드롭 박스로 수동 배포 하기

  1. xcode 메뉴의 Product → Archive를 통해 앱을 빌드하여 아카이빙 합니다.
  2. Archive 목록 중 배포할 xcarchive 파일을 선택 후 Distribute App 을 클릭!
  3. 배포 옵션을 선택한 후 ipa 파일을 추출합니다.
  4. 드롭박스에 추출한 ipa 파일을 업로드하고, 다운로드 링크를 얻습니다.
  5. manifest.plist 파일을 직접 생성하고, 4번에서 얻은 ipa 다운 링크를 plist 파일에 넣어줍니다.
  6. itms-services 프로토콜을 이용해 manifest.plist 파일의 다운로드 링크를 제공하기 </aside>

AppBox를 이용한 배포

다음으로 고려했던 방법은 간단하게 앱의 배포를 도와주는 AppBox를 이용한 배포입니다.