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