diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 000000000..39dcc19aa --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,74 @@ +# 디버그 모드로 내부 테스트플라이트 용도 +name: "[Debug] WSS iOS CI/CD - Internal TestFlight Deploy" + +# deploy 브랜치에 push될 때 실행 (브랜치네이밍은 임시) +on: + push: + branches: + - Feat/#609 + +jobs: + build-and-deploy: + name: Running CI/CD for WSS iOS Debug + runs-on: macos-14 + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + path: . + + - name: Set Xcode version + run: sudo xcode-select -s /Applications/Xcode_15.0.app/Contents/Developer + + # fastlane 을 위한 Ruby + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.1' + + - name: Install Bundler and Fastlane + run: | + gem install bundler + bundle install || gem install fastlane + + - name: Create temporary keychain + run: | + security create-keychain -p "ci_password" build.keychain + security default-keychain -s build.keychain + security unlock-keychain -p "ci_password" build.keychain + security set-keychain-settings -t 3600 -l ~/Library/Keychains/build.keychain + + # match 에서 인증서 복호화 할때 필요한 과정 + - name: Decrypt Certificates + run: | + brew install gnupg + mkdir -p ~/.gnupg + echo "${{ secrets.MATCH_GIT_PRIVATE_KEY }}" > ~/private-key.asc + gpg --batch --yes --import ~/private-key.asc + + - name: Debug - Print directory structut + run: | + echo "== CURRENT DIRECTORY ==" + pwd + echo "== FILE STRUCTURE ==" + ls -alR + + - name: Debug - Confirm .xcodeproj + run: | + echo "== FIND .xcodeproj FILES ==" + find . -name "*.xcodeproj" + echo "== VALIDATE project.pbxproj ==" + plutil -lint WSSiOS/WSSiOS.xcodeproj/project.pbxproj + + - name: Run Fastlane (internal) + working-directory: ${{ github.workspace }} + env: + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + MATCH_GIT_URL: https://x-access-token:${{ secrets.MATCH_GIT_TOKEN }}@${{ secrets.MATCH_GIT_URL }} + APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }} + APP_STORE_CONNECT_API_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_ISSUER_ID }} + APP_STORE_CONNECT_API_KEY_CONTENT: ${{ secrets.APP_STORE_CONNECT_API_KEY_CONTENT }} + FASTLANE_USER: ${{ secrets.FASTLANE_USER }} + FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }} + run: fastlane debug + diff --git a/.gitignore b/.gitignore index fa957ea85..3b5177189 100644 --- a/.gitignore +++ b/.gitignore @@ -94,3 +94,4 @@ fastlane/test_output iOSInjectionProject/ GoogleService-Info-Debug.plist GoogleService-Info.plist +.env diff --git a/WSSiOS/WSSiOS.xcodeproj/project.pbxproj b/WSSiOS/WSSiOS.xcodeproj/project.pbxproj index be452298e..a59ba6eb3 100644 --- a/WSSiOS/WSSiOS.xcodeproj/project.pbxproj +++ b/WSSiOS/WSSiOS.xcodeproj/project.pbxproj @@ -262,6 +262,7 @@ SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; }; @@ -322,6 +323,7 @@ SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; }; name = Release; }; @@ -336,7 +338,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2025032903; + CURRENT_PROJECT_VERSION = 202507242021; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = L4327HMP3S; GENERATE_INFOPLIST_FILE = YES; @@ -353,11 +355,11 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.1; + MARKETING_VERSION = 1.3.0; PRODUCT_BUNDLE_IDENTIFIER = kr.websoso.debug; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = websosoDebugProvisioning; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development kr.websoso.debug"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -379,7 +381,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2025032903; + CURRENT_PROJECT_VERSION = 202507242021; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = L4327HMP3S; GENERATE_INFOPLIST_FILE = YES; @@ -396,11 +398,11 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.1; + MARKETING_VERSION = 1.3.0; PRODUCT_BUNDLE_IDENTIFIER = kr.websoso; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = websosoReleaseProvisioning; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore kr.websoso"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; diff --git a/WSSiOS/WSSiOS/Source/Presentation/UserPage/MyPage/MyPageViewController/MyPageEditProfileViewController.swift b/WSSiOS/WSSiOS/Source/Presentation/UserPage/MyPage/MyPageViewController/MyPageEditProfileViewController.swift index f3718e5da..3dd0f9edf 100644 --- a/WSSiOS/WSSiOS/Source/Presentation/UserPage/MyPage/MyPageViewController/MyPageEditProfileViewController.swift +++ b/WSSiOS/WSSiOS/Source/Presentation/UserPage/MyPage/MyPageViewController/MyPageEditProfileViewController.swift @@ -168,7 +168,7 @@ final class MyPageEditProfileViewController: UIViewController { if !editing { owner.rootView.introTextView.endEditing(true) - } + } }) .disposed(by: disposeBag) diff --git a/WSSiOS/WSSiOS/Source/Presentation/UserPage/MyPage/MyPageViewModel/MyPageViewModel.swift b/WSSiOS/WSSiOS/Source/Presentation/UserPage/MyPage/MyPageViewModel/MyPageViewModel.swift index ddff360da..a6eec13b2 100644 --- a/WSSiOS/WSSiOS/Source/Presentation/UserPage/MyPage/MyPageViewModel/MyPageViewModel.swift +++ b/WSSiOS/WSSiOS/Source/Presentation/UserPage/MyPage/MyPageViewModel/MyPageViewModel.swift @@ -223,6 +223,7 @@ final class MyPageViewModel: ViewModelType { } } + private func handleKeywordCollectionViewHeight(resizeKeywordCollectionViewHeight: Observable) -> Observable { return resizeKeywordCollectionViewHeight .map { $0?.height ?? 0 } diff --git a/fastlane/Appfile b/fastlane/Appfile new file mode 100644 index 000000000..3db9e1919 --- /dev/null +++ b/fastlane/Appfile @@ -0,0 +1,2 @@ +apple_id("dev.shinena@gmail.com") +itc_team_id("127138049") diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 000000000..134582072 --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,44 @@ +default_platform(:ios) + +platform :ios do + desc "App Store Connect 배포 (Release)" + lane :appstore do + match(type: "appstore") + + build_app( + scheme: "WSSiOS", + configuration: "Release", + export_method: "app-store", + output_name: "WSSiOS.ipa" + ) + + upload_to_app_store + end + + desc "TestFlight 내부 배포 (Debug)" + lane :debug do + match( + type: "appstore", + readonly: true, + app_identifier: "kr.websoso.debug" + ) + + time_based_number = Time.now.strftime("%Y%m%d%H%M") + increment_build_number( + build_number: time_based_number, + xcodeproj: "WSSiOS/WSSiOS.xcodeproj" + ) + + build_app( + scheme: "WSSiOS", + configuration: "Debug", + export_method: "app-store", + project: "WSSiOS/WSSiOS.xcodeproj" + ) + + upload_to_testflight( + distribute_external: false, + skip_waiting_for_build_processing: true + ) + end +end diff --git a/fastlane/README.md b/fastlane/README.md new file mode 100644 index 000000000..70d83dae3 --- /dev/null +++ b/fastlane/README.md @@ -0,0 +1,40 @@ +fastlane documentation +---- + +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +```sh +xcode-select --install +``` + +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) + +# Available Actions + +## iOS + +### ios appstore + +```sh +[bundle exec] fastlane ios appstore +``` + +App Store Connect 배포 (Release) + +### ios debug + +```sh +[bundle exec] fastlane ios debug +``` + +TestFlight 내부 배포 (Debug) + +---- + +This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).