Skip to content

Version Compatibility Testing #29

Version Compatibility Testing

Version Compatibility Testing #29

---
name: iOS
on: pull_request
jobs:
build-and-upload-to-appetize:
runs-on: macos-latest
timeout-minutes: 30
name: Build and upload app to Appetize 🚀
steps:
- name: Cancel previous jobs
uses: styfle/[email protected]
with:
access_token: ${{ github.token }}
- name: Git Checkout
uses: actions/checkout@v3
- name: Select Xcode Version
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Install SSH key
uses: shimataro/ssh-key-action@v2
with:
key: ${{ secrets.SSH_KEY }}
name: id_rsa_github_actions
known_hosts: unnecessary
- uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_KEY }}
- uses: ruby/setup-ruby@v1
with:
ruby-version: "2.6"
bundler-cache: true
- uses: actions/setup-ruby@v1
with:
ruby-version: '2.6'
- uses: actions/setup-node@v3
with:
node-version: 18
cache: 'yarn'
- name: Add slack message builder
run: |
yarn add slack-message-builder
- name: Get npm cache directory
id: npm-cache-dir
run: echo "dir=$(npm config get cache)" >> ${GITHUB_OUTPUT}
- name: Cache npm dependencies
uses: actions/cache@v3
id: npm-cache
with:
path: ${{ steps.npm-cache-dir.outputs.dir }}
key: ${{ runner.os }}-node-${{ hashFiles('*/package-lock.json', '*/*/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Set legacy-peer-deps for npm config
run: |
npm config set legacy-peer-deps true
- name: Cache pods
uses: actions/cache@v3
with:
path: |
ios/Pods
~/Library/Caches/CocoaPods
~/.cocoapods
key: ${{ runner.os }}-pods-${{ hashFiles('*/Podfile.lock', '*/*/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-pods-
- name: Install packages
run: |
yarn
- name: Create main.jsbundle
run: |
yarn --cwd example build:ios
- name: Distribute the React Native iOS app on Appetize 🚀
run: |
bundle exec fastlane ios appetize_build_and_upload
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
MATCH_GIT_PRIVATE_KEY: ${{ secrets.SSH_KEY }}
FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}
FASTLANE_SESSION: ${{ secrets.FASTLANE_SESSION }}
MATCH_KEYCHAIN_NAME: ${{ secrets.MATCH_KEYCHAIN_NAME }}
MATCH_KEYCHAIN_PASSWORD: ${{ secrets.MATCH_KEYCHAIN_PASSWORD }}
APPETIZE_API_TOKEN: ${{ secrets.APPETIZE_API_TOKEN }}
SOURCE_BRANCH: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
- uses: peter-evans/find-comment@v2
if: ${{ success() }}
id: find_comment
with:
issue-number: ${{ github.event.pull_request.number }}
body-includes: Appetize iOS link
- uses: peter-evans/create-or-update-comment@v2
if: ${{ success() }}
with:
body: |
Appetize iOS link: ${{ env.APPETIZE_APP_URL }}
edit-mode: replace
comment-id: ${{ steps.find_comment.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Create Slack Success Summary Report
if: ${{ success() && github.event.pull_request.base.ref == 'master' }}
run: |
node report-scripts/appetize-success-report-script.js createAppetizeSummaryReport ${{ github.head_ref || github.ref_name }} 'RN iOS'
- name: Slack Success Notification
if: ${{ success() && github.event.pull_request.base.ref == 'master' }}
uses: slackapi/[email protected]
with:
channel-id: ${{ secrets.SLACK_MOBILE_SDK_CHANNEL }}
payload-file-path: '/var/tmp/appetize-success-link-summary.json'
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
- name: Create Slack Failure Summary Report
if: ${{ failure() && github.event.pull_request.base.ref == 'master' }}
run: |
node report-scripts/appetize-failure-report-script.js createAppetizeSummaryReport ${{ github.head_ref || github.ref_name }} 'RN iOS'
- name: Slack Notification
if: ${{ failure() && github.event.pull_request.base.ref == 'master' }}
uses: slackapi/[email protected]
with:
channel-id: ${{ secrets.SLACK_MOBILE_SDK_CHANNEL }}
payload-file-path: '/var/tmp/appetize-failure-link-summary.json'
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
- name: Save Simulator app
uses: actions/upload-artifact@v3
id: save_simulator_app_id_step
with:
name: PrimerSDK_Debug_Build
path: /var/tmp/PrimerSDK_Debug_Build.zip
if-no-files-found: error
build-and-upload-to-browserstack:
runs-on: macos-latest
timeout-minutes: 30
name: Build and upload app to BrowserStack 🚀
steps:
- name: Cancel previous jobs
uses: styfle/[email protected]
with:
access_token: ${{ github.token }}
- name: Git Checkout
uses: actions/checkout@v3
- name: Select Xcode Version
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Install SSH key
uses: shimataro/ssh-key-action@v2
with:
key: ${{ secrets.SSH_KEY }}
name: id_rsa_github_actions
known_hosts: unnecessary
- uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_KEY }}
- uses: ruby/setup-ruby@v1
with:
ruby-version: "2.6"
bundler-cache: true
- uses: actions/setup-ruby@v1
with:
ruby-version: '2.6'
- uses: actions/setup-node@v3
with:
node-version: 18
cache: 'yarn'
- name: Add slack message builder
run: |
yarn add slack-message-builder
- name: Get npm cache directory
id: npm-cache-dir
run: echo "dir=$(npm config get cache)" >> ${GITHUB_OUTPUT}
- name: Cache npm dependencies
uses: actions/cache@v3
id: npm-cache
with:
path: ${{ steps.npm-cache-dir.outputs.dir }}
key: ${{ runner.os }}-node-${{ hashFiles('*/package-lock.json', '*/*/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Set legacy-peer-deps for npm config
run: |
npm config set legacy-peer-deps true
- name: Cache pods
uses: actions/cache@v3
with:
path: |
ios/Pods
~/Library/Caches/CocoaPods
~/.cocoapods
key: ${{ runner.os }}-pods-${{ hashFiles('*/Podfile.lock', '*/*/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-pods-
- name: Install packages
run: |
yarn
- name: Create main.jsbundle
run: |
yarn --cwd example build:ios
- name: Distribute the React Native iOS app on Appetize 🚀
run: |
bundle exec fastlane ios qa_release
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
MATCH_GIT_PRIVATE_KEY: ${{ secrets.SSH_KEY }}
FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}
FASTLANE_SESSION: ${{ secrets.FASTLANE_SESSION }}
MATCH_KEYCHAIN_NAME: ${{ secrets.MATCH_KEYCHAIN_NAME }}
MATCH_KEYCHAIN_PASSWORD: ${{ secrets.MATCH_KEYCHAIN_PASSWORD }}
APPETIZE_API_TOKEN: ${{ secrets.APPETIZE_API_TOKEN }}
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
SOURCE_BRANCH: ${{ github.head_ref }}
PR_NUMBER: ${{ github.event.pull_request.number }}
- name: Save build log
uses: actions/upload-artifact@v3
id: fastlane_build_log
if: ${{ failure() }}
with:
name: fastlane_build.log
path: /Users/runner/Library/Logs/gym/example_0_70_6-example_0_70_6.log
- name: Save Browserstack ID
uses: actions/upload-artifact@v3
id: save_browserstack_id_step
with:
name: browserstack_id
path: /var/tmp/browserstack_id.txt
if-no-files-found: error
test-via-browserstack:
if: false # Re-enable when we have tests set up
runs-on: ubuntu-latest
needs: build-and-upload-to-browserstack
name: Browserstack test
steps:
- name: Clone and launch Browserstack tests via Appium 🧪
run: |
git clone -b develop https://project_41483872_bot:[email protected]/primer-io/dx/mobile-appium-tests.git .
env:
GITLAB_TEMP_PATH: ${{ secrets.GITLAB_APPIUM_PULL_KEY }}
- name: Retrieve Browserstack ID
uses: actions/download-artifact@v3
with:
name: browserstack_id
path: /var/tmp
- name: Setup node
uses: actions/setup-node@v1
with:
node-version: 18
- name: npm Install
run: npm install
- name: Run Appium Test
env:
BROWSERSTACK_USERNAME: ${{secrets.BROWSERSTACK_USERNAME}}
BROWSERSTACK_ACCESS_KEY: ${{secrets.BROWSERSTACK_ACCESS_KEY}}
run: |
export BROWSERSTACK_APP_ID=$(cat /var/tmp/browserstack_id.txt)
npx wdio config/wdio.rn.ios.bs.conf.js
- name: Create Slack Failed Summary Report
if: ${{ failure() && github.event.pull_request.base.ref == 'master' }}
run: |
node report-script/slack-failed-report-script.js createSlackFailedSummaryReport ${{ steps.slack.outputs.thread_ts }}
env:
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
- name: Post detailed summary to Slack channel thread
if: ${{ failure() && github.event.pull_request.base.ref == 'master' }}
id: slack_thread
uses: slackapi/[email protected]
with:
channel-id: ${{ secrets.SLACK_MOBILE_SDK_CHANNEL }}
payload-file-path: '/var/tmp/slack_failed_summary.json'
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
- name: Create and post Github summary
if: ${{ success() || failure() }}
run: |
node report-script/github-tests-summary-script.js createGithubSummaryReport
ios-test-rn-version-compatibility:
name: Test react-native version compatibility
needs: build-and-upload-to-browserstack
runs-on: macos-latest
strategy:
matrix:
version: ["0.70.8", "0.72.3"]
steps:
- name: Cancel previous jobs
uses: styfle/[email protected]
with:
access_token: ${{ github.token }}
- name: Git Checkout
uses: actions/checkout@v3
- name: Retrieve Browserstack ID
uses: actions/download-artifact@v3
with:
name: browserstack_id
path: /var/tmp
- name: Select Xcode Version
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Install SSH key
uses: shimataro/ssh-key-action@v2
with:
key: ${{ secrets.SSH_KEY }}
name: id_rsa_github_actions
known_hosts: unnecessary
- uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_KEY }}
- uses: ruby/setup-ruby@v1
with:
ruby-version: "2.6"
bundler-cache: true
- uses: actions/setup-node@v3
with:
node-version: 18
cache: 'yarn'
- name: Add slack message builder
run: |
yarn add slack-message-builder
- name: Get npm cache directory
id: npm-cache-dir
run: echo "dir=$(npm config get cache)" >> ${GITHUB_OUTPUT}
- name: Cache npm dependencies
uses: actions/cache@v3
id: npm-cache
with:
path: ${{ steps.npm-cache-dir.outputs.dir }}
key: ${{ runner.os }}-node-${{ hashFiles('*/package-lock.json', '*/*/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Set legacy-peer-deps for npm config
run: |
npm config set legacy-peer-deps true
- name: Create test app
run: |
npx react-native init testapp --version ${{matrix.version}}
- name: Install Primer SDK
run: |
yarn --cwd testapp add @primer-io/react-native
- name: CocoaPods Install
run: |
cd testapp/ios ; npx pod-install ; cd ..
- name: Move Testing Template Files
run: |
cp -r compat-testing/* testapp/
- name: Install Appium Packages
working-directory: ./testapp
run: |
yarn add --dev \
appium appium-xcuitest-driver \
appium-uiautomator2-driver \
mocha-tags \
@wdio/appium-service \
@wdio/browserstack-service \
@wdio/cli \
@wdio/local-runner \
@wdio/mocha-framework \
@wdio/spec-reporter \
wdio-json-reporter \
@babel/cli \
@babel/preset-env \
@babel/register \
typescript \
ts-node
- name: Run iOS bundler and build
working-directory: ./testapp
run: |
npx react-native run-ios
- name: Start Appium Server
working-directory: ./testapp
run: |
nohup npx appium &
- name: Run Compatibility Tests
working-directory: ./testapp
env:
BROWSERSTACK_USERNAME: ${{secrets.BROWSERSTACK_USERNAME}}
BROWSERSTACK_ACCESS_KEY: ${{secrets.BROWSERSTACK_ACCESS_KEY}}
run: |
export BROWSERSTACK_APP_ID=$(cat /var/tmp/browserstack_id.txt)
npx wdio test-config/wdio.ios.conf.js
- name: Create Slack Report
if: ${{ (success() || failure()) && github.event.pull_request.base.ref == 'master' }}
run: |
node report-scripts/test-report-script.js createSlackReport iOS
- name: Post summary message to a Slack channel
if: ${{ (success() || failure()) && github.event.pull_request.base.ref == 'master' }}
id: slack
uses: slackapi/[email protected]
with:
channel-id: ${{ secrets.SLACK_MOBILE_SDK_CHANNEL }}
payload-file-path: '/var/tmp/slack-minimal_summary.json'
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}