diff --git a/.circleci/config.yml b/.circleci/config.yml index 75fc52c6543..6bc7dff061f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,6 +7,26 @@ orbs: macos: circleci/macos@2.5.1 android: circleci/android@2.5.0 +only-main-or-release-or-build-me: &only-main-or-release-or-build-me + filters: + branches: + only: + - main + - /.*release$/ + - /.*build-me$/ + - /.*hotfix$/ + - /.*beta-$/ + +only-prs: &only-prs + filters: + branches: + ignore: + - main + - /.*release$/ + - /.*build-me$/ + - /.*hotfix$/ + - /.*beta-$/ + commands: await-previous-builds: parameters: @@ -254,6 +274,28 @@ jobs: echo "Triggering CodePush deployment..." ./scripts/codepush/deploy-to-codepush.sh Staging + test-js-pr: + parallelism: 8 + executor: + name: node/default + tag: "20.9.0" + resource_class: large + steps: + - checkout + - install-node-modules + - run-relay-compiler + - run: + name: Run Jest For Updated Files and Scenes Only + command: ./scripts/ci/ci-test-js-pr + no_output_timeout: 3600s + environment: + JEST_JUNIT_OUTPUT_DIR: ./reports/junit/ + JEST_JUNIT_UNIQUE_OUTPUT_NAME: true + - store_artifacts: + path: ./reports/junit/ + - store_test_results: + path: ./reports/junit/ + test-js: parallelism: 8 executor: @@ -503,7 +545,11 @@ workflows: only: - main - - test-js + - test-js: + <<: *only-main-or-release-or-build-me + + - test-js-pr: + <<: *only-prs - build-test-js diff --git a/scripts/ci/ci-test-js-pr b/scripts/ci/ci-test-js-pr new file mode 100755 index 00000000000..bc2b27b702f --- /dev/null +++ b/scripts/ci/ci-test-js-pr @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +UPDATED_GLOBAL_FILES=$(git diff --name-only origin/main...$CIRCLE_SHA1 | grep -E '^.+\.(ts|tsx)$' | grep -v '^src/app/Scenes/' | grep -v '^src/__generated__/') +UPDATED_PACKAGES=$(git diff --name-only origin/main...$CIRCLE_SHA1 | grep -E "package.json|yarn.lock") +UPDATED_SCENES=$(git diff --name-only origin/main...$CIRCLE_SHA1 | grep -E '^.+\.(ts|tsx)$' | sed -n 's#^src/app/Scenes/\([^/]*\)/.*#src/app/Scenes/\1#p' | uniq) + +ALL_UPDATED_FILES=$(git diff --name-only origin/main...$CIRCLE_SHA1 | grep -E '^.+\.(ts|tsx)$' | xargs -n 1 basename) +JEST_OPTIONS="--ci --forceExit --logHeapUsage --runInBand --reporters=default --reporters=jest-junit --shard=$(expr $CIRCLE_NODE_INDEX + 1)/$CIRCLE_NODE_TOTAL" + + +# If only scene files in `src/app/Scenes` have been updated, run only tests for those scenes. +# If global TypeScript files or `package.json` have been updated, run all tests. +# If no `.ts` or `.tsx` files or packages have been updated, don't run any tests. +if [ -n "$UPDATED_GLOBAL_FILES" ] || [ -n "$UPDATED_PACKAGES" ] +then + yarn jest $JEST_OPTIONS +elif [ -n "$UPDATED_SCENES" ] || [ -n "$ALL_UPDATED_FILES" ] + yarn jest $UPDATED_SCENES $ALL_UPDATED_FILES $JEST_OPTIONS +then + echo "No ts|tsx files are updated. Skipping tests." +fi \ No newline at end of file