💻 이 글은
Xcode Version 13.3.1
,fastlane 2.206.2
를 바탕으로 작성하였습니다.
📌 참고
최근 개발용과 배포용 개발환경을 분리하면서 fastlane을 이용하여 배포시 인증 관련 문제가 발생하였습니다.
문제 해결 방법으로 팀원, 환경에 관계없이 자동으로 인증을 동기화 해주는 match
를 적용해보았고, 이와 관련된 내용을 정리하고자 합니다.
Easily sync your certificates and profiles across your team
A new approach to iOS and macOS code signing: Share one code signing identity across your development team to simplify your codesigning setup and prevent code signing issues.📚 관련 공식 문서
- fastlane match
https://docs.fastlane.tools/actions/match/>- code signing guide
https://codesigning.guide
iOS 앱 개발 및 배포를 위해서는 Certificate
와 Provisioning profile
이 필요합니다.
Provisioning profile
Provisioning profile
의 AppID
는 모두 동일하지만, 인증서 퍼블릭키
와 디바이스 정보
는 팀원 마다 각각 다른 값을 가지고 있습니다.
그렇다고 모든 개발자가 각각 배포 인증서
와 provisioning profile
을 발급 받게되면, 관리가 굉장히 번거롭고 동작도 제대로 하지 않는 경우가 빈번히 발생합니다. 또한 배포 인증서
는 발급받을 수 있는 개수의 한계가 있습니다.
fastlane
의 match
를 사용하게 되면 원격저장소에서 Certificate
와 Provisioning profile
를 저장하여 환경에 영향을 받지 않고 인증 을 받을 수 있게 됩니다.
인증 관련 파일들을 담을 원격 저장소를 생성해줍니다.
생성될 인증 파일들은 암호화 되어 저장이 되지만 굳이 public
으로 만들 필요는 없겠죠? private
으로 생성해주세요
fastlane match init
프로젝트의 루트 폴더에서 match 초기화를 위한 명령어를 실행합니다.
[✔] 🚀
[12:21:30]: fastlane match supports multiple storage modes, please select the one you want to use:
1. git
2. google_cloud
3. s3
? 1
깃허브 저장소를 이용할 것이기 때문에 1번을 선택했습니다.
[12:21:31]: Please create a new, private git repository to store the certificates and profiles there
[12:21:31]: URL of the Git Repo: https://github.com/ParkGyurim99/FastlaneCert // 📌
[12:21:34]: Successfully created './Matchfile'. You can open the file using a code editor.
[12:21:34]: You can now run `fastlane match development`, `fastlane match adhoc`, `fastlane match enterprise` and `fastlane match appstore`
[12:21:34]: On the first run for each environment it will create the provisioning profiles and
[12:21:34]: certificates for you. From then on, it will automatically import the existing profiles.
[12:21:34]: For more information visit https://docs.fastlane.tools/actions/match/
아까 생성한 저장소의 URL 을 입력해주면 fastlane 폴더 안에 Matchfile
이 생성됩니다.
git_url("https://github.com/ParkGyurim99/FastlaneCert")
storage_mode("git")
type("development") # The default type, can be: appstore, adhoc, enterprise or development
# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"]) // 📌
# username("user@fastlane.tools") # Your Apple Developer Portal username // 📌
# For all available options run `fastlane match --help`
# Remove the # in the beginning of the line to enable the other options
# The docs are available on https://docs.fastlane.tools/actions/match
Matchfile
이 위와 같이 생성이 됩니다. 여기서 type()
과 app_identifier()
, username()
을 프로젝트에 맞게 변경해주세요.
우선 match 에 사용할 인증서를 생성하기 전에 기존의 인증서를 삭제 하는 것을 권장하고 있습니다.
인증서가 많아지면 관리가 불편해지고, 인증서의 개수에도 한계가 있기때문에 권장하고 있습니다. (필수는 아닙니다!)
아래 명령어를 통해 인증서를 기존 인증서를 삭제할 수 있습니다.
fastlane match nuke development fastlane match nuke distribution
Matchfile
설정이 끝났으니 이제 원격저장소에 인증서를 생성해줍니다.
fastlane match appstore
배포용 인증서를 생성할 것이기 때문에 appstore
명령어를 실행합니다.
이제 Matchfile
의 내용을 바탕으로 원격 저장소에 인증서를 생성하기 시작합니다.
[✔] 🚀
[12:26:45]: Get started using a Gemfile for fastlane https://docs.fastlane.tools/getting-started/ios/setup/#use-a-gemfile
[12:26:47]: Successfully loaded '/Users/ParkGyurim/Documents/GitHub/FastlaneCert/Matchfile' 📄
+--------------+----------------------------------------------+
| Detected Values from './Matchfile' |
+--------------+----------------------------------------------+
| git_url | https://github.com/ParkGyurim99/FastlaneCert |
| storage_mode | git |
| type | appstore |
+--------------+----------------------------------------------+
...
이때, 만들어진 키를 암호화하기 위해 passphrase
생성을 요구할 수 있는데, 입력 후 해당 값을 기억해놓아야합니다!!
또한, 애플 계정의 자격을 확인하기 위해 애플 계정 메일 주소를 요구할 수 있고, 입력해주면 확인을 진행합니다.
[12:30:24]: All required keys, certificates and provisioning profiles are installed 🙌
잠시 뒤, 위와 같은 로그가 확인되면 원격 저장소에 인증 파일 생성이 완료되었습니다!!
match(type: "appstore")
각 lane
에서 빌드를 진행하기 전에 인증서 연결을 위해 위 코드를 입력해주게되면
이제 fastlane
에서 match
를 통해 자동으로 인증서를 연결해주어 사용자와 환경에 관계없이 개발 및 배포를 진행할 수 있습니다!
ex)
platform :ios do
desc "Push a new beta build to TestFlight"
lane :beta do
match(type: "appstore")
build_app(workspace: "[target project].xcworkspace", scheme: "[target scheme]")
upload_to_testflight
end
...
특히 iOS 에서는 인증서, 키, Xcode 등 개발과 직접적인 관계없는 부분에서 항상 부딪히는 부분이 많이 발생하는 것 같습니다..
그렇기에 여러 팀원들과 여러 개발환경에서 인증서 관리를 원격 저장소에서 쉽게 관리할 수 있는 match
를 사용해보니 엄청 간편함을 느낄 수 있었고, 또한 fastlane 의 활용 방향이 무궁무진하다라고 느꼈습니다.
틀린 정보 또는 궁금한 점이 있다면 댓글 부탁드립니다! 읽어주셔서 감사합니다‼️