헤드리스 CI에서 fastlane export 서명 오류와 세션 갱신 job 정리
Jenkins에서 fastlane으로 iOS 빌드를 할 때 아래 에러가 반복됐다.
error: exportArchive No Accountserror: exportArchive No signing certificate "iOS Distribution" found빌드 머신의 Xcode에 Apple ID로 수동 로그인하면 한 번은 성공하지만, Jenkins job을 다시 빌드하면 또 실패했다.
build_app의 export_options에 allowProvisioningUpdates: true가 있으면 export 단계에서 Apple 계정에 접속하려 한다. CI 환경에는 Xcode 계정이 없어서 실패한다.
해결 1: export 단계의 프로비저닝 갱신 끄기
섹션 제목: “해결 1: export 단계의 프로비저닝 갱신 끄기”fastlane/Fastfile에서 export 옵션만 바꿨다.
변경 전:
export_options: { allowProvisioningUpdates: true, signingStyle: "automatic"}변경 후:
export_options: { allowProvisioningUpdates: false, signingStyle: "automatic"}단계별 영향은 다음과 같다.
| 단계 | 변경 | 설명 |
|---|---|---|
archive (xcargs) |
유지 (-allowProvisioningUpdates) |
archive 중 프로비저닝 갱신 가능 |
export (export_options) |
false로 변경 |
IPA 추출 시 Apple 계정에 접속하지 않음 |
upload (upload_to_testflight) |
변경 없음 | ASC API 키로 인증 (2FA 불필요) |
함께 바꾼 점과 주의할 점:
- Xcode 15 이상의 deprecation 경고에 맞춰
export_method를"app-store-connect"로 바꿨다. allowProvisioningUpdates: false이므로 빌드 머신에 유효한 프로비저닝 프로파일이 미리 설치되어 있어야 한다.- 프로파일이 만료되면(보통 1년) 수동으로 갱신해야 한다.
해결 2: 세션 갱신 Jenkins job 정리
섹션 제목: “해결 2: 세션 갱신 Jenkins job 정리”Apple ID 세션(FASTLANE_SESSION)을 갱신하던 Jenkins job의 이름을 세션 갱신 용도가 드러나게 바꾸고 동작을 고쳤다.
- 기존 job은
pbpaste(클립보드)로 세션 값을 가져왔다. 헤드리스 CI에서는 클립보드가 동작하지 않는다. .env파일에 콘솔 출력이 계속 append되어 불필요한 출력 505줄이 쌓였다.
변경 내용
섹션 제목: “변경 내용”.env를 초기화해FASTLANE_APPLE_ID,FASTLANE_PASSWORD,FASTLANE_SESSION세 줄만 남겼다.update_session.sh를 새로 만들었다.fastlane spaceauth를 실행한 뒤 출력에서 세션 값을 직접 파싱하고(pbpaste의존 제거), 이 job과 앱별 fastlane 디렉터리의.env파일들에 있는FASTLANE_SESSION을 append가 아니라 교체한다.
Jenkins job 셸 스크립트 변경 전:
echo y | fastlane spaceauth -u <APPLE_ID>echo "export FASTLANE_SESSION=$(pbpaste)" >> ${WORKSPACE}/.env변경 후:
unset FASTLANE_SESSION${WORKSPACE}/update_session.sh- 현재 기본 인증은 ASC API 키이고 export 단계의
allowProvisioningUpdates도 꺼져 있어, 정상 빌드 흐름에서는FASTLANE_SESSION이 필요 없다. - ID/Password 모드로 바꾸거나
allowProvisioningUpdates를 다시 켤 경우를 대비해 세션 갱신 job은 남겨 둔다. fastlane spaceauth는 2FA 코드를 수동으로 입력해야 하므로 완전 자동 갱신은 할 수 없다.