3단계 · 서명과 산출물을 따로 확인
Fastfile 하나로 match, gym, pilot 연결
먼저 프로젝트 루트에서 bundle install을 실행하고 Gemfile.lock을 커밋하세요. 아래 절차는 서명 저장소가 이미 초기화되었고 앱이 생성되어 있으며 CI에 환경 변수가 안전하게 주입된 상태를 전제로 합니다. 새로운 서명 자산을 만드는 절차는 포함하지 않습니다.
원격 사전 점검 · 먼저 툴체인 확인
xcode-select -p
xcodebuild -version
xcodebuild -showsdks
ruby --version
bundle --version
bundle exec fastlane --version
security find-identity -v -p codesigning
df -h "$HOME"
서명 저장소 주소는 MATCH_GIT_URL에, 복호화 암호는 MATCH_PASSWORD에 설정하세요. 업로드 인증에는 서버 측 API 키를 사용합니다. 키 파일 경로는 ASC_KEY_PATH 로 지정하고, 키 ID와 발급자 ID는 각각 ASC_KEY_ID, ASC_ISSUER_ID 로 지정하세요. 키 파일은 CI 비밀 저장소에서 관리하고 실행 중에만 파일로 생성하세요. 프로젝트 저장소에 커밋하지 마세요.
다음을 설정하세요: IOS_APP_IDENTIFIER, IOS_TEAM_ID, IOS_WORKSPACE 및 IOS_SCHEME. 서명 저장소의 배포 유형은 appstore 와 일치해야 합니다. 먼저 공유 scheme을 확인한 다음 전체 파이프라인을 실행하세요.
fastlane/Fastfile · 단일 앱용 TestFlight 파이프라인
default_platform(:ios)
platform :ios do
desc "Archive a signed build and upload it to TestFlight"
lane :release do
setup_ci
api_key = app_store_connect_api_key(
key_id: ENV.fetch("ASC_KEY_ID"),
issuer_id: ENV.fetch("ASC_ISSUER_ID"),
key_filepath: ENV.fetch("ASC_KEY_PATH"),
in_house: false
)
match(
type: "appstore",
readonly: true,
git_url: ENV.fetch("MATCH_GIT_URL"),
app_identifier: ENV.fetch("IOS_APP_IDENTIFIER"),
team_id: ENV.fetch("IOS_TEAM_ID"),
api_key: api_key
)
gym(
workspace: ENV.fetch("IOS_WORKSPACE"),
scheme: ENV.fetch("IOS_SCHEME"),
configuration: "Release",
clean: true,
export_method: "app-store",
output_directory: "build/artifacts",
output_name: "release.ipa"
)
pilot(
api_key: api_key,
ipa: "build/artifacts/release.ipa",
skip_waiting_for_build_processing: true
)
end
end
실행 및 확인 · CI에서 환경 변수 주입
bundle exec fastlane ios release
find build/artifacts -maxdepth 1 -type f -print
업로드가 성공해도 처리가 완료된 것은 아닙니다.이 예시는 업로드 후 처리 완료를 기다리지 않습니다. 배포 콘솔에서 빌드 처리 결과를 확인하고, 업로드할 때마다 고유한 빌드 번호를 사용하세요.readonly: true 로 설정하면 CI가 서명 저장소를 수정하지 못합니다. 인증서나 프로비저닝 프로파일이 만료되면 통제된 환경에서 갱신한 뒤 다시 실행하세요.