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 관련 설정
- 관련 설정은 이전 글 참조
- https://kvngwxxk.tistory.com/45
- 관련 설정은 이전 글 참조
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)
- 변수 설정(Optional)
- 기존 build 폴더 삭제(shell 명령어)
- build 폴더 존재시 xcarchive가 생성되지 않음(already exist framework)
- 현재 브랜치를 가져와서 git pull
- buildScript 실행을 통해 xcarchive 및 xcframework 빌드(build 폴더에서 생성)
- podspec에 명시된 version 업데이트
- Framework의 info.plist의 값을 가져올 수 있기 때문에 podspec의 version을 프레임워크의 Info.plist를 통해 일치시키는 방법 고려
- pod spec 유효성 검사(pod_lib_lint)(Optional)
- git add podspec
- git commit podspec
- git tag 추가 → podspec에 명시된 버전과 같은 태그 생성 후 추가
- git push(push_to_git_remote)
- pod spec 유효성 검사(pod_lib_lint)(Optional)
- pod push
- Fastlane 프로세스(build_lane)
- 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에 관련한 분석 필요