mirror of
https://github.com/status-im/react-native.git
synced 2025-01-10 09:35:48 +00:00
6e99e314b2
Summary: This change (initially discussed in https://github.com/react-community/create-react-native-app/issues/26) moves the HelloWorld project template from two nearly identical entry points (`index.android.js` and `index.ios.js`) to a single, minimal `index.js` entry point. The root component is created in `App.js`. This unifies the project structure between `react-native init` and Create React Native App and allows CRNA's eject to use the entry point from the HelloWorld template without any hacks to customize it. Also examples in the docs can be just copy-pasted to `App.js` the same way in both HelloWorld and CRNA apps without having to first learn about `AppRegistry.registerComponent`. * Created a new project from the template using `./scripts/test-manual-e2e.sh` and verified that: * The app builds, starts and runs both on Android and iOS. * Editing and reloading changes works. * The new files (`index.js`, `App.js`, `__tests__/App.js`) get created in the project folder. <img width="559" alt="screen shot 2017-08-01 at 19 10 51" src="https://user-images.githubusercontent.com/497214/28835171-300a12b6-76ed-11e7-81b2-623639c3b8f6.png"> <img width="467" alt="screen shot 2017-08-01 at 19 09 12" src="https://user-images.githubusercontent.com/497214/28835180-33d285e0-76ed-11e7-8d68-2b3bc44bf585.png"> <!-- Thank you for sending the PR! If you changed any code, please provide us with clear instructions on how you verified your changes work. In other words, a test plan is *required*. Bonus points for screenshots and videos! Please read the Contribution Guidelines at https://github.com/facebook/react-native/blob/master/CONTRIBUTING.md to learn more about contributing to React Native. Happy contributing! --> Closes https://github.com/facebook/react-native/pull/15312 Differential Revision: D5556276 Pulled By: hramos fbshipit-source-id: 068fdf7e51381c2bc50321522f2be0db47296c5e
254 lines
6.4 KiB
Bash
Executable File
254 lines
6.4 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -ex
|
|
|
|
# set default environment variables
|
|
ROOT=$(pwd)
|
|
SCRIPTS=$(pwd)/scripts
|
|
|
|
RUN_ANDROID=0
|
|
RUN_CLI_INSTALL=1
|
|
RUN_IOS=0
|
|
RUN_JS=0
|
|
|
|
RETRY_COUNT=${RETRY_COUNT:-2}
|
|
AVD_UUID=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1)
|
|
|
|
ANDROID_NPM_DEPS="appium@1.5.1 mocha@2.4.5 wd@0.3.11 colors@1.0.3 pretty-data2@0.40.1"
|
|
CLI_PACKAGE=$ROOT/react-native-cli/react-native-cli-*.tgz
|
|
PACKAGE=$ROOT/react-native-*.tgz
|
|
|
|
# solve issue with max user watches limit
|
|
echo 65536 | tee -a /proc/sys/fs/inotify/max_user_watches
|
|
watchman shutdown-server
|
|
|
|
# retries command on failure
|
|
# $1 -- max attempts
|
|
# $2 -- command to run
|
|
function retry() {
|
|
local -r -i max_attempts="$1"; shift
|
|
local -r cmd="$@"
|
|
local -i attempt_num=1
|
|
|
|
until $cmd; do
|
|
if (( attempt_num == max_attempts )); then
|
|
echo "Execution of '$cmd' failed; no more attempts left"
|
|
return 1
|
|
else
|
|
(( attempt_num++ ))
|
|
echo "Execution of '$cmd' failed; retrying for attempt number $attempt_num..."
|
|
fi
|
|
done
|
|
}
|
|
|
|
# parse command line args & flags
|
|
while :; do
|
|
case "$1" in
|
|
--android)
|
|
RUN_ANDROID=1
|
|
shift
|
|
;;
|
|
|
|
--ios)
|
|
RUN_IOS=1
|
|
shift
|
|
;;
|
|
|
|
--js)
|
|
RUN_JS=1
|
|
shift
|
|
;;
|
|
|
|
--skip-cli-install)
|
|
RUN_CLI_INSTALL=0
|
|
shift
|
|
;;
|
|
|
|
--tvos)
|
|
RUN_IOS=1
|
|
shift
|
|
;;
|
|
|
|
*)
|
|
break
|
|
esac
|
|
done
|
|
|
|
function e2e_suite() {
|
|
cd $ROOT
|
|
|
|
if [ $RUN_ANDROID -eq 0 ] && [ $RUN_IOS -eq 0 ] && [ $RUN_JS -eq 0 ]; then
|
|
echo "No e2e tests specified!"
|
|
return 0
|
|
fi
|
|
|
|
# create temp dir
|
|
TEMP_DIR=$(mktemp -d /tmp/react-native-XXXXXXXX)
|
|
|
|
# To make sure we actually installed the local version
|
|
# of react-native, we will create a temp file inside the template
|
|
# and check that it exists after `react-native init
|
|
IOS_MARKER=$(mktemp $ROOT/local-cli/templates/HelloWorld/ios/HelloWorld/XXXXXXXX)
|
|
ANDROID_MARKER=$(mktemp ${ROOT}/local-cli/templates/HelloWorld/android/XXXXXXXX)
|
|
|
|
# install CLI
|
|
cd react-native-cli
|
|
npm pack
|
|
cd ..
|
|
|
|
# can skip cli install for non sudo mode
|
|
if [ $RUN_CLI_INSTALL -ne 0 ]; then
|
|
npm install -g $CLI_PACKAGE
|
|
if [ $? -ne 0 ]; then
|
|
echo "Could not install react-native-cli globally, please run in su mode"
|
|
echo "Or with --skip-cli-install to skip this step"
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
if [ $RUN_ANDROID -ne 0 ]; then
|
|
set +ex
|
|
|
|
# create virtual device
|
|
if ! android list avd | grep "$AVD_UUID" > /dev/null; then
|
|
echo no | android create avd -n $AVD_UUID -f -t android-19 --abi default/armeabi-v7a
|
|
fi
|
|
|
|
# newline at end of adb devices call and first line is headers
|
|
DEVICE_COUNT=$(adb devices | wc -l)
|
|
((DEVICE_COUNT -= 2))
|
|
|
|
# will always kill an existing emulator if one exists for fresh setup
|
|
if [[ $DEVICE_COUNT -ge 1 ]]; then
|
|
adb emu kill
|
|
fi
|
|
|
|
# emulator setup
|
|
emulator64-arm -avd $AVD_UUID -no-skin -no-audio -no-window -no-boot-anim &
|
|
|
|
bootanim=""
|
|
until [[ "$bootanim" =~ "stopped" ]]; do
|
|
sleep 5
|
|
bootanim=$(adb -e shell getprop init.svc.bootanim 2>&1)
|
|
echo "boot animation status=$bootanim"
|
|
done
|
|
|
|
set -ex
|
|
|
|
./gradlew :ReactAndroid:installArchives -Pjobs=1 -Dorg.gradle.jvmargs="-Xmx512m -XX:+HeapDumpOnOutOfMemoryError"
|
|
if [ $? -ne 0 ]; then
|
|
echo "Failed to compile Android binaries"
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
npm pack
|
|
if [ $? -ne 0 ]; then
|
|
echo "Failed to pack react-native"
|
|
return 1
|
|
fi
|
|
|
|
cd $TEMP_DIR
|
|
|
|
retry $RETRY_COUNT react-native init EndToEndTest --version $PACKAGE --npm
|
|
if [ $? -ne 0 ]; then
|
|
echo "Failed to execute react-native init"
|
|
echo "Most common reason is npm registry connectivity, try again"
|
|
return 1
|
|
fi
|
|
|
|
cd EndToEndTest
|
|
|
|
# android tests
|
|
if [ $RUN_ANDROID -ne 0 ]; then
|
|
echo "Running an Android e2e test"
|
|
echo "Installing e2e framework"
|
|
|
|
retry $RETRY_COUNT npm install --save-dev $ANDROID_NPM_DEPS --silent >> /dev/null
|
|
if [ $? -ne 0 ]; then
|
|
echo "Failed to install appium"
|
|
echo "Most common reason is npm registry connectivity, try again"
|
|
return 1
|
|
fi
|
|
|
|
cp $SCRIPTS/android-e2e-test.js android-e2e-test.js
|
|
|
|
cd android
|
|
echo "Downloading Maven deps"
|
|
./gradlew :app:copyDownloadableDepsToLibs
|
|
|
|
cd ..
|
|
keytool -genkey -v -keystore android/keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"
|
|
|
|
node ./node_modules/.bin/appium >> /dev/null &
|
|
APPIUM_PID=$!
|
|
echo "Starting appium server $APPIUM_PID"
|
|
|
|
echo "Building app"
|
|
buck build android/app
|
|
|
|
# hack to get node unhung (kill buckd)
|
|
kill -9 $(pgrep java)
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo "could not execute Buck build, is it installed and in PATH?"
|
|
return 1
|
|
fi
|
|
|
|
echo "Starting packager server"
|
|
npm start >> /dev/null &
|
|
SERVER_PID=$!
|
|
sleep 15
|
|
|
|
echo "Executing android e2e test"
|
|
retry $RETRY_COUNT node node_modules/.bin/_mocha android-e2e-test.js
|
|
if [ $? -ne 0 ]; then
|
|
echo "Failed to run Android e2e tests"
|
|
echo "Most likely the code is broken"
|
|
return 1
|
|
fi
|
|
|
|
# kill packager process
|
|
if kill -0 $SERVER_PID; then
|
|
echo "Killing packager $SERVER_PID"
|
|
kill -9 $SERVER_PID
|
|
fi
|
|
|
|
# kill appium process
|
|
if kill -0 $APPIUM_PID; then
|
|
echo "Killing appium $APPIUM_PID"
|
|
kill -9 $APPIUM_PID
|
|
fi
|
|
|
|
fi
|
|
|
|
# ios tests
|
|
if [ $RUN_IOS -ne 0 ]; then
|
|
echo "Running ios e2e tests not yet implemented for docker!"
|
|
fi
|
|
|
|
# js tests
|
|
if [ $RUN_JS -ne 0 ]; then
|
|
# Check the packager produces a bundle (doesn't throw an error)
|
|
react-native bundle --max-workers 1 --platform android --dev true --entry-file index.js --bundle-output android-bundle.js
|
|
if [ $? -ne 0 ]; then
|
|
echo "Could not build android bundle"
|
|
return 1
|
|
fi
|
|
|
|
react-native bundle --max-workers 1 --platform ios --dev true --entry-file index.js --bundle-output ios-bundle.js
|
|
if [ $? -ne 0 ]; then
|
|
echo "Could not build iOS bundle"
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
# directory cleanup
|
|
rm $IOS_MARKER
|
|
rm $ANDROID_MARKER
|
|
|
|
return 0
|
|
}
|
|
|
|
retry $RETRY_COUNT e2e_suite
|