diff --git a/.circleci/README.md b/.circleci/README.md deleted file mode 100644 index 8b0b9ea0e..000000000 --- a/.circleci/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# How to generate CI environment vars - -## TODO - -- [ ] Replace username, itc_team_id and specific_password to App Store Connect API Key - -## Shared - -- SENDBIRD_APP_ID - - Your sendbird application id - -## Android - -- FASTLANE_ANDROID_SERVICE_ACCOUNT - - Create service-account(firebase_app_distribution role) from google cloud console - - Download JSON key file - - Encode as a base64 - - `cat service-account.json | base64` - - Save encoded text to environment - - You can decode text like `echo "encoded-base64-text" | base64 --decode` -- FASTLANE_ANDROID_APP_ID - - Open your firebase project settings > general - - Find your android app (formatted like 1:xxxxxxxxxxxxxxxx) - - Save app id to environment - -## iOS - -- FASTLANE_IOS_APPLE_ID - - Your apple id(email) -- FASTLANE_IOS_TEAM_ID - - You can find out from the ends of [apple developers](https://developer.apple.com/account) site url -- FASTLANE_IOS_ITC_TEAM_ID - - iTunes connect team id, refer this [link](https://github.com/fastlane/fastlane/issues/4301#issuecomment-253461017) -- FASTLANE_IOS_MATCH_GIT_URL - - URL should be starts with `git@` (ssh) - - Save match git url to environment, you can find out from our github organization repos - - Authorization with SSH - - Open CircleCI Project settings > SSH Keys - - Add User Key -- FASTLANE_IOS_MATCH_PASSWORD - - You can find out password from Match Git repository description -- FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD - - Open [apple id](https://appleid.apple.com/account/manage) site - - Create Application Password - - Save password to environment diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index abd133926..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,144 +0,0 @@ -### Aliases -aliases: - - &restore_node_modules_base - key: v{{ .Environment.CACHE_VERSION }}-yarn-base-{{ arch }}-{{ checksum "yarn.lock" }} - - &restore_node_modules_packages - key: v{{ .Environment.CACHE_VERSION }}-yarn-packages-{{ arch }}-{{ checksum "yarn.lock" }} - - &install_node_modules - name: Install node_modules - command: yarn install --frozen-lockfile - - &save_node_modules_base - key: v{{ .Environment.CACHE_VERSION }}-yarn-base-{{ arch }}-{{ checksum "yarn.lock" }} - paths: - - ~/.cache/yarn - - node_modules - - &save_node_modules_packages - key: v{{ .Environment.CACHE_VERSION }}-yarn-packages-{{ arch }}-{{ checksum "yarn.lock" }} - paths: - - sample/node_modules - - packages/uikit-chat-hooks/node_modules - - packages/uikit-react-native/node_modules - - packages/uikit-react-native-foundation/node_modules - - packages/uikit-utils/node_modules - - &create_app_env - name: Create env.ts - command: echo "export const APP_ID = '${SENDBIRD_APP_ID}';" >> sample/src/env.ts - -### Circle CI -# Built-in env vars - https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables -# Xcode versions - https://circleci.com/docs/2.0/testing-ios/#supported-xcode-versions -# Cache key template - https://circleci.com/docs/caching/#using-keys-and-templates -version: 2.1 -orbs: - ruby: circleci/ruby@2.1.0 - macos: circleci/macos@2.4.0 - -parameters: - platform: - type: enum - default: 'Noop' - enum: ['All', 'iOS', 'Android', 'Noop'] - version: - type: string - default: '' - -jobs: - deploy-ios: - macos: - xcode: 15.3.0 - resource_class: macos.m1.medium.gen1 - environment: - APP_VERSION: << pipeline.parameters.version >> - steps: - - checkout - - macos/switch-ruby: - version: '3.0.6' - - ruby/install-deps: - key: v{{ .Environment.CACHE_VERSION }}-gems-ios - app-dir: ./sample/ios - - restore_cache: *restore_node_modules_base - - restore_cache: *restore_node_modules_packages - - run: *install_node_modules - - save_cache: *save_node_modules_base - - save_cache: *save_node_modules_packages - - restore_cache: - key: v{{ .Environment.CACHE_VERSION }}-pods-{{ arch }}-{{ checksum "sample/ios/Podfile.lock" }} - - run: - name: Install pods - working_directory: sample/ios - command: bundle exec pod install - - save_cache: - key: v{{ .Environment.CACHE_VERSION }}-pods-{{ arch }}-{{ checksum "sample/ios/Podfile.lock" }} - paths: - - sample/ios/Pods - - run: *create_app_env - - run: - name: Export environments - command: | - echo "export MATCH_PASSWORD=$FASTLANE_IOS_MATCH_PASSWORD" >> $BASH_ENV - echo "export MATCH_GIT_URL=$FASTLANE_IOS_MATCH_GIT_URL" >> $BASH_ENV - echo "export PILOT_USERNAME=$FASTLANE_IOS_APPLE_ID" >> $BASH_ENV - echo "export PILOT_APPLE_ID=$FASTLANE_IOS_ITC_TEAM_ID" >> $BASH_ENV - echo "export PILOT_DEV_PORTAL_TEAM_ID=$FASTLANE_IOS_TEAM_ID" >> $BASH_ENV - echo "export PILOT_ITC_PROVIDER=$FASTLANE_IOS_TEAM_ID" >> $BASH_ENV - echo "export PILOT_SKIP_WAITING_FOR_BUILD_PROCESSING=true" >> $BASH_ENV - echo "export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=$FASTLANE_IOS_APPLE_APPLICATION_SPECIFIC_PASSWORD" >> $BASH_ENV - - run: - name: Run fastlane - command: yarn deploy:ios version:$APP_VERSION - - deploy-android: - docker: - - image: cimg/android:2025.04.1-node - resource_class: xlarge - environment: - APP_VERSION: << pipeline.parameters.version >> - steps: - - checkout - - run: - name: Install Ninja - command: sudo apt-get update && sudo apt-get install -y ninja-build - - ruby/install: - version: '2.7.6' - - ruby/install-deps: - key: v{{ .Environment.CACHE_VERSION }}-gems-android - app-dir: ./sample/android - - restore_cache: *restore_node_modules_base - - restore_cache: *restore_node_modules_packages - - run: *install_node_modules - - save_cache: *save_node_modules_base - - save_cache: *save_node_modules_packages - - run: *create_app_env - - run: - name: Set up trusted certificates - command: | - sudo apt-get update - sudo apt-get install -y ca-certificates - echo 'export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt' >> $BASH_ENV - - run: - name: Create service-account.json - environment: - - FILE_PATH: sample/android/fastlane/service-account.json - command: | - echo "$FASTLANE_ANDROID_SERVICE_ACCOUNT" | base64 --decode >> $FILE_PATH - echo "export GOOGLE_APPLICATION_CREDENTIALS=$CIRCLE_WORKING_DIRECTORY/$FILE_PATH" >> $BASH_ENV - echo "export FIREBASEAPPDISTRO_APP=$FASTLANE_ANDROID_APP_ID" >> $BASH_ENV - - run: - name: Run fastlane - command: yarn deploy:android version:$APP_VERSION - -workflows: - run-ios: - when: - or: - - equal: [<< pipeline.parameters.platform >>, 'All'] - - equal: [<< pipeline.parameters.platform >>, 'iOS'] - jobs: - - deploy-ios - run-android: - when: - or: - - equal: [<< pipeline.parameters.platform >>, 'All'] - - equal: [<< pipeline.parameters.platform >>, 'Android'] - jobs: - - deploy-android diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 000000000..3088ac06a --- /dev/null +++ b/.github/README.md @@ -0,0 +1,128 @@ +# GitHub Actions CI/CD Configuration + +This document describes how to set up and configure the GitHub Actions CI/CD pipeline for the Sendbird UIKit React Native project. + +## Overview + +The GitHub Actions workflow handles automated deployment of both iOS and Android sample applications using modern authentication methods and optimized caching strategies. + +## Required GitHub Secrets + +### Shared + +- **SENDBIRD_APP_ID** + - Your Sendbird application ID + - Used to configure the sample app environment + +### Android Deployment + +- **FASTLANE_ANDROID_SERVICE_ACCOUNT** + - Create service account with Firebase App Distribution role from Google Cloud Console + - Download JSON key file + - Encode as base64: `cat service-account.json | base64` + - Save encoded text to GitHub Secrets + - Decoding reference: `echo "encoded-base64-text" | base64 --decode` + +- **FASTLANE_ANDROID_APP_ID** + - Open your Firebase project settings → General + - Find your Android app (formatted like `1:xxxxxxxxxxxxxxxx:android:xxxxx`) + - Save app ID to GitHub Secrets + +### iOS Deployment + +#### App Store Connect API Authentication (Recommended) + +- **APP_STORE_CONNECT_API_KEY_ID** + - API Key ID from App Store Connect + - Format: 10-character alphanumeric string (e.g., `D83848D23B`) + +- **APP_STORE_CONNECT_API_ISSUER_ID** + - API Key Issuer ID from App Store Connect + - Format: UUID (e.g., `227b0bbf-ada8-458c-9d62-3d8022b7d07f`) + +- **APP_STORE_CONNECT_API_KEY** + - Private key content from the downloaded `.p8` file + - Include the full key with headers: + ``` + -----BEGIN PRIVATE KEY----- + [Key content] + -----END PRIVATE KEY----- + ``` + +#### Certificate Management + +- **FASTLANE_IOS_MATCH_GIT_URL** + - SSH URL to the private repository storing certificates + - Format: `git@github.com:organization/certificates-repo.git` + - Must use SSH format for authentication + +- **FASTLANE_IOS_MATCH_GIT_PRIVATE_KEY** + - SSH private key for accessing the match repository + - Generate with: `ssh-keygen -t rsa -b 4096 -C "github-actions@sendbird.com"` + - Add the public key to the certificates repository as a deploy key + - Save the private key content to GitHub Secrets + +- **FASTLANE_IOS_MATCH_PASSWORD** + - Password used to encrypt/decrypt certificates in the match repository + - Can be found in the match repository + +## How to Generate App Store Connect API Key + +1. **Login to App Store Connect** + - Go to [App Store Connect](https://appstoreconnect.apple.com) + - Sign in with your Apple ID + +2. **Navigate to API Keys** + - Users and Access → Integrations → App Store Connect API + +3. **Create New API Key** + - Click "Generate API Key" + - Set name: `GitHub Actions - Sendbird UIKit` + - Select access: `Developer` role + - Download the `.p8` file immediately (cannot re-download) + +4. **Configure GitHub Secrets** + - **Key ID**: Copy from the API key details page + - **Issuer ID**: Copy from the API key details page + - **Key Content**: Copy entire content of the `.p8` file + +## Workflow Features + +### Caching Strategy +- **Node.js Dependencies**: Cached based on `yarn.lock` hash +- **CocoaPods**: Cached based on `Podfile.lock` hash with validation +- **Ruby Gems**: Cached automatically by `ruby/setup-ruby` action + +### Security +- **SSH Authentication**: For accessing private certificate repositories +- **API Key Authentication**: Modern App Store Connect authentication +- **Secret Validation**: Pre-flight checks for required environment variables + +### Platform Support +- **iOS**: Automatic TestFlight deployment +- **Android**: Firebase App Distribution deployment +- **Conditional Execution**: Platform-specific deployment based on input selection + +## Troubleshooting + +### Common Issues + +1. **Pod Cache Validation Failures** + - Clear GitHub Actions cache for the repository + - Actions → Caches → Delete affected cache entries + +2. **SSH Authentication Failures** + - Verify the private key format (include headers and footers) + - Check if the public key is added to the certificates repository + +3. **App Store Connect API Errors** + - Verify all three API key components are correctly set + - Ensure the API key has sufficient permissions + - Check the `.p8` file content format + +## Maintenance + +- **API Keys**: Renew App Store Connect API keys before expiration (typically 1 year) +- **Certificates**: Monitor certificate expiration dates in the match repository +- **SSH Keys**: Rotate SSH keys periodically for security +- **Dependencies**: Keep fastlane and related tools updated diff --git a/.github/workflows/comment-bot.yml b/.github/workflows/comment-bot.yml index 27900a0f2..1d630b006 100644 --- a/.github/workflows/comment-bot.yml +++ b/.github/workflows/comment-bot.yml @@ -9,9 +9,9 @@ jobs: - uses: actions/checkout@v4 - uses: sendbird/release-automation-action@latest with: - gh_token: ${{ secrets.GITHUB_TOKEN }} - circleci_token: ${{ secrets.CIRCLECI_BOT_TOKEN }} + gh_token: ${{ secrets.GH_BOT_TOKEN }} product: 'uikit' platform: 'rn' product_jira_project_key: 'UIKIT' product_jira_version_prefix: 'rn_uikit' + ci: 'github' diff --git a/.github/workflows/publish-sample.yml b/.github/workflows/publish-sample.yml index 1f99671d7..ecdc27689 100644 --- a/.github/workflows/publish-sample.yml +++ b/.github/workflows/publish-sample.yml @@ -17,130 +17,149 @@ on: type: string default: '' +env: + CACHE_NODE_MODULES_PATH: | + node_modules + packages/*/node_modules + sample/node_modules + jobs: - execute: + deploy-ios: + name: '[iOS] Deploy' + if: ${{ github.event.inputs.platform == 'iOS' || github.event.inputs.platform == 'All' }} + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'yarn' + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + env: + BUNDLE_GEMFILE: ${{ github.workspace }}/sample/ios/Gemfile + with: + ruby-version: '3.1' + bundler-cache: true + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Install CocoaPods + working-directory: sample/ios + run: bundle exec pod install + + - name: Create env.ts + env: + APP_ID: ${{ secrets.SENDBIRD_APP_ID }} + run: echo "export const APP_ID = '$APP_ID';" >> sample/src/env.ts + + - name: Setup SSH for match + env: + SSH_PRIVATE_KEY: ${{ secrets.FASTLANE_IOS_MATCH_GIT_PRIVATE_KEY }} + run: | + mkdir -p ~/.ssh + echo "$SSH_PRIVATE_KEY" > ~/.ssh/match_key + chmod 600 ~/.ssh/match_key + ssh-keyscan github.com >> ~/.ssh/known_hosts + cat >> ~/.ssh/config << EOF + Host github.com + User git + IdentityFile ~/.ssh/match_key + IdentitiesOnly yes + EOF + chmod 600 ~/.ssh/config + + - name: Run fastlane iOS + env: + APP_VERSION: ${{ github.event.inputs.version }} + MATCH_PASSWORD: ${{ secrets.FASTLANE_IOS_MATCH_PASSWORD }} + MATCH_GIT_URL: ${{ secrets.FASTLANE_IOS_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: ${{ secrets.APP_STORE_CONNECT_API_KEY }} + run: | + if [ -n "$APP_VERSION" ]; then + yarn deploy:ios version:$APP_VERSION + else + yarn deploy:ios + fi + + deploy-android: + name: '[Android] Deploy' + if: ${{ github.event.inputs.platform == 'Android' || github.event.inputs.platform == 'All' }} runs-on: ubuntu-latest steps: - - name: Set BRANCH_NAME env - run: echo "BRANCH_NAME=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'yarn' + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: Install Ninja + run: sudo apt-get update && sudo apt-get install -y ninja-build + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + env: + BUNDLE_GEMFILE: ${{ github.workspace }}/sample/android/Gemfile + with: + ruby-version: '2.7.6' + bundler-cache: true + + - name: Get yarn lockfile hash + id: yarn-lock-hash + run: echo "hash=${{ hashFiles('**/yarn.lock') }}" >> $GITHUB_OUTPUT + + - name: Cache node_modules + id: yarn-cache + uses: actions/cache@v4 + with: + path: ${{ env.CACHE_NODE_MODULES_PATH }} + key: ${{ runner.os }}-yarn-${{ steps.yarn-lock-hash.outputs.hash }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install dependencies + if: steps.yarn-cache.outputs.cache-hit != 'true' + run: yarn install --frozen-lockfile + + - name: Create env.ts + run: echo "export const APP_ID = '${{ secrets.SENDBIRD_APP_ID }}';" >> sample/src/env.ts + + - name: Set up trusted certificates + run: | + sudo apt-get update + sudo apt-get install -y ca-certificates + echo 'SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt' >> $GITHUB_ENV + + - name: Create service-account.json + env: + FASTLANE_ANDROID_SERVICE_ACCOUNT: ${{ secrets.FASTLANE_ANDROID_SERVICE_ACCOUNT }} + FASTLANE_ANDROID_APP_ID: ${{ secrets.FASTLANE_ANDROID_APP_ID }} + run: | + FILE_PATH="sample/android/fastlane/service-account.json" + echo "$FASTLANE_ANDROID_SERVICE_ACCOUNT" | base64 --decode > $FILE_PATH + echo "GOOGLE_APPLICATION_CREDENTIALS=$GITHUB_WORKSPACE/$FILE_PATH" >> $GITHUB_ENV + echo "FIREBASEAPPDISTRO_APP=$FASTLANE_ANDROID_APP_ID" >> $GITHUB_ENV - - name: '[${{ github.event.inputs.platform }}] Deploy trigger (CircleCI REST API)' - if: ${{ github.event.inputs.platform }} + - name: Run fastlane Android env: - CIRCLECI_PERSONAL_API_TOKEN: ${{ secrets.CIRCLECI_PERSONAL_API_TOKEN }} - BRANCH_NAME: ${{ env.BRANCH_NAME }} - PLATFORM: ${{ github.event.inputs.platform }} - VERSION: ${{ github.event.inputs.version }} + APP_VERSION: ${{ github.event.inputs.version }} run: | - curl -u ${CIRCLECI_PERSONAL_API_TOKEN}: \ - -X POST "https://circleci.com/api/v2/project/gh/sendbird/sendbird-uikit-react-native/pipeline" \ - -H "Content-Type: application/json" \ - -d '{ - "branch": "'"${BRANCH_NAME}"'", - "parameters": { - "platform": "'"${PLATFORM}"'", - "version": "'"${VERSION}"'" - } - }' - -#env: -# CACHE_NODE_MODULES_PATH: | -# node_modules -# packages/*/node_modules -# sample/node_modules -# -#jobs: -# deploy-android: -# name: '[Android] Deploy' -# if: ${{ github.event.inputs.platform == 'Android' || github.event.inputs.platform == 'All' }} -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v3 -# - uses: actions/setup-node@v1 -# with: -# node-version: 16.x -# - uses: ruby/setup-ruby@v1 -# env: -# BUNDLE_GEMFILE: ${{ github.workspace }}/sample/android/Gemfile -# with: -# ruby-version: 2.7 -# bundler-cache: true -# - name: Get lockfile hash -# id: lockfile_hash -# run: echo "::set-output name=hash::${{ hashFiles('**/yarn.lock') }}" -# - name: Check cached node_modules -# id: check_cache -# uses: actions/cache@v2 -# with: -# path: ${{ env.CACHE_NODE_MODULES_PATH }} -# key: ${{ steps.lockfile_hash.outputs.hash }} -# - name: Install dependencies -# if: steps.check_cache.outputs.cache-hit == '' -# run: yarn install --frozen-lockfile -# - name: Create env.ts -# run: -# echo "export const APP_ID = '${{ secrets.sendbird_app_id }}';" >> sample/src/env.ts -# -# - name: Create service-account.json -# uses: /bang9/create-env-json@v3 -# id: service-account -# with: -# file-name: './sample/android/fastlane/service-account.json' -# type: 'service_account' -# auth_uri: 'https://accounts.google.com/o/oauth2/auth' -# token_uri: 'https://oauth2.googleapis.com/token' -# auth_provider_x509_cert_url: 'https://www.googleapis.com/oauth2/v1/certs' -# project_id: ${{ secrets.fastlane_android_account_project_id }} -# private_key_id: ${{ secrets.fastlane_android_account_private_key_id }} -# private_key: '${{ secrets.fastlane_android_account_private_key }}' -# client_email: ${{ secrets.fastlane_android_account_client_email }} -# client_id: ${{ secrets.fastlane_android_account_client_id }} -# client_x509_cert_url: ${{ secrets.fastlane_android_account_client_x509_cert_url }} -# - name: Run fastlane -# env: -# FIREBASEAPPDISTRO_APP: ${{ secrets.fastlane_android_app_id }} -# GOOGLE_APPLICATION_CREDENTIALS: ${{ steps.service-account.outputs.full-path }} -# run: yarn deploy:android -# -# deploy-ios: -# name: '[iOS] Deploy' -# if: ${{ github.event.inputs.platform != 'Android' }} -# runs-on: macos-latest -# steps: -# - uses: actions/checkout@v3 -# - uses: actions/setup-node@v1 -# with: -# node-version: 16.x -# - uses: ruby/setup-ruby@v1 -# env: -# BUNDLE_GEMFILE: ${{ github.workspace }}/sample/ios/Gemfile -# with: -# ruby-version: 2.7 -# bundler-cache: true -# - name: Get lockfile hash -# id: lockfile_hash -# run: echo "::set-output name=hash::${{ hashFiles('**/yarn.lock') }}" -# - name: Check cached node_modules -# id: check_cache -# uses: actions/cache@v2 -# with: -# path: ${{ env.CACHE_NODE_MODULES_PATH }} -# key: ${{ steps.lockfile_hash.outputs.hash }} -# - name: Install dependencies -# if: steps.check_cache.outputs.cache-hit == '' -# run: -# yarn install --frozen-lockfile -# - name: Install pods -# run: cd sample/ios && pod install -# - name: Create env.ts -# run: -# echo "export const APP_ID = '${{ secrets.sendbird_app_id }}';" >> sample/src/env.ts -# - name: Run fastlane -# env: -# TEAM_ID: ${{ secrets.fastlane_ios_team_id }} -# MATCH_PASSWORD: ${{ secrets.fastlane_ios_match_password }} -# MATCH_GIT_URL: ${{ secrets.fastlane_ios_match_git_url }} -# MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.fastlane_ios_match_git_basic_authorization }} -# APPLE_ID: ${{ secrets.fastlane_ios_apple_id }} -# FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.fastlane_ios_apple_application_specific_password }} -# run: yarn deploy:ios + if [ -n "$APP_VERSION" ]; then + yarn deploy:android version:$APP_VERSION + else + yarn deploy:android + fi diff --git a/sample/ios/Gemfile.lock b/sample/ios/Gemfile.lock index 96b8bd54d..dd3b7df3b 100644 --- a/sample/ios/Gemfile.lock +++ b/sample/ios/Gemfile.lock @@ -15,31 +15,34 @@ GEM minitest (>= 5.1) mutex_m tzinfo (~> 2.0) - addressable (2.8.6) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) artifactory (3.0.17) atomos (0.1.3) - aws-eventstream (1.3.0) - aws-partitions (1.913.0) - aws-sdk-core (3.191.6) + aws-eventstream (1.4.0) + aws-partitions (1.1161.0) + aws-sdk-core (3.232.0) aws-eventstream (~> 1, >= 1.3.0) - aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.8) + aws-partitions (~> 1, >= 1.992.0) + aws-sigv4 (~> 1.9) + base64 + bigdecimal jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.78.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.146.1) - aws-sdk-core (~> 3, >= 3.191.0) + logger + aws-sdk-kms (1.112.0) + aws-sdk-core (~> 3, >= 3.231.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.199.0) + aws-sdk-core (~> 3, >= 3.231.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.8) - aws-sigv4 (1.8.0) + aws-sigv4 (~> 1.5) + aws-sigv4 (1.12.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) - base64 (0.2.0) + base64 (0.3.0) bigdecimal (3.1.8) claide (1.1.0) cocoapods (1.14.3) @@ -86,7 +89,7 @@ GEM concurrent-ruby (1.3.3) connection_pool (2.4.1) declarative (0.0.20) - digest-crc (0.6.5) + digest-crc (0.7.0) rake (>= 12.0.0, < 14.0.0) domain_name (0.6.20240107) dotenv (2.8.1) @@ -95,8 +98,8 @@ GEM escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) - excon (0.110.0) - faraday (1.10.3) + excon (0.112.0) + faraday (1.10.4) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -112,20 +115,20 @@ GEM faraday (>= 0.8.0) http-cookie (~> 1.0.0) faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) + faraday-em_synchrony (1.0.1) faraday-excon (1.1.0) faraday-httpclient (1.0.1) - faraday-multipart (1.0.4) - multipart-post (~> 2) - faraday-net_http (1.0.1) + faraday-multipart (1.1.1) + multipart-post (~> 2.0) + faraday-net_http (1.0.2) faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) faraday-rack (1.0.0) faraday-retry (1.0.3) - faraday_middleware (1.2.0) + faraday_middleware (1.2.1) faraday (~> 1.0) - fastimage (2.3.1) - fastlane (2.220.0) + fastimage (2.4.0) + fastlane (2.228.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -141,6 +144,7 @@ GEM faraday-cookie_jar (~> 0.0.6) faraday_middleware (~> 1.0) fastimage (>= 2.1.0, < 3.0.0) + fastlane-sirp (>= 1.0.0) gh_inspector (>= 1.1.2, < 2.0.0) google-apis-androidpublisher_v3 (~> 0.3) google-apis-playcustomapp_v1 (~> 0.1) @@ -164,10 +168,12 @@ GEM tty-spinner (>= 0.8.0, < 1.0.0) word_wrap (~> 1.0.0) xcodeproj (>= 1.13.0, < 2.0.0) - xcpretty (~> 0.3.0) + xcpretty (~> 0.4.1) xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) - fastlane-plugin-json (1.1.0) + fastlane-plugin-json (1.1.7) fastlane-plugin-versioning_ios (0.1.0) + fastlane-sirp (1.0.0) + sysrandom (~> 1.0) ffi (1.17.0-arm64-darwin) ffi (1.17.0-x86_64-darwin) fourflusher (2.3.1) @@ -189,12 +195,12 @@ GEM google-apis-core (>= 0.11.0, < 2.a) google-apis-storage_v1 (0.31.0) google-apis-core (>= 0.11.0, < 2.a) - google-cloud-core (1.7.0) + google-cloud-core (1.8.0) google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) - google-cloud-errors (1.4.0) + google-cloud-errors (1.5.0) google-cloud-storage (1.47.0) addressable (~> 2.8) digest-crc (~> 0.4) @@ -210,51 +216,54 @@ GEM os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) highline (2.0.3) - http-cookie (1.0.5) + http-cookie (1.0.8) domain_name (~> 0.5) - httpclient (2.8.3) + httpclient (2.9.0) + mutex_m i18n (1.14.5) concurrent-ruby (~> 1.0) jmespath (1.6.2) - json (2.7.2) - jwt (2.8.1) + json (2.14.1) + jwt (2.10.2) base64 - mini_magick (4.12.0) + logger (1.7.0) + mini_magick (4.13.2) mini_mime (1.1.5) minitest (5.24.1) molinillo (0.8.0) - multi_json (1.15.0) - multipart-post (2.4.0) + multi_json (1.17.0) + multipart-post (2.4.1) mutex_m (0.2.0) - nanaimo (0.3.0) + nanaimo (0.4.0) nap (1.1.0) - naturally (2.2.1) + naturally (2.3.0) netrc (0.11.0) nkf (0.2.0) - optparse (0.4.0) + optparse (0.6.0) os (1.1.4) - plist (3.7.1) + plist (3.7.2) public_suffix (4.0.7) - rake (13.2.1) + rake (13.3.0) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.6) - rouge (2.0.7) + rexml (3.4.4) + rouge (3.28.0) ruby-macho (2.5.1) ruby2_keywords (0.0.5) - rubyzip (2.3.2) + rubyzip (2.4.1) security (0.1.5) - signet (0.19.0) + signet (0.21.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) - jwt (>= 1.5, < 3.0) + jwt (>= 1.5, < 4.0) multi_json (~> 1.10) simctl (1.6.10) CFPropertyList naturally + sysrandom (1.0.5) terminal-notifier (2.0.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) @@ -268,17 +277,17 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) - unicode-display_width (2.5.0) + unicode-display_width (2.6.0) word_wrap (1.0.0) - xcodeproj (1.24.0) + xcodeproj (1.27.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) - nanaimo (~> 0.3.0) - rexml (~> 3.2.4) - xcpretty (0.3.0) - rouge (~> 2.0.7) + nanaimo (~> 0.4.0) + rexml (>= 3.3.6, < 4.0) + xcpretty (0.4.1) + rouge (~> 3.28.0) xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) @@ -286,6 +295,7 @@ PLATFORMS arm64-darwin-21 arm64-darwin-22 arm64-darwin-23 + arm64-darwin-24 x86_64-darwin-21 x86_64-darwin-22 @@ -296,4 +306,4 @@ DEPENDENCIES fastlane-plugin-versioning_ios BUNDLED WITH - 2.3.7 + 2.3.27 diff --git a/sample/ios/fastlane/Fastfile b/sample/ios/fastlane/Fastfile index 45097a1cc..f00fc9711 100644 --- a/sample/ios/fastlane/Fastfile +++ b/sample/ios/fastlane/Fastfile @@ -3,7 +3,7 @@ VERSION=PACKAGE_JSON[:version] DATE=Time.new.strftime("%Y.%m%d.%H%M") before_all do |lane, options| - if options[:version] != "" + if options[:version] && options[:version] != "" VERSION=options[:version] end end @@ -11,15 +11,26 @@ end default_platform(:ios) platform :ios do before_all do - setup_circle_ci + setup_ci if is_ci end desc "Deploy a new build to TestFlight" lane :deploy do + # Use App Store Connect API key for authentication + api_key_info = { + key_id: ENV["APP_STORE_CONNECT_API_KEY_ID"], + issuer_id: ENV["APP_STORE_CONNECT_API_ISSUER_ID"], + key: ENV["APP_STORE_CONNECT_API_KEY"] + } + ios_set_version(xcodeproj: "SendbirdUIKitSample.xcodeproj", version: VERSION) ios_set_build_number(xcodeproj: "SendbirdUIKitSample.xcodeproj", build_number: DATE) - match(type: "appstore", readonly: true, app_identifier: ["com.sendbird.uikit.reactnative.sample", "com.sendbird.uikit.reactnative.sample.NotificationService"]) + match(type: "appstore", readonly: true, app_identifier: ["com.sendbird.uikit.reactnative.sample", "com.sendbird.uikit.reactnative.sample.NotificationService"], api_key: api_key_info) build_app(workspace: "SendbirdUIKitSample.xcworkspace", scheme: "SendbirdUIKitSample") - upload_to_testflight(skip_waiting_for_build_processing: true) + + upload_to_testflight( + api_key: api_key_info, + skip_waiting_for_build_processing: true + ) end end