Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
8696137
style: 정확하게 테플이라는 이름 명시
opficdev Mar 9, 2026
6772079
refactor: 앱 빌드 시간 단축
opficdev Mar 9, 2026
d4fc32f
chore: fastlane/README.md 추적 끄기
opficdev Mar 9, 2026
1822757
test: lint 모듈 validation 스킵
opficdev Mar 9, 2026
e8dc7d4
fix: 내부 testflight 이름과 겹치는 현상 수정
opficdev Mar 9, 2026
c02c960
fix: export_method 수정
opficdev Mar 9, 2026
0c61521
chore: 테스트플라이트 CI 배포 서명 설정 수정
opficdev Mar 9, 2026
ae00be7
chore: 테스트플라이트 CI 서명 옵션 보정
opficdev Mar 9, 2026
2ba7707
fix: fastlane 배포용 인증서 설치 흐름 수정
opficdev Mar 10, 2026
51c4b57
feat: Apple Store Connect에 올라간 최신 빌드 번호 + 1 형태로 새 빌드 번호를 규정하도록 추가
opficdev Mar 10, 2026
e4fef3f
feat: 타깃의 Release 서명을 수동으로 고정
opficdev Mar 10, 2026
34b6453
style: 문자열 상수화
opficdev Mar 10, 2026
96ecc93
fix: Apple Store Connect에서 최신 빌드번호를 조회하지 못하는 이슈 해결
opficdev Mar 10, 2026
550568b
fix: fastlane 대신 spaceship을 통해 가져오도록 변경
opficdev Mar 10, 2026
345eccb
fix: CI 환경에서 시크릿키로 생성되는 p8 파일 위치를 찾지 못하는 현상 해결
opficdev Mar 10, 2026
47765c9
fix: 경로 이슈 해결
opficdev Mar 10, 2026
fe1a1e0
test: 토큰 재생성 대신 기존에 생성한 것을 그대로 사용하도록 수정
opficdev Mar 10, 2026
db8f37c
refactor: api_key 자체를 넘기도록 개선
opficdev Mar 10, 2026
064633c
test: 해시값 디버깅
opficdev Mar 10, 2026
f147a53
test: 키 해시 확인
opficdev Mar 10, 2026
e7564fa
style: 디버깅 코드 제거
opficdev Mar 10, 2026
1e7091d
feat: 태그 기반으로 testflight 배포
opficdev Mar 10, 2026
e48f499
feat: 깃헙 릴리즈 자동화
opficdev Mar 10, 2026
776987d
Merge branch 'develop' into fix/#225-fastlane
opficdev Mar 10, 2026
aa6b306
feat: 앱스토어 버전은 빌드를 새로 만들지 않고 TestFlight용으로 만들어진 최신 빌드를 사용하도록 변경
opficdev Mar 10, 2026
9329c9c
Merge branch 'fix/#225-fastlane' of https://github.com/opficdev/Swift…
opficdev Mar 10, 2026
02e40b3
style: 스네이크 케이스 적용
opficdev Mar 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ env:
MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }}

permissions:
contents: read
contents: write

jobs:
release:
Expand Down Expand Up @@ -62,3 +62,24 @@ jobs:

- name: Release to App Store Connect
run: bundle exec fastlane release

- name: Read release version
id: release_version
run: |
version=$(ruby -e 'project = File.read("DevLog.xcodeproj/project.pbxproj"); match = project.match(/MARKETING_VERSION = ([^;]+);/); abort("MARKETING_VERSION not found") if match.nil?; puts match[1]')
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "tag=v$version" >> "$GITHUB_OUTPUT"

- name: Create GitHub Release
env:
GH_TOKEN: ${{ github.token }}
run: |
if gh release view "${{ steps.release_version.outputs.tag }}" >/dev/null 2>&1; then
echo "Release already exists for ${{ steps.release_version.outputs.tag }}"
exit 0
fi

gh release create "${{ steps.release_version.outputs.tag }}" \
--target "${{ github.event.pull_request.merge_commit_sha }}" \
--title "${{ steps.release_version.outputs.tag }}" \
--generate-notes
4 changes: 2 additions & 2 deletions .github/workflows/testflight.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ name: iOS TestFlight

on:
push:
branches:
- develop
tags:
- "qa-*"
workflow_dispatch:

env:
Expand Down
37 changes: 25 additions & 12 deletions fastlane/Fastfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,17 @@ platform :ios do
private_lane :fetch_latest_testflight_build_number do |options|
require "spaceship"

apiKey = options[:api_key]
versionNumber = options[:version]
api_key = options[:api_key]
version_number = options[:version]

Spaceship::ConnectAPI.token = Spaceship::ConnectAPI::Token.create(**apiKey)
Spaceship::ConnectAPI.token = Spaceship::ConnectAPI::Token.create(**api_key)

app = Spaceship::ConnectAPI::App.find(APP_IDENTIFIER)
UI.user_error!("Could not find app for #{APP_IDENTIFIER}") if app.nil?

filter = {
"state" => "PROCESSING,FAILED,COMPLETE",
"cfBundleShortVersionString" => versionNumber,
"cfBundleShortVersionString" => version_number,
"platform" => Spaceship::ConnectAPI::Platform.map("ios")
}

Expand Down Expand Up @@ -54,21 +54,21 @@ platform :ios do

api_key = asc_api_key

versionNumber = get_version_number(
version_number = get_version_number(
xcodeproj: XCODE_PROJ,
target: TARGET_NAME
)

latestTestflightBuildNumber = fetch_latest_testflight_build_number(
latest_testflight_build_number = fetch_latest_testflight_build_number(
api_key: api_key,
version: versionNumber
version: version_number
)

setup_ci if ENV["CI"]

increment_build_number(
xcodeproj: XCODE_PROJ,
build_number: latestTestflightBuildNumber + 1
build_number: latest_testflight_build_number + 1
)

match(
Expand All @@ -84,8 +84,8 @@ platform :ios do
)

if ENV["CI"] == "true"
provisioningProfileSpecifier = lane_context[SharedValues::MATCH_PROVISIONING_PROFILE_MAPPING][APP_IDENTIFIER].to_s
UI.user_error!("Missing App Store provisioning profile mapping for #{APP_IDENTIFIER}") if provisioningProfileSpecifier.empty?
provisioning_profile_specifier = lane_context[SharedValues::MATCH_PROVISIONING_PROFILE_MAPPING][APP_IDENTIFIER].to_s
UI.user_error!("Missing App Store provisioning profile mapping for #{APP_IDENTIFIER}") if provisioning_profile_specifier.empty?

update_code_signing_settings(
use_automatic_signing: false,
Expand All @@ -95,7 +95,7 @@ platform :ios do
targets: [TARGET_NAME],
build_configurations: ["Release"],
code_sign_identity: "Apple Distribution",
profile_name: provisioningProfileSpecifier
profile_name: provisioning_profile_specifier
)
end

Expand Down Expand Up @@ -123,13 +123,26 @@ platform :ios do
end

lane :release do
api_key = build_for_store
api_key = asc_api_key
version_number = get_version_number(
xcodeproj: XCODE_PROJ,
target: TARGET_NAME
)
latest_testflight_build_number = fetch_latest_testflight_build_number(
api_key: api_key,
version: version_number
)

UI.user_error!("No existing TestFlight build found for #{version_number}") if latest_testflight_build_number <= 0

upload_to_app_store(
api_key: api_key,
app_version: version_number,
build_number: latest_testflight_build_number.to_s,
force: true,
skip_metadata: true,
skip_screenshots: true,
skip_binary_upload: true,
submit_for_review: true,
automatic_release: false
)
Expand Down