콘텐츠로 이동

헤드리스 CI에서 fastlane export 서명 오류와 세션 갱신 job 정리

Jenkins에서 fastlane으로 iOS 빌드를 할 때 아래 에러가 반복됐다.

error: exportArchive No Accounts
error: 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 코드를 수동으로 입력해야 하므로 완전 자동 갱신은 할 수 없다.