From f020aa9823dc886ef316c2bc8238578baf484d27 Mon Sep 17 00:00:00 2001 From: OnestarLee Date: Thu, 4 Sep 2025 09:23:26 +0900 Subject: [PATCH 1/5] chore: migrate CI configuration from CircleCI to GitHub Actions --- .github/workflows/comment-bot.yml | 2 +- .github/workflows/publish-sample.yml | 261 ++++++++++++++------------- sample/ios/Gemfile.lock | 116 ++++++------ sample/ios/fastlane/Fastfile | 24 ++- 4 files changed, 224 insertions(+), 179 deletions(-) diff --git a/.github/workflows/comment-bot.yml b/.github/workflows/comment-bot.yml index 27900a0f2..a1a970c00 100644 --- a/.github/workflows/comment-bot.yml +++ b/.github/workflows/comment-bot.yml @@ -10,8 +10,8 @@ jobs: - uses: sendbird/release-automation-action@latest with: gh_token: ${{ secrets.GITHUB_TOKEN }} - circleci_token: ${{ secrets.CIRCLECI_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..b56e765e0 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,31 @@ 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"] + } + + # Check if all API key values are present + if api_key_info[:key_id].nil? || api_key_info[:issuer_id].nil? || ENV["APP_STORE_CONNECT_API_KEY"].nil? + UI.user_error!("Missing App Store Connect API key values. Please check your environment variables.") + end + 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 From 7d1c4e1e14aa6b90411aea4164916b8e3af61f63 Mon Sep 17 00:00:00 2001 From: OnestarLee Date: Fri, 19 Sep 2025 20:28:57 +0900 Subject: [PATCH 2/5] chore: migrate CI configuration from CircleCI to GitHub Actions and add documentation --- .circleci/config.yml | 288 +++++++++++++++++++++---------------------- .github/README.md | 128 +++++++++++++++++++ 2 files changed, 272 insertions(+), 144 deletions(-) create mode 100644 .github/README.md diff --git a/.circleci/config.yml b/.circleci/config.yml index abd133926..32a36a83b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,144 +1,144 @@ -### 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 +#### 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 From 376e5b3a08e3f9382fa3f0cf22778cee88d32100 Mon Sep 17 00:00:00 2001 From: OnestarLee Date: Fri, 19 Sep 2025 20:30:57 +0900 Subject: [PATCH 3/5] chore: migrate CI configuration from CircleCI to GitHub Actions and add documentation --- .circleci/README.md | 45 -------------- .circleci/config.yml | 144 ------------------------------------------- 2 files changed, 189 deletions(-) delete mode 100644 .circleci/README.md delete mode 100644 .circleci/config.yml 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 32a36a83b..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 From 44c74f44131426dc87ee00a13f0ea843ce8b2531 Mon Sep 17 00:00:00 2001 From: OnestarLee Date: Fri, 19 Sep 2025 20:38:12 +0900 Subject: [PATCH 4/5] chore: migrate CI configuration from CircleCI to GitHub Actions and add documentation --- sample/ios/fastlane/Fastfile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sample/ios/fastlane/Fastfile b/sample/ios/fastlane/Fastfile index b56e765e0..f00fc9711 100644 --- a/sample/ios/fastlane/Fastfile +++ b/sample/ios/fastlane/Fastfile @@ -23,11 +23,6 @@ platform :ios do key: ENV["APP_STORE_CONNECT_API_KEY"] } - # Check if all API key values are present - if api_key_info[:key_id].nil? || api_key_info[:issuer_id].nil? || ENV["APP_STORE_CONNECT_API_KEY"].nil? - UI.user_error!("Missing App Store Connect API key values. Please check your environment variables.") - end - 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"], api_key: api_key_info) From 892f7a8c498bd6ef6fb90f6eb39ca9ef91ac70b6 Mon Sep 17 00:00:00 2001 From: OnestarLee <100272033+OnestarLee@users.noreply.github.com> Date: Sat, 20 Sep 2025 12:14:01 +0900 Subject: [PATCH 5/5] Update .github/workflows/comment-bot.yml Co-authored-by: Hyungu Kang | Airen --- .github/workflows/comment-bot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/comment-bot.yml b/.github/workflows/comment-bot.yml index a1a970c00..1d630b006 100644 --- a/.github/workflows/comment-bot.yml +++ b/.github/workflows/comment-bot.yml @@ -9,7 +9,7 @@ jobs: - uses: actions/checkout@v4 - uses: sendbird/release-automation-action@latest with: - gh_token: ${{ secrets.GITHUB_TOKEN }} + gh_token: ${{ secrets.GH_BOT_TOKEN }} product: 'uikit' platform: 'rn' product_jira_project_key: 'UIKIT'