iOS

iOS) Fastlane으로 Private Pod 자동 빌드하기

kangwook 2022. 11. 1. 22:31

테스트 목적

  • Fastlane을 통해 Private Framework를 자동으로 빌드하고 CocoaPods으로 배포하도록 하기 위해 테스트 실시

환경

  • macOS Big Sur 11.5.1
  • Fastlane 2.210.1
  • CocoaPods 1.11.3
  • Bundler 2.2.33

사전 설정

  • gem install cocoapods, gem install bundler를 통해 CocoaPods과 Bundler를 설치
  • brew install fastlane을 통해 fastlane 설치
    • gem install fastlane도 가능
  • podspec을 생성한 프레임워크 프로젝트와 해당 프로젝트의 git
  • podspec들을 관리할 git
  • podspec 관련 설정
 

iOS) CocoaPods에 Private Framework 추가해서 배포하기

https://kvngwxxk.tistory.com/9 iOS) CocoaPods에 Private Framework 추가하기 iOS를 하면서 가장 많이 쓰는 툴이라고 하면 단연코 CocoaPods이라고 할 수 있겠다. 하지만 내가 직접 만든 프레임워크를 CocoaPods을 통해

kvngwxxk.tistory.com

  • 이미 Framework가 Private Pod으로 배포가 되어있다는 가정하에 테스트 진행
  • gitignore에는 fastlane, xcode, cocoapods, swift, macos와 관련된 사항을 추가했고, xcode와 관련된 항목 중, build폴더에 대한 부분은 제외함
  • 프로젝트 디렉토리가 존재하지 않을 경우 git clone을 통해 프로젝트 디렉토리를 git으로부터 받아와야 함

프로젝트 디렉토리

  • kwxcframework : git 최상단 디렉토리
  •  KWXCFramework : xcodeproj가 존재하는 디렉토리
  •     ㄴ build : xcarchive, xcframework의 빌드 output이 존재할 디렉토리
  •     ㄴ fastlane : fastlane 관련 파일들이 존재하는 디렉토리
  •     ㄴ KWXCFramework : 프레임워크의 소스코드들이 존재하는 디렉토리 

본 테스트에서 사용한 프레임워크는 간단한 로그를 출력할 수 있는 LogManager를 작성

테스트 진행

  • iOS Project가 존재하는 디렉토리에서 fastlane init을 통해 fastlane 초기화
    • 위 디렉토리 상으로 /kwxcframework/KWXCFramework 에서 명령어 입력
  • fastlane init을 하게 되면 Appfile, Fastfile, Gemfile이 생성, 이를 각각 설정해주어야 함
  • Fastfile에는 Fastlane으로 실행할 프로세스를 설정하는데, 본 테스트에서는 다음과 같은 프로세스로 진행
    • Fastlane 프로세스(build_lane)
      1. 변수 설정(Optional)
      2. 기존 build 폴더 삭제(shell 명령어)
        • build 폴더 존재시 xcarchive가 생성되지 않음(already exist framework)
      3. 현재 브랜치를 가져와서 git pull
      4. buildScript 실행을 통해 xcarchive 및 xcframework 빌드(build 폴더에서 생성)
      5. podspec에 명시된 version 업데이트
        • Framework의 info.plist의 값을 가져올 수 있기 때문에 podspec의 version을 프레임워크의 Info.plist를 통해 일치시키는 방법 고려
      6. pod spec 유효성 검사(pod_lib_lint)(Optional)
      7. git add podspec
      8. git commit podspec
      9. git tag 추가 → podspec에 명시된 버전과 같은 태그 생성 후 추가
      10. git push(push_to_git_remote)
      11. pod spec 유효성 검사(pod_lib_lint)(Optional)
      12. pod push
  • Fastfile에 해당 작업을 수행하는 명령어 추가
default_platform(:ios)
# 1. 변수 설정(Optional)
podspec_name = "../KWXCFramework.podspec"
platform :ios do
  desc "This lane is for building xcframework and pushing podspec to pod repo"
  lane :build_lane do
    # 2. 기존 build 폴더 삭제
    sh("cd .. && rm -rf build")
     
    # 3. 현재 브랜치를 가져와서 git pull
    branch = git_branch
    sh("git pull origin #{branch}")
     
    # 4. buildScript 실행을 통해 xcarchive 및 xcframework 빌드(build 폴더에서 생성)
    sh("cd .. && ./buildScript.sh")
 
    # 5. podspec에 명시된 version 업데이트
    # - 버전을 명시하는 방법
    # version = version_bump_podspec(path: podspec_name, version_number: "0.1.7")
    # - major, minor, patch 버전을 한단계씩 업데이트 하는 방법
    version = version_bump_podspec(path: podspec_name, bump_type: "patch")
 
    # 6. pod spec 유효성 검사(pod_lib_lint)(Optional)
    pod_lib_lint(podspec: podspec_name, allow_warnings: true)
 
    # 7. Source Control : git add podspec
    git_add(path: podspec_name)
 
    # 8. Source Control : git commit podspec
    git_commit(path: [podspec_name], message: "#{version} release")
 
    # 9. Source Control : git tag 추가 → podspec에 명시된 버전과 같은 태그 생성 후 추가    
    add_git_tag(tag: "#{version}")
 
    # 10. Source Control : git push
    push_to_git_remote
 
    # 11. pod spec 유효성 검사(pod_lib_lint)(Optional)
    pod_lib_lint(podspec: podspec_name, allow_warnings: true)
 
    # 12. pod push
    pod_push(path: podspec_name, repo: "PrivatePodspecs", verbose: true)
  end
end
  •  gemfile에는 fastlane과 cocoapods을 추가

  • Framework의 코드 수정 후 Project → General → Version 수정
    • fastlane 기준으로 {major}.{minor}.{patch}

  • Framework git으로 push
    • 현재 git release branch에 올라간 Framework 버전 : 0.1.7, 기존 Private Pod에 등록된 Framework 버전 : 0.1.6

  • fastlane폴더가 존재하는 하위 디렉토리로 이동 후 Fastlane을 통한 자동 빌드 진행
    • 실행시킬 lane의 이름은 Fastfile에서 설정 가능

  • 빌드 프로세스에 따라 framework 빌드 및 pod push 진행

Fastlane 결과 및 소요시간 확인

  • 현재 git release branch에 올라간 Framework 버전 : 0.1.7, Private Pod에 등록된 Framework 버전 : 0.1.7

주의 사항 및 고려 사항

  • Private Framework를 CocoaPods을 통해 배포하는 과정 특성상 git tag, podspec version, framework version이 모두 일치해야해서 하나가 다를 경우 오류가 나며 과정이 중단되는데 만약 버전이나 태그가 Fastlane 빌드 과정 중 꼬이게 되면, podspec의 버전과 git에 올라가 있는 Framework의 버전, 중단된 시점, git tag 등을 확인해서 local 과 remote에서 tag를 지우고, podspec을 수정하는 등 복잡한 과정이 발생할 수 있음
  • Fastlane상에서 작업 실패시 처리하는 방법이 있는지 확인이 필요
  • 본 테스트에는 build_lane만 존재하지만, 작업에 따른 lane 분기 처리 및 세분화가 이뤄지면 실패 처리 및 과정을 확인하는데 용이할 것으로 예상
  • 본 테스트는 fastlane을 통해 build부터 pod push까지의 과정을 단편적으로 테스트하고 있지만, 실제로 적용하기 위해서는 각 과정에 대해 예외 처리 및 안정 장치가 필요할 것으로 예상
    • 각 과정마다 작업이 실패할 경우에 대해 분기처리를 해주어야 함
    • CI Transaction에 관련한 분석 필요