diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cf698b4..c81e113 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ on: jobs: test: name: Run Tests - runs-on: macos-15 + runs-on: macos-14 steps: - name: Checkout @@ -61,7 +61,7 @@ jobs: build: name: Build Verification - runs-on: macos-15 + runs-on: macos-14 steps: - name: Checkout diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 6295ba0..61a4a90 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,135 +1,136 @@ # ============================================================================ # Xcode 26.0을 GitHub Actions에서 지원할 때까지 임시 비활성화 -# ============================================================================ - -# name: Deploy to TestFlight - -# on: +# GitHub Actions가 Xcode 26을 지원하면 아래처럼 push 트리거를 추가하세요: # push: # branches: [ main ] -# workflow_dispatch: - -# jobs: -# deploy: -# name: Deploy to TestFlight -# runs-on: macos-15 - -# steps: -# - name: Checkout -# uses: actions/checkout@v4 -# with: -# fetch-depth: 0 - -# - name: Setup Xcode -# uses: maxim-lobanov/setup-xcode@v1 -# with: -# xcode-version: '16.2' - -# - name: Install mise -# uses: jdx/mise-action@v2 - -# - name: Setup Ruby -# uses: ruby/setup-ruby@v1 -# with: -# ruby-version: '3.2' -# bundler-cache: true - -# - name: Cache Tuist -# uses: actions/cache@v4 -# with: -# path: | -# ~/.tuist/Cache -# Tuist/.build -# key: ${{ runner.os }}-tuist-${{ hashFiles('**/Project.swift') }} -# restore-keys: | -# ${{ runner.os }}-tuist- - -# - name: Create APIInfos.swift -# run: | -# mkdir -p Data/Sources/Network/Secrets -# echo "${{ secrets.API_INFOS_SWIFT }}" | base64 --decode > Data/Sources/Network/Secrets/APIInfos.swift - -# - name: Create GoogleService-Info.plist -# run: | -# mkdir -p Oreum/Resources -# echo "${{ secrets.GOOGLE_SERVICE_INFO_PLIST }}" | base64 --decode > Oreum/Resources/GoogleService-Info.plist - -# - name: Setup App Store Connect API Key -# env: -# APP_STORE_CONNECT_API_KEY_CONTENT: ${{ secrets.APP_STORE_CONNECT_API_KEY }} -# run: | -# mkdir -p ~/.appstoreconnect/private_keys -# echo "$APP_STORE_CONNECT_API_KEY_CONTENT" | base64 --decode > ~/.appstoreconnect/private_keys/AuthKey_${{ secrets.APP_STORE_CONNECT_API_KEY_ID }}.p8 - -# - name: Import Certificates -# env: -# BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} -# P12_PASSWORD: ${{ secrets.P12_PASSWORD }} -# KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} -# run: | -# # Decode certificate -# CERTIFICATE_PATH="$RUNNER_TEMP/build_certificate.p12" -# echo "$BUILD_CERTIFICATE_BASE64" | base64 --decode > "$CERTIFICATE_PATH" - -# # Create keychain -# KEYCHAIN_PATH="$RUNNER_TEMP/app-signing.keychain-db" -# security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" -# security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH" -# security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" - -# # Import certificate to keychain -# security import "$CERTIFICATE_PATH" -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH" -# security list-keychain -d user -s "$KEYCHAIN_PATH" -# security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" - -# # Clean up -# rm "$CERTIFICATE_PATH" - -# - name: Install Provisioning Profiles -# env: -# PROVISIONING_PROFILE_BASE64: ${{ secrets.PROVISIONING_PROFILE_BASE64 }} -# WIDGET_PROVISIONING_PROFILE_BASE64: ${{ secrets.WIDGET_PROVISIONING_PROFILE_BASE64 }} -# run: | -# mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles - -# # Decode and install main app profile -# PROFILE_PATH="$RUNNER_TEMP/Oreum.mobileprovision" -# echo "$PROVISIONING_PROFILE_BASE64" | base64 --decode > "$PROFILE_PATH" - -# # Extract UUID and copy to correct location -# UUID=$(security cms -D -i "$PROFILE_PATH" | plutil -extract UUID raw -o - -) -# cp "$PROFILE_PATH" ~/Library/MobileDevice/Provisioning\ Profiles/"$UUID".mobileprovision -# echo "Installed main app profile with UUID: $UUID" - -# # Export UUID for Fastlane -# echo "OREUM_PROFILE_UUID=$UUID" >> $GITHUB_ENV - -# # Decode and install widget profile -# WIDGET_PROFILE_PATH="$RUNNER_TEMP/OreumWidget.mobileprovision" -# echo "$WIDGET_PROVISIONING_PROFILE_BASE64" | base64 --decode > "$WIDGET_PROFILE_PATH" - -# # Extract UUID and copy to correct location -# WIDGET_UUID=$(security cms -D -i "$WIDGET_PROFILE_PATH" | plutil -extract UUID raw -o - -) -# cp "$WIDGET_PROFILE_PATH" ~/Library/MobileDevice/Provisioning\ Profiles/"$WIDGET_UUID".mobileprovision -# echo "Installed widget profile with UUID: $WIDGET_UUID" - -# # Export UUID for Fastlane -# echo "WIDGET_PROFILE_UUID=$WIDGET_UUID" >> $GITHUB_ENV - -# echo "Installed provisioning profiles:" -# ls -la ~/Library/MobileDevice/Provisioning\ Profiles/ - -# # Clean up temp files -# rm "$PROFILE_PATH" "$WIDGET_PROFILE_PATH" - -# - name: Deploy to TestFlight -# env: -# FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }} -# 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 }} -# run: bundle exec fastlane beta - -# - name: Clean up keychain -# if: always() -# run: | -# security delete-keychain "$RUNNER_TEMP/app-signing.keychain-db" || true +# ============================================================================ + +name: Deploy to TestFlight + +on: + workflow_dispatch: # 수동 실행만 가능 + +jobs: + deploy: + name: Deploy to TestFlight + runs-on: macos-14 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Xcode + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '16.2' + + - name: Install mise + uses: jdx/mise-action@v2 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2' + bundler-cache: true + + - name: Cache Tuist + uses: actions/cache@v4 + with: + path: | + ~/.tuist/Cache + Tuist/.build + key: ${{ runner.os }}-tuist-${{ hashFiles('**/Project.swift') }} + restore-keys: | + ${{ runner.os }}-tuist- + + - name: Create APIInfos.swift + run: | + mkdir -p Data/Sources/Network/Secrets + echo "${{ secrets.API_INFOS_SWIFT }}" | base64 --decode > Data/Sources/Network/Secrets/APIInfos.swift + + - name: Create GoogleService-Info.plist + run: | + mkdir -p Oreum/Resources + echo "${{ secrets.GOOGLE_SERVICE_INFO_PLIST }}" | base64 --decode > Oreum/Resources/GoogleService-Info.plist + + - name: Setup App Store Connect API Key + env: + APP_STORE_CONNECT_API_KEY_CONTENT: ${{ secrets.APP_STORE_CONNECT_API_KEY }} + run: | + mkdir -p ~/.appstoreconnect/private_keys + echo "$APP_STORE_CONNECT_API_KEY_CONTENT" | base64 --decode > ~/.appstoreconnect/private_keys/AuthKey_${{ secrets.APP_STORE_CONNECT_API_KEY_ID }}.p8 + + - name: Import Certificates + env: + BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} + P12_PASSWORD: ${{ secrets.P12_PASSWORD }} + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + run: | + # Decode certificate + CERTIFICATE_PATH="$RUNNER_TEMP/build_certificate.p12" + echo "$BUILD_CERTIFICATE_BASE64" | base64 --decode > "$CERTIFICATE_PATH" + + # Create keychain + KEYCHAIN_PATH="$RUNNER_TEMP/app-signing.keychain-db" + security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH" + security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + + # Import certificate to keychain + security import "$CERTIFICATE_PATH" -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH" + security list-keychain -d user -s "$KEYCHAIN_PATH" + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + + # Clean up + rm "$CERTIFICATE_PATH" + + - name: Install Provisioning Profiles + env: + PROVISIONING_PROFILE_BASE64: ${{ secrets.PROVISIONING_PROFILE_BASE64 }} + WIDGET_PROVISIONING_PROFILE_BASE64: ${{ secrets.WIDGET_PROVISIONING_PROFILE_BASE64 }} + run: | + mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles + + # Decode and install main app profile + PROFILE_PATH="$RUNNER_TEMP/Oreum.mobileprovision" + echo "$PROVISIONING_PROFILE_BASE64" | base64 --decode > "$PROFILE_PATH" + + # Extract UUID and copy to correct location + UUID=$(security cms -D -i "$PROFILE_PATH" | plutil -extract UUID raw -o - -) + cp "$PROFILE_PATH" ~/Library/MobileDevice/Provisioning\ Profiles/"$UUID".mobileprovision + echo "Installed main app profile with UUID: $UUID" + + # Export UUID for Fastlane + echo "OREUM_PROFILE_UUID=$UUID" >> $GITHUB_ENV + + # Decode and install widget profile + WIDGET_PROFILE_PATH="$RUNNER_TEMP/OreumWidget.mobileprovision" + echo "$WIDGET_PROVISIONING_PROFILE_BASE64" | base64 --decode > "$WIDGET_PROFILE_PATH" + + # Extract UUID and copy to correct location + WIDGET_UUID=$(security cms -D -i "$WIDGET_PROFILE_PATH" | plutil -extract UUID raw -o - -) + cp "$WIDGET_PROFILE_PATH" ~/Library/MobileDevice/Provisioning\ Profiles/"$WIDGET_UUID".mobileprovision + echo "Installed widget profile with UUID: $WIDGET_UUID" + + # Export UUID for Fastlane + echo "WIDGET_PROFILE_UUID=$WIDGET_UUID" >> $GITHUB_ENV + + echo "Installed provisioning profiles:" + ls -la ~/Library/MobileDevice/Provisioning\ Profiles/ + + # Clean up temp files + rm "$PROFILE_PATH" "$WIDGET_PROFILE_PATH" + + - name: Deploy to TestFlight + env: + FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }} + 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 }} + run: bundle exec fastlane beta + + - name: Clean up keychain + if: always() + run: | + security delete-keychain "$RUNNER_TEMP/app-signing.keychain-db" || true