iOS 배포 자동화, 왜 도입했을까? 그리고 겪었던 시행착오

꾸Jun·2일 전
0

🍎 iOS

목록 보기
17/17
post-thumbnail

iOS 배포 자동화, 왜 도입했을까? 그리고 겪었던 시행착오

최근 iOS 프로젝트에서 CI/CD 파이프라인을 직접 구축하면서 “왜 자동화가 필요한가?”에 대해 깊이 공감할 수 있는 경험을 했다.

1.0.0 ~ 1.0.4까지는 수동 배포에 익숙했고, “그냥 내가 직접 하면 되지 않을까?”라는 생각도 들었지만, 자동화 시스템을 도입하고 나니 개발 효율과 신뢰성이 얼마나 달라지는지 몸소 느낄 수 있었다.

1.0.0 배포

1.0.1 배포

1.0.2 배포

1.0.3 배포

1.0.4 배포


도입 배경: 반복적이고 번거로운 배포, 그리고 실수의 위험

내가 참여한 프로젝트는 tuist로 모듈화가 잘 되어 있었지만, 배포 과정만큼은 여전히 사람이 직접 모든 단계를 수행해야 했다. feature, test, cicd 브랜치에서 개발을 마치고 develop로 병합, 버전/빌드 넘버 수동 증가, main으로 병합, 그리고 아카이브 후 App Store Connect로 전송, 빌드 선택 및 배포까지… 이 모든 과정을 매번 반복하다 보니,

  • 실수로 빌드 넘버를 올리지 않거나
  • 인증서가 꼬이거나
  • 배포 과정에서 누락이 생기는

문제가 자주 발생했다.

무엇보다, 이런 반복적인 작업에 시간을 쏟다 보니 정작 중요한 개발에 집중하기 어려웠고, “이걸 자동화할 수 있다면 얼마나 좋을까?”라는 생각이 들었다.


그래서, Fastlane과 GitHub Actions로 자동화!

이런 비효율을 해결하기 위해 Fastlane과 GitHub Actions를 도입해 CI/CD 파이프라인을 구축했다.

자동화된 배포 시스템을 통해

  • develop 브랜치에서는 TestFlight로 자동 배포 및 빌드 넘버 자동 증가
  • main 브랜치에서는 App Store로 자동 배포 및 빌드 넘버 유지
    가 이루어지도록 설정했다.

이제는 사람이 직접 배포에 관여하지 않아도, 브랜치 전략만 잘 지키면 신뢰성 있고 빠른 배포가 가능해졌다.


🧨 시행착오와 어려웠던 점

1. 루비 버전과 번들러, Gemfile 버전 관리

  • 로컬과 CI 환경에서 루비 및 번들러 버전이 달라 생기는 충돌을 해결하는 데 시간이 걸렸다.
  • 특히, Gemfile의 fastlane/xcodeproj 버전 제한 때문에 최신 기능을 쓸 수 없었고, tuist로 생성된 xcodeproj와 호환성 문제가 발생했다.
  • Gemfile에서 버전 제한을 해제하고, bundle update로 해결.

2. 빌드 오류와 Target Membership

  • Fastlane으로 빌드 시 테스트 코드가 메인 앱 타겟에 포함되어 있어, XCTest 관련 심볼을 찾지 못하는 링크 에러가 발생했다.
  • Xcode에서 테스트 파일의 Target Membership에서 ToMyongJi-iOS(메인 타겟) 체크를 해제하고, 테스트 타겟에만 포함되도록 수정하여 해결.

3. 앱 버전, 빌드 버전 관리 자동화

  • Fastlane에서 자동으로 0.0.1씩 패치버전을 올리도록 설정했으나, 메이저/마이너 업데이트(예: 1.0.0 → 2.0.0)가 필요할 때는 Fastfile의 beta lane에 직접 버전을 지정하는 코드를 추가하여 관리했다.
  • 코드:
    lane :beta do
      # (1) 큰 업데이트 시 원하는 버전으로 직접 지정
      increment_version_number(
        version_number: "2.0.0",
        xcodeproj: "ToMyongJi.xcodeproj"
      )
      # (2) 이후 자동 증가 로직(패치버전 +1)은 주석 처리하거나 삭제
      # current_version = get_version_number(...)
      # ...
      sync_certificates
      increment_build_number
      build_ios_app(...)
      upload_to_testflight(...)
    end
  • 이렇게 하면 평소에는 자동으로 패치버전이 올라가고, 큰 업데이트가 필요할 때만 원하는 버전으로 직접 지정할 수 있어 유연하게 관리할 수 있었다.

4. GitHub Secrets 관리

  • App Store Connect API Key(.p8 파일), Key ID, Issuer ID, MATCH_PASSWORD와 같은 민감 정보를 GitHub Secrets에 등록하고, Actions에서 파일로 생성하는 과정이 처음에는 익숙하지 않아서 설정하는데 오래 걸렸다.
  • Secrets가 누락되거나 오타가 있을 경우, Actions에서 인증 에러가 발생해 디버깅에 시간이 소요됐다.

5. Fastlane과 GitHub Actions의 연동

  • Fastlane만으로는 로컬 자동화는 쉽지만, CI/CD 환경에서는 GitHub Actions와의 연동이 필수였다.
  • 각 환경(로컬/CI)에서 필요한 파일 경로, 환경변수, 인증 방식이 달라서 세밀한 설정과 반복적인 테스트가 필요했다.
  • 특히, 인증서 동기화(match)와 App Store Connect API 인증을 Actions에서 자동화하는 과정에서 시행착오가 많았다.

자동화 이후, 달라진 점

  • develop 브랜치: push/PR 시 TestFlight로 자동 배포, 빌드 넘버 자동 증가
  • main 브랜치: push/PR 시 App Store로 자동 배포, 빌드 넘버 유지
  • Secrets 관리: 모든 민감 정보는 GitHub Secrets로 안전하게 관리
  • CI/CD 신뢰성: 사람이 직접 배포하지 않아도, 브랜치 전략만 잘 지키면 자동으로 최신 빌드가 배포됨

결론: 자동화는 선택이 아닌 필수

이번 CI/CD 구축을 통해 iOS 앱의 배포 효율성과 신뢰성을 크게 높일 수 있었다. 특히 Fastlane과 GitHub Actions의 연동, 그리고 GitHub Secrets를 통한 민감 정보 관리의 중요성을 실전에서 체감할 수 있었다.

처음에는 인증, 환경변수, 브랜치 전략, 루비/번들러 버전, 빌드/테스트 타겟 등에서 어려움이 있었지만, 문제를 하나씩 해결하면서 자동화 파이프라인 구축에 대한 자신감도 함께 키울 수 있었다.

이 경험을 바탕으로 앞으로 더 복잡한 자동화, 다양한 배포 전략에도 유연하게 대응할 수 있을 것 같다. CI/CD 구축 경험은 iOS 개발자로서의 성장에 큰 자산이 될 것이다.


profile
꾸준🐢

0개의 댓글