From bc8db8b1146d5a1d576d77bb6f344533e0cf6ef3 Mon Sep 17 00:00:00 2001 From: khyeji98 Date: Wed, 15 Jul 2026 10:23:12 +0900 Subject: [PATCH] =?UTF-8?q?[FIX]:=20TestFlight=20=EB=B0=B0=ED=8F=AC=20code?= =?UTF-8?q?sign=20=EB=AC=B4=ED=95=9C=20=EB=8C=80=EA=B8=B0=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 러너에 이미 있는 login 키체인을 재사용하면서 비밀번호가 불일치해 match 의 set-key-partition-list 가 실패했고, codesign 이 헤드리스 환경에서 뜰 수 없는 승인 팝업을 기다리며 2시간 멈춤 전용 build.keychain 을 새로 만들어 쓰도록 변경하고, 키체인 생성 실패를 삼키던 || true 제거. 잡에 timeout-minutes 상한 추가 --- .github/workflows/testflight-deploy.yml | 20 ++++++++++++++------ fastlane/Matchfile | 3 ++- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/.github/workflows/testflight-deploy.yml b/.github/workflows/testflight-deploy.yml index 4a1a738d..6b1e742a 100644 --- a/.github/workflows/testflight-deploy.yml +++ b/.github/workflows/testflight-deploy.yml @@ -18,6 +18,9 @@ jobs: # PR 이 머지된 경우 또는 수동 실행일 때만 동작 (단순 close 는 스킵) if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch' runs-on: macos-15 + # 서명 단계가 매달려도 러너를 오래 점유하지 않도록 상한을 둔다 + # (concurrency 가 cancel-in-progress: false 라 멈춘 잡이 후속 배포를 전부 막는다) + timeout-minutes: 60 env: # Appfile / Fastfile APP_IDENTIFIER: ${{ secrets.APP_IDENTIFIER }} @@ -26,6 +29,9 @@ jobs: # match MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} MATCH_KEYCHAIN_PASSWORD: ${{ secrets.MATCH_KEYCHAIN_PASSWORD }} + # 러너에 이미 있는 login 키체인은 비밀번호를 알 수 없어 match 의 set-key-partition-list 가 실패한다 + # → 전용 키체인을 새로 만들어 쓴다 (Matchfile 이 이 값을 참조) + MATCH_KEYCHAIN_NAME: build.keychain # 인증서 repo(private) 클론용 토큰 — Deploy 스텝에서 MATCH_GIT_BASIC_AUTHORIZATION 로 인코딩 CONFIG_PRIVATE_REPO_TOKEN: ${{ secrets.CONFIG_PRIVATE_REPO_TOKEN }} # App Store Connect API (Fastfile 변수명) @@ -62,14 +68,16 @@ jobs: echo "GITHUB_ACCESS_TOKEN=${CONFIG_PRIVATE_REPO_TOKEN}" > .env make download-privates - # Matchfile 이 keychain_name("login") 을 고정 사용하므로 CI 에서 login 키체인을 준비 + # 생성 실패를 무시하면 러너의 기존 키체인을 그대로 쓰게 되고, 비밀번호 불일치로 + # codesign 이 뜰 수 없는 승인 팝업을 기다리며 무한 대기한다. 실패 시 즉시 잡을 멈춘다. - name: Prepare keychain run: | - security create-keychain -p "$MATCH_KEYCHAIN_PASSWORD" login.keychain-db || true - security set-keychain-settings -lut 21600 login.keychain-db - security unlock-keychain -p "$MATCH_KEYCHAIN_PASSWORD" login.keychain-db - security list-keychains -d user -s login.keychain-db - security default-keychain -s login.keychain-db + security create-keychain -p "$MATCH_KEYCHAIN_PASSWORD" build.keychain + security set-keychain-settings -lut 21600 build.keychain + security unlock-keychain -p "$MATCH_KEYCHAIN_PASSWORD" build.keychain + # xcodebuild 가 시스템 인증서를 찾을 수 있도록 login 키체인도 검색 목록에 남긴다 + security list-keychains -d user -s build.keychain login.keychain-db + security default-keychain -s build.keychain # SPM 의존성 설치 (fastlane 의 ensure_workspace 가 generate 하기 전 선행) - name: Install dependencies diff --git a/fastlane/Matchfile b/fastlane/Matchfile index 9cbab992..48153e1c 100644 --- a/fastlane/Matchfile +++ b/fastlane/Matchfile @@ -6,7 +6,8 @@ include_all_certificates(true) shallow_clone(true) skip_certificate_matching(true) skip_confirmation(true) -keychain_name("login") +# 로컬은 login 키체인을 그대로 쓰고, CI 는 MATCH_KEYCHAIN_NAME 으로 전용 키체인을 지정한다 +keychain_name(ENV["MATCH_KEYCHAIN_NAME"] || "login") keychain_password(ENV["MATCH_KEYCHAIN_PASSWORD"]) # .env 파일에서 API 키가 있으면 임시 JSON 파일 생성 후 사용 완료시 자동 삭제