CI/CD 도입기
CI/CD 도입기
도입 이유
- 기존에는 사용하고 있는 프레임워크 중 하나가 시뮬레이터용 버전이 없어서 CI/CD가 불가능했는데 시뮬레이터용 버전을 생성함으로써 도입이 가능하게 됨!
- dev에 머지할 때마다 가끔 머지를 잘못해서 빌드가 안되는 문제가 발생했고 이로 인해 도입을 추진하게 됨 🙂
기본 원리
- Match
- 인증서 자동 관리
- 개발자가 누구인지 증명하는 서명 도구
- 프로비저닝 프로파일 관리
- 이 앱이 어디서 실행가능한지 정하는 허가증
- 인증서 자동 관리
- FastLane
- 자동으로 출시 혹은 Testflight에 배포하는 역할
- match는 fastlane의 subcommand
도입 과정
- Bitbucket의 self cost server를 추가하여 내 pc로 지정
- bitbucket cloud는 일정 비용이 들어서 현재는 나의 pc를 사용하는 걸로 세팅
- match private repo를 생성
-
프로젝트 repo에서 matchFile 작성
git_url("매치파일 url") storage_mode("git") type("development") app_identifier(["bundle identier"]) username("계정명") force_for_new_devices(true)
- 프로젝트 repo에서
fastlane match development
명령어 실행하여 인증서, 프로비저닝 파일 생성- 자동으로 match repo에 인증서 및 프로비저닝 파일이 생성됨
- 프로젝트 repo에서
Fastlane init
-
AppFile: 앱 기본 정보 설정
app_identifier("bundle identier") apple_id("계정ID") itc_team_id("App Store Connect Team ID") team_id("Developer Portal Team ID")
-
FastFile: 자동화 동작 정의
lane :beta do version = get_version_number( xcodeproj: "프로젝트명.xcodeproj", target: "프로젝트명" ) new_build = latest_testflight_build_number + 1 increment_build_number(build_number: new_build) build_app( scheme: "프로젝트명", export_method: "app-store", export_options: { provisioningProfiles: { "bundle identifer" => "provisioning profile" } } ) upload_to_testflight tag_name = "v#{version}_build#{new_build}" add_git_tag(tag: tag_name) push_git_tags slack( message: "iOS Testflight 배포에 성공했습니다! #{tag_name}", slack_url: "슬랙 수신웹후크 url" ) end
-
-
pipeLine 코드 작성
pipelines: branches: develop: # develop 브랜치에 push → CI 실행 - step: runs-on: - self.hosted - macos script: - xcodebuild -project 프로젝트명.xcodeproj -scheme 프로젝트명 -destination 'platform=iOS Simulator,name=iPhone 16,OS=18.0' clean build main: # main 브랜치에 push → testflight CD 실행 - step: runs-on: - self.hosted - macos script: - fastlane beta
Test 코드 추가
- 기존에 있던 테스트 코드를 최근에 관리하고 있지 않았는데 이번 기회에 매주 릴리즈를 하기로 했기에 이번에 같이 테스트 코드를 넣어보려고 한다
- 일단은 테스트 코드는 XCTest를 그대로 유지하고 CICD에서 테스트를 돌리는 것만 진행하려고 함!
⇒ Test Plan을 추가해서 여러 테스트 모듈을 관리하고 그 후에 해당 TestPlan을 실행
pipelines:
branches:
develop: # develop 브랜치에 push → CI 실행
- step:
runs-on:
- self.hosted
- macos
script:
- xcodebuild -project Uniwaffle_iOS.xcodeproj \
-scheme Uniwaffle_iOS \
-testPlan Uniwaffle_iOS_Test \
-destination 'platform=iOS Simulator,name=iPhone 16,OS=18.3.1' \
-derivedDataPath ./build \
clean test | xcpretty --test --color
main: # main 브랜치에 push → testflight CD 실행
- step:
runs-on:
- self.hosted
- macos
script:
- fastlane beta