Skip to content

Chore/#25 fastlane test fllight#26

Merged
ChoiAnYong merged 5 commits into
developfrom
chore/#25-fastlaneTestFllight
Feb 14, 2026
Merged

Chore/#25 fastlane test fllight#26
ChoiAnYong merged 5 commits into
developfrom
chore/#25-fastlaneTestFllight

Conversation

@ChoiAnYong
Copy link
Copy Markdown
Contributor

@ChoiAnYong ChoiAnYong commented Feb 14, 2026

🔗 연결된 이슈

📄 작업 내용

  • fastlane 테스트플라이트 업로드 lane 구현

Summary by CodeRabbit

릴리스 노트

  • Chores

    • 빌드 및 배포 워크플로우 개선 (인증서 동기화, 자동화된 배포, 디버그 심볼 처리 포함)
    • 빌드 시스템 구성 업데이트
  • Documentation

    • 빌드 도구 관련 문서 갱신 및 설치 지침 개선

@ChoiAnYong ChoiAnYong requested a review from KimNahun February 14, 2026 01:00
@ChoiAnYong ChoiAnYong self-assigned this Feb 14, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Feb 14, 2026

Walkthrough

TestFlight 업로드 자동화를 위해 fastlane 빌드/배포 워크플로우를 구성했습니다. .gitignore에 iOS 앱 패키징 파일 패턴을 추가하고, Makefile에 release 대상을 정의하며, Fastfile의 release 레인에 인증서 동기화, 빌드, App Store Connect API 키 처리, TestFlight 업로드, dSYM 다운로드, Discord 알림 단계를 구현했습니다.

Changes

Cohort / File(s) Summary
환경 설정
.gitignore, Makefile
iOS 앱 패키징 산출물(*.ipa, *.dSYM.zip, *.dSYM) 무시 패턴 추가 및 bundle exec fastlane release 실행 대상 추가
빌드 설정
Plugins/EnvPlugin/ProjectDescriptionHelpers/Settings+Extension.swift
PRODUCT_NAME을 Environment.App.displayName에서 Project.Environment.appName으로 변경
Fastlane 배포 구성
fastlane/Fastfile
release 레인을 인증서 동기화, 완전한 xcodebuild 설정, App Store Connect API 키 처리, TestFlight 업로드, dSYM 다운로드, Discord 알림을 포함하는 포괄적인 배포 시퀀스로 재구성
문서 업데이트
fastlane/README.md
설치 지침을 xcode-select로 변경하고, iOS 특화 서브섹션으로 사용 가능한 액션(ci_check, release, register_new_device) 구조화, fastlane.tools 참고 문서 링크 업데이트

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant Makefile
    participant Fastlane as Fastlane (release)
    participant Git as Git (match)
    participant Xcode as Xcode Build
    participant ASC as App Store Connect
    participant TestFlight
    participant dSYM as dSYM Service
    participant Discord

    User->>Makefile: make release
    Makefile->>Fastlane: bundle exec fastlane release
    
    Fastlane->>Git: match(type: appstore, readonly: true)
    Git-->>Fastlane: Certificates synchronized
    
    Fastlane->>Xcode: build_app (NDGL-iOS.xcworkspace)
    Xcode-->>Fastlane: IPA + build artifacts
    
    Fastlane->>ASC: app_store_connect_api_key
    ASC-->>Fastlane: API key retrieved
    
    Fastlane->>Git: match config with API key
    Git-->>Fastlane: Provisioning profiles updated
    
    Fastlane->>TestFlight: upload_to_testflight (API key)
    TestFlight-->>Fastlane: Build uploaded
    
    Fastlane->>dSYM: download_dsyms (API key)
    dSYM-->>Fastlane: dSYMs downloaded
    
    Fastlane->>Discord: send_discord_message (success)
    Discord-->>User: Release notification
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 빌드 파이프라인 춤을 춘다면,
인증서와 TestFlight이 손을 잡고,
dSYM 기호들이 하늘을 수놓으니,
디스코드의 울음소리로 축하받는다네! 🚀✨

🚥 Pre-merge checks | ✅ 4 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Merge Conflict Detection ⚠️ Warning ⚠️ Unable to check for merge conflicts: Invalid branch name format
Title check ❓ Inconclusive PR 제목이 너무 모호하고 일반적입니다. 'fastlane test fllight'는 오타 가능성이 있으며, 주요 변경사항을 명확히 전달하지 못합니다. 제목을 'Implement fastlane release lane for TestFlight uploads' 같이 더 구체적이고 명확하게 수정하세요.
✅ Passed checks (4 passed)
Check name Status Explanation
Description check ✅ Passed PR 설명이 템플릿을 따르고 있으며, 연결된 이슈(#25)를 명시하고 핵심 작업 내용(fastlane 테스트플라이트 업로드 lane 구현)을 기술했습니다.
Linked Issues check ✅ Passed PR의 코드 변경사항들이 이슈 #25의 주요 요구사항인 'fastfile lane 구현'을 충족합니다. Fastfile의 release lane, Makefile 타겟, 설정 파일 등이 TestFlight 업로드를 위해 구현되었습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 fastlane TestFlight 업로드 설정과 관련된 범위 내입니다. .gitignore, Makefile, 빌드 설정, fastlane 구성, 문서 업데이트 모두 해당 목표를 지원합니다.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch chore/#25-fastlaneTestFllight
⚔️ Resolve merge conflicts (beta)
  • Auto-commit resolved conflicts to branch chore/#25-fastlaneTestFllight
  • Create stacked PR with resolved conflicts
  • Post resolved changes as copyable diffs in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
fastlane/Fastfile (1)

46-92: ⚠️ Potential issue | 🟠 Major

match가 두 번 호출되며, 두 번째 호출은 build_app 이후에 위치하여 서명에 영향을 주지 않습니다.

  • Line 49: match(type: "appstore", readonly: true) — 빌드 전 인증서 동기화 (올바른 위치)
  • Lines 69-75: match(git_url: ..., api_key: api_key, ...) — 빌드 다시 호출되므로 이미 완료된 빌드의 서명에 영향을 주지 않습니다.

의도가 api_key를 사용한 인증서 동기화라면, 첫 번째 match 호출을 api_key 생성 이후, build_app 이전으로 이동시키고 두 번째 호출을 제거해야 합니다.

♻️ match 호출 순서 수정 제안
     begin
-      # 1. 인증서 동기화
-      match(type: "appstore", readonly: true)
-
-      # 2. 앱 빌드
-      build_app(
-        ...
-      )
-
       # API Key 방식 TestFlight 업로드
       api_key = app_store_connect_api_key(
         key_id: ENV["APP_STORE_CONNECT_API_KEY_ID"],
         issuer_id: ENV["APP_STORE_CONNECT_API_ISSUER_ID"],
         key_content: ENV["APP_STORE_CONNECT_API_KEY_CONTENT"]
       )

-      match(
+      # 1. 인증서 동기화
+      match(
         git_url: ENV["REPOSITORY"],
         git_branch: ENV["BRANCH"],
         type: "appstore",
         readonly: true,
         api_key: api_key
       )

+      # 2. 앱 빌드
+      build_app(
+        ...
+      )
+
       # 3. TestFlight 업로드
🤖 Fix all issues with AI agents
In `@fastlane/Fastfile`:
- Around line 78-86: The current Fastfile uses
upload_to_testflight(skip_waiting_for_build_processing: true) followed
immediately by download_dsyms, which will fetch the previous build's dSYM
because processing hasn't completed; to fix, either (a) use the locally
generated dSYM from build_app instead of calling download_dsyms, (b) set
upload_to_testflight(skip_waiting_for_build_processing: false) so processing
completes before download_dsyms runs, or (c) move download_dsyms into a separate
lane/after-processing job to run after App Store Connect processing finishes;
additionally, ensure download_dsyms includes the App Store Connect credential by
adding api_key: api_key to its call (referencing upload_to_testflight,
download_dsyms, and build_app).

In `@Plugins/EnvPlugin/ProjectDescriptionHelpers/Settings`+Extension.swift:
- Line 46: Replace the unnecessary string interpolation for the PRODUCT_NAME
value by passing the String directly: change the value from
"\"(Project.Environment.appName)\"" to Project.Environment.appName for both
debug and release settings so PRODUCT_NAME uses the existing String without
interpolation; update the assignment where PRODUCT_NAME is set and ensure the
change is applied consistently in Settings+Extension.swift's settings extension.
🧹 Nitpick comments (2)
fastlane/Fastfile (2)

83-86: 앱 식별자 하드코딩 대신 환경 변수 또는 Appfile 활용 권장

app_identifier: "org.yapp.NDGL.App"이 하드코딩되어 있습니다. Appfile이나 환경 변수를 통해 관리하면 유지보수성이 향상됩니다.


52-60: 들여쓰기가 탭과 스페이스 혼용되어 있습니다.

build_app 블록 내 output_directory(Line 54), scheme(Line 55), output_name(Line 58), xcargs(Line 59) 등의 파라미터가 탭으로 들여쓰기되어 나머지 코드(스페이스)와 일관성이 없습니다. Lines 71, 79도 동일합니다. 통일된 들여쓰기(스페이스 권장)를 적용해 주세요.

Comment thread fastlane/Fastfile
Comment on lines +78 to +86
upload_to_testflight(
api_key: api_key,
skip_waiting_for_build_processing: true # 업로드 후 프로세싱 완료까지 기다리지 않음
)

download_dsyms(
app_identifier: "org.yapp.NDGL.App",
output_directory: "./Projects/App/Outputs/Archives/PROD"
)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

skip_waiting_for_build_processing: true 설정 시 download_dsyms가 현재 빌드의 dSYM을 받지 못합니다.

upload_to_testflight에서 skip_waiting_for_build_processing: true를 설정하면 빌드 프로세싱 완료를 기다리지 않으므로, 바로 이어서 호출되는 download_dsyms는 아직 프로세싱되지 않은 현재 빌드가 아닌 이전 빌드의 dSYM을 다운로드하게 됩니다.

대안:

  1. build_app이 이미 로컬에 dSYM을 생성하므로 별도 다운로드 없이 로컬 경로를 활용
  2. skip_waiting_for_build_processing: false로 변경하여 프로세싱 완료 후 다운로드
  3. download_dsyms 호출을 별도 레인이나 후속 작업으로 분리

또한, download_dsymsapi_key 파라미터가 누락되어 App Store Connect 인증에 실패할 수 있습니다.

🤖 Prompt for AI Agents
In `@fastlane/Fastfile` around lines 78 - 86, The current Fastfile uses
upload_to_testflight(skip_waiting_for_build_processing: true) followed
immediately by download_dsyms, which will fetch the previous build's dSYM
because processing hasn't completed; to fix, either (a) use the locally
generated dSYM from build_app instead of calling download_dsyms, (b) set
upload_to_testflight(skip_waiting_for_build_processing: false) so processing
completes before download_dsyms runs, or (c) move download_dsyms into a separate
lane/after-processing job to run after App Store Connect processing finishes;
additionally, ensure download_dsyms includes the App Store Connect credential by
adding api_key: api_key to its call (referencing upload_to_testflight,
download_dsyms, and build_app).

let debugSettings: [String: SettingValue] = [
"APP_DISPLAY_NAME": .string("\(Environment.App.displayName)-Dev"),
"PRODUCT_NAME": .string("\(Environment.App.displayName)"),
"PRODUCT_NAME": .string("\(Project.Environment.appName)"),
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# Find the Settings+Extension.swift file
fd -type f -name "Settings+Extension.swift"

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 245


🏁 Script executed:

# List files in the Plugins/EnvPlugin directory to understand structure
find Plugins/EnvPlugin -type f -name "*.swift" | head -20

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 363


🏁 Script executed:

# Search for Project.Environment and Environment definitions
rg -n "Project\.Environment|Environment\.App" --type swift -C 2 | head -50

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 3640


🏁 Script executed:

# Read the Settings+Extension.swift file to understand imports and full context
cat -n Plugins/EnvPlugin/ProjectDescriptionHelpers/Settings+Extension.swift

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 4193


🏁 Script executed:

# Read the Environment.swift file to see how Environment is defined
cat -n Plugins/EnvPlugin/ProjectDescriptionHelpers/Environment.swift

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 1030


🏁 Script executed:

# Search for Project.Environment definition in the codebase
rg -n "Project\.Environment|extension Project" --type-list swift

Repository: YAPP-Github/27th-App-Team-1-iOS

Length of output: 464


불필요한 문자열 보간 제거

Project.Environment.appName은 이미 String 타입이므로, 문자열 보간 "\(...)" 없이 직접 전달할 수 있습니다. 파일의 다른 설정들과 일치하도록 다음과 같이 수정하세요.

♻️ 제안된 변경
-            "PRODUCT_NAME": .string("\(Project.Environment.appName)"),
+            "PRODUCT_NAME": .string(Project.Environment.appName),

(debug와 release 모두 동일하게 적용)

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"PRODUCT_NAME": .string("\(Project.Environment.appName)"),
"PRODUCT_NAME": .string(Project.Environment.appName),
🤖 Prompt for AI Agents
In `@Plugins/EnvPlugin/ProjectDescriptionHelpers/Settings`+Extension.swift at line
46, Replace the unnecessary string interpolation for the PRODUCT_NAME value by
passing the String directly: change the value from
"\"(Project.Environment.appName)\"" to Project.Environment.appName for both
debug and release settings so PRODUCT_NAME uses the existing String without
interpolation; update the assignment where PRODUCT_NAME is set and ensure the
change is applied consistently in Settings+Extension.swift's settings extension.

@ChoiAnYong ChoiAnYong merged commit bbe422e into develop Feb 14, 2026
2 checks passed
@ChoiAnYong ChoiAnYong deleted the chore/#25-fastlaneTestFllight branch February 14, 2026 06:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore: fastlane 테스트플라이트 업로드 설정

1 participant