Merge branch 'devel' into release-3.5

This commit is contained in:
italo jose
2026-04-23 08:37:56 -03:00
9 changed files with 940 additions and 954 deletions

View File

@@ -1,920 +0,0 @@
version: 2.1
# A reusable "run" snippet which is ran before each test to setup the
# environment for user-limits, core-dumps, etc.
run_env_change: &run_env_change
name: Environment Changes
command: |
# Make a place to core dumps to live.
sudo mkdir -p /tmp/core_dumps
sudo chmod a+rwx /tmp/core_dumps
# Bake the locale we expect into the image.
echo "en_US.UTF-8 UTF-8" | sudo tee /etc/locale.gen
sudo locale-gen
# The commands below don't work in Docker images, but might be worth
# reenabling if we switch back to machine:true instead of Docker.
# Set the pattern for core dumps, so we can find them.
# echo kernel.core_pattern="/tmp/core_dumps/core.%e.%p.%h.%t" | \
# sudo tee -a /etc/sysctl.conf
# Note that since every "run" command starts its own shell, and I wasn't
# able to set this at a system wide level for all users, it's necessary to
# run "ulimit -c unlimited" before each command which you want to (possibly)
# output a core dump.
# Raise inotify user watches up higher.
# echo fs.inotify.max_user_watches=524288 | \
# sudo tee -a /etc/sysctl.conf
# Reload sysctl so these are in effect.
# sudo sysctl -p
log_env: &log_env
name: Log Environment
command: |
echo "==> LBS Version"
lsb_release -a
echo "==> cat /etc/os-release"
cat /etc/os-release
echo "==> uname -srm"
uname -srm
echo "==> Node version: $(node --version)"
echo "==> NPM version: $(npm --version)"
echo "==> Meteor Node version: $(./meteor node --version)"
echo "==> Meteor NPM version: $(./meteor npm --version)"
echo "==> Dev bundle package.json:"
cat ./dev_bundle/lib/package.json
echo "==> Dev bundle node_modules:"
ls -l ./dev_bundle/lib/node_modules
# A reusable "run" snippet which enables the continued logging of memoryusage
# to a file on disk which can be saved to build artifacts for later analysis.
run_log_mem_use: &run_log_mem_use
background: true
name: Setup Memory Logging
command: |
# Log memory usage throughout entire build.
MEMUSELOG=/tmp/memuse.txt /bin/bash -c '\
while true; do\
ps -e -o user,%cpu,%mem,rss:10,vsz:10,command:20 \
--sort=-%mem >> $MEMUSELOG; \
echo "----------" >> $MEMUSELOG; \
sleep 1; \
done'
# A reusable "run" snippet for saving the Node binary if a core dump is present.
run_save_node_bin: &run_save_node_bin
name: Save Node Binary
when: on_fail
command: |
if compgen -G "/tmp/core_dumps/core.*" > /dev/null; then
echo "Saving Node binary since Core dump is present..."
cp dev_bundle/bin/node /tmp/core_dumps/node
fi
# This environment is set to every job (and the initial build).
build_machine_environment:
&build_machine_environment # Specify that we want an actual machine (ala Circle 1.0), not a Docker image.
docker:
- image: meteor/circleci:2025.07.8-android-35-node-22
resource_class: large
environment:
# This multiplier scales the waitSecs for selftests.
TIMEOUT_SCALE_FACTOR: 8
# Retry failed tests additional times.
METEOR_SELF_TEST_RETRIES: 2
# These, mostly overlapping, flags ensure that CircleCI is as pretty as
# possible for a non-interactive environment. See also: --headless.
METEOR_HEADLESS: true
METEOR_PRETTY_OUTPUT: 0
# In an effort to stop SIGSEGV, this just doesn't bother cleaning up
# the mess of temp directories that Meteor makes.
METEOR_SAVE_TMPDIRS: 1
# Skip these tests on every test run.
# If needed, for readability this should be a regex wrapped across
# multiple lines in quotes.
SELF_TEST_EXCLUDE: "add debugOnly and prodOnly packages"
# These will be evaled before each command.
PRE_TEST_COMMANDS: |-
ulimit -c unlimited; # Set core dump size as Ubuntu 14.04 lacks prlimit.
ulimit -a # Display all ulimit settings for transparency.
# This is only to make Meteor self-test not remind us that we can set
# this argument for self-tests.
SELF_TEST_TOOL_NODE_FLAGS: " "
# Variables for load-balancing
NUM_GROUPS: 12
RUNNING_AVG_LENGTH: 6
# Force modern bundler test
METEOR_MODERN: true
jobs:
Get Ready:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- checkout
- run:
# https://discuss.circleci.com/t/git-submodule-url-isnt-playing-nice-with-the-cache/549/3
name: Git Submodules.
command: (git submodule sync && git submodule update --init --recursive) || (rm -fr .git/config .git/modules && git submodule deinit -f . && git submodule update --init --recursive)
- restore_cache:
keys:
- v3-dev-bundle-cache-{{ checksum "meteor" }}
- v3-dev-bundle-cache-
- run:
name: Combine NPM Shrinkwrap Files
command: |
for d in packages/*/.npm/package; do
if [ -f $d/npm-shrinkwrap.json ]; then
cat $d/npm-shrinkwrap.json >> shrinkwraps.txt;
fi
done
for d in packages/*/.npm/plugin/*; do
if [ -f $d/npm-shrinkwrap.json ]; then
cat $d/npm-shrinkwrap.json >> shrinkwraps.txt;
fi
done
- restore_cache:
keys:
- package-npm-deps-cache-group1-v3-{{ checksum "shrinkwraps.txt" }}
- package-npm-deps-cache-group1-v3-
- restore_cache:
keys:
- package-npm-deps-cache-group2-v6-{{ checksum "shrinkwraps.txt" }}
- package-npm-deps-cache-group2-v6-
- restore_cache:
keys:
- v7-other-deps-cache-{{ .Branch }}-{{ checksum "meteor" }}-{{ .Revision }}
- v7-other-deps-cache-{{ .Branch }}-{{ checksum "meteor" }}-
- v7-other-deps-cache-{{ .Branch }}-
- restore_cache:
keys:
- v4-test-groups-{{ .Branch }}
- v4-test-groups-
- run:
name: Create Test Results Directory
command: |
sudo mkdir -p ./tmp/results/junit
sudo chmod a+rwx ./tmp/results/junit
# Clear dev_bundle/.npm to ensure consistent test runs.
- run:
name: Clear npm cache
command: ./meteor npm cache clear --force
- run:
<<: *log_env
- run:
name: Get Ready
command: |
eval $PRE_TEST_COMMANDS;
cd dev_bundle/lib
../../meteor npm install @types/node@22.7.4 --save-dev
# Ensure that meteor/tools has no TypeScript errors.
../../meteor npm install -g typescript
cd ../../
# tools/node_modules is a symlink, but starting on NPM 7, this symlinks are deleted https://github.com/npm/cli/issues/3669
# so we are copying the node_modules to tools
./meteor --get-ready
# shouldn't take longer than 60 minutes
no_output_timeout: 60m
- run:
<<: *run_save_node_bin
- persist_to_workspace:
root: .
paths: .
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Isolated Tests:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
name: "Print environment"
command: printenv
- run:
name: "Running self-test ('package-tests: add debugOnly and prodOnly packages')"
command: |
eval $PRE_TEST_COMMANDS;
./meteor self-test \
'add debugOnly and prodOnly packages' \
--retries ${METEOR_SELF_TEST_RETRIES} \
--headless \
no_output_timeout: 20m
- run:
<<: *log_env
- run:
name: "Running self-test (Custom Warehouse Tests)"
command: |
eval $PRE_TEST_COMMANDS;
./meteor self-test \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--with-tag "custom-warehouse"
no_output_timeout: 20m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Test Group 0:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
name: "Print environment"
command: printenv
- run:
<<: *log_env
- run:
name: "Running self-test (Test Group 0)"
command: |
if [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=$(<./tmp/test-groups/0.txt); else TEST_GROUP='^[a-b]|^c[a-n]|^co[a-l]|^comm'; fi
echo $TEST_GROUP;
eval $PRE_TEST_COMMANDS;
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/0.xml \
--without-tag "custom-warehouse"
no_output_timeout: 30m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- persist_to_workspace:
root: .
paths: ./tmp/results/junit
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Test Group 1:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
name: "Print environment"
command: printenv
- run:
<<: *log_env
- run:
name: "Running self-test (Test Group 1)"
command: |
if [ -f ./tmp/test-groups/1.txt ]; then TEST_GROUP=$(<./tmp/test-groups/1.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^com[n-z]'; fi
echo $TEST_GROUP;
eval $PRE_TEST_COMMANDS;
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/1.xml \
--without-tag "custom-warehouse"
no_output_timeout: 20m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- persist_to_workspace:
root: .
paths: ./tmp/results/junit
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Test Group 2:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
<<: *log_env
- run:
name: "Print environment"
command: printenv
- run:
name: "Running self-test (Test Group 2)"
command: |
if [ -f ./tmp/test-groups/2.txt ]; then TEST_GROUP=$(<./tmp/test-groups/2.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^co[n-z]'; fi
echo $TEST_GROUP;
eval $PRE_TEST_COMMANDS;
export PATH="/home/circleci/.sdkman/candidates/gradle/8.7/bin:${PATH}"
java --version
gradle --version
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/2.xml \
--without-tag "custom-warehouse"
no_output_timeout: 20m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- persist_to_workspace:
root: .
paths: ./tmp/results/junit
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Test Group 3:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
<<: *log_env
- run:
name: "Print environment"
command: printenv
- run:
name: "Running self-test (Test Group 3)"
command: |
if [ -f ./tmp/test-groups/3.txt ]; then TEST_GROUP=$(<./tmp/test-groups/3.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^c[p-z]|^h[a-e]'; fi
echo $TEST_GROUP;
eval $PRE_TEST_COMMANDS;
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/3.xml \
--without-tag "custom-warehouse"
no_output_timeout: 30m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- persist_to_workspace:
root: .
paths: ./tmp/results/junit
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Test Group 4:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
name: "Print environment"
command: printenv
- run:
<<: *log_env
- run:
name: "Running self-test (Test Group 4)"
command: |
if [ -f ./tmp/test-groups/4.txt ]; then TEST_GROUP=$(<./tmp/test-groups/4.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^h[f-z]|^[i-l]'; fi
echo $TEST_GROUP;
eval $PRE_TEST_COMMANDS;
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/4.xml \
--without-tag "custom-warehouse"
no_output_timeout: 20m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- persist_to_workspace:
root: .
paths: ./tmp/results/junit
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Test Group 5:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
name: "Print environment"
command: printenv
- run:
<<: *log_env
- run:
name: "Running self-test (Test Group 5)"
command: |
if [ -f ./tmp/test-groups/5.txt ]; then TEST_GROUP=$(<./tmp/test-groups/5.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^m[a-n]|^mo[a-d]'; fi
echo $TEST_GROUP;
eval $PRE_TEST_COMMANDS;
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/5.xml \
--without-tag "custom-warehouse"
no_output_timeout: 20m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- persist_to_workspace:
root: .
paths: ./tmp/results/junit
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Test Group 6:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
name: "Print environment"
command: printenv
- run:
<<: *log_env
- run:
name: "Running self-test (Test Group 6)"
command: |
if [ -f ./tmp/test-groups/6.txt ]; then TEST_GROUP=$(<./tmp/test-groups/6.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^mo[e-z]|^m[p-z]|^[n-o]'; fi
echo $TEST_GROUP;
eval $PRE_TEST_COMMANDS;
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/6.xml \
--without-tag "custom-warehouse"
no_output_timeout: 20m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- persist_to_workspace:
root: .
paths: ./tmp/results/junit
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Test Group 7:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
name: "Print environment"
command: printenv
- run:
<<: *log_env
- run:
name: "Running self-test (Test Group 7)"
command: |
if [ -f ./tmp/test-groups/7.txt ]; then TEST_GROUP=$(<./tmp/test-groups/7.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^[p-q]|^r[a-e]'; fi
echo $TEST_GROUP;
eval $PRE_TEST_COMMANDS;
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/7.xml \
--without-tag "custom-warehouse"
no_output_timeout: 20m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- persist_to_workspace:
root: .
paths: ./tmp/results/junit
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Test Group 8:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
name: "Print environment"
command: printenv
- run:
<<: *log_env
- run:
name: "Running self-test (Test Group 8)"
command: |
if [ -f ./tmp/test-groups/8.txt ]; then TEST_GROUP=$(<./tmp/test-groups/8.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^r[f-z]'; fi
echo $TEST_GROUP;
eval $PRE_TEST_COMMANDS;
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/8.xml \
--without-tag "custom-warehouse"
no_output_timeout: 20m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- persist_to_workspace:
root: .
paths: ./tmp/results/junit
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Test Group 9:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
name: "Print environment"
command: printenv
- run:
<<: *log_env
- run:
name: "Running self-test (Test Group 9)"
command: |
if [ -f ./tmp/test-groups/9.txt ]; then TEST_GROUP=$(<./tmp/test-groups/9.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^s'; fi
echo $TEST_GROUP;
eval $PRE_TEST_COMMANDS;
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/9.xml \
--without-tag "custom-warehouse"
no_output_timeout: 20m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- persist_to_workspace:
root: .
paths: ./tmp/results/junit
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Test Group 10:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
name: "Print environment"
command: printenv
- run:
<<: *log_env
- run:
name: "Running self-test (Test Group 10)"
command: |
if [ -f ./tmp/test-groups/10.txt ]; then TEST_GROUP=$(<./tmp/test-groups/10.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^[t-z]'; fi
echo $TEST_GROUP;
eval $PRE_TEST_COMMANDS;
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/10.xml \
--without-tag "custom-warehouse"
no_output_timeout: 20m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- persist_to_workspace:
root: .
paths: ./tmp/results/junit
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
Test Group 11:
<<: *build_machine_environment
steps:
- run:
<<: *run_log_mem_use
- run:
<<: *run_env_change
- attach_workspace:
at: .
- run:
name: "Print environment"
command: printenv
- run:
<<: *log_env
- run:
name: "Running self-test (Test Group 11)"
command: |
if [ -f ./tmp/test-groups/11.txt ]; then TEST_GROUP=$(<./tmp/test-groups/11.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^[d-g]'; fi
echo $TEST_GROUP;
eval $PRE_TEST_COMMANDS;
./meteor self-test \
"$TEST_GROUP" \
--retries ${METEOR_SELF_TEST_RETRIES} \
--exclude "${SELF_TEST_EXCLUDE}" \
--headless \
--junit ./tmp/results/junit/11.xml \
--without-tag "custom-warehouse"
no_output_timeout: 35m
- run:
<<: *run_save_node_bin
- store_test_results:
path: ./tmp/results
- persist_to_workspace:
root: .
paths: ./tmp/results/junit
- store_artifacts:
path: ./tmp/results
- store_artifacts:
path: /tmp/core_dumps
- store_artifacts:
path: /tmp/memuse.txt
# Test the JSDoc declarations which live within this codebase.
# Now the docs live in this repo, we can test them here, every PR is tested.
Docs:
docker:
# This Node version should match that in the meteor/docs CircleCI config.
- image: meteor/circleci:2025.07.8-android-35-node-22
resource_class: large
environment:
CHECKOUT_METEOR_DOCS: /home/circleci/test_docs
<<: *build_machine_environment
steps:
- run:
name: Cloning "meteor" Repository's current branch
command: |
if [[ -n "$CIRCLE_PULL_REQUEST" ]]; then
PR_NUMBER=$(echo $CIRCLE_PULL_REQUEST | sed 's|.*/pull/\([0-9]*\)|\1|')
PR_BRANCH=$(curl -s https://api.github.com/repos/meteor/meteor/pulls/$PR_NUMBER | jq -r .head.ref)
git clone https://github.com/meteor/meteor.git ${CHECKOUT_METEOR_DOCS}
cd ${CHECKOUT_METEOR_DOCS}
git fetch origin pull/$PR_NUMBER/head:$PR_BRANCH
else
git clone --branch $CIRCLE_BRANCH https://github.com/meteor/meteor.git ${CHECKOUT_METEOR_DOCS}
fi
# Run almost the same steps the meteor/docs repository runs, minus deploy.
- run:
name: Generating Meteor documentation for JSDoc testing
command: |
cd ${CHECKOUT_METEOR_DOCS}/docs
npm install
npm test
Clean Up:
<<: *build_machine_environment
steps:
- attach_workspace:
at: .
- run:
name: Create Test Groups Directory
command: |
sudo mkdir -p ./tmp/test-groups
sudo chmod a+rwx ./tmp/test-groups
- run:
name: Calculate Balanced Test Groups
command: |
npm install --prefix ./scripts/test-balancer
npm start --prefix ./scripts/test-balancer --num-groups ${NUM_GROUPS} --running-avg-length ${RUNNING_AVG_LENGTH}
- save_cache:
key: v1-test-groups-{{ .Branch }}-{{ .BuildNum }}
paths:
- ./tmp/test-groups
when: on_success
- save_cache:
key: v3-dev-bundle-cache-{{ checksum "meteor" }}
paths:
- "dev_bundle"
# The package npm dependencies are split into two caches to avoid an AWS
# `MetadataTooLarge` error that consistently appears if we put all of
# these folders in the same cache
- save_cache:
key: package-npm-deps-cache-group1-v3-{{ checksum "shrinkwraps.txt" }}
paths:
- packages/meteor/.npm/package/node_modules
- packages/modules-runtime/.npm/package/node_modules
- packages/modules/.npm/package/node_modules
- packages/ecmascript-runtime-server/.npm/package/node_modules
- packages/promise/.npm/package/node_modules
- packages/babel-compiler/.npm/package/node_modules
- packages/babel-runtime/.npm/package/node_modules
- packages/http/.npm/package/node_modules
- packages/socket-stream-client/.npm/package/node_modules
- packages/ddp-client/.npm/package/node_modules
- packages/npm-mongo/.npm/package/node_modules
- packages/package-version-parser/.npm/package/node_modules
- packages/boilerplate-generator/.npm/package/node_modules
- save_cache:
key: package-npm-deps-cache-group2-v5-{{ checksum "shrinkwraps.txt" }}
paths:
- packages/xmlbuilder/.npm/package/node_modules
- packages/logging/.npm/package/node_modules
- packages/webapp/.npm/package/node_modules
- packages/ddp-server/.npm/package/node_modules
- packages/mongo/.npm/package/node_modules
- packages/npm-bcrypt/.npm/package/node_modules
- packages/email/.npm/package/node_modules
- packages/caching-compiler/.npm/package/node_modules
- packages/less/.npm/plugin/compileLessBatch/node_modules
- packages/non-core/blaze/packages/spacebars-compiler/.npm/package/node_modules
- packages/boilerplate-generator-tests/.npm/package/node_modules
- packages/non-core/bundle-visualizer/.npm/package/node_modules
- packages/d3-hierarchy/.npm/package/node_modules
- packages/non-core/coffeescript-compiler/.npm/package/node_modules
- packages/server-render/.npm/package/node_modules
- packages/es5-shim/.npm/package/node_modules
- packages/force-ssl-common/.npm/package/node_modules
- packages/jshint/.npm/plugin/lintJshint/node_modules
- packages/minifier-css/.npm/package/node_modules
- packages/minifier-js/.npm/package/node_modules
- packages/standard-minifier-css/.npm/plugin/minifyStdCSS/node_modules
- packages/inter-process-messaging/.npm/package/node_modules
- packages/fetch/.npm/package/node_modules
- packages/non-core/mongo-decimal/.npm/package/node_modules
- save_cache:
key: v7-other-deps-cache-{{ .Branch }}-{{ checksum "meteor" }}-{{ .Revision }}
paths:
- ".babel-cache"
- ".meteor"
workflows:
version: 2
Build and Test:
jobs:
- Docs
- Get Ready
- Isolated Tests:
requires:
- Get Ready
- Test Group 0:
requires:
- Get Ready
- Test Group 1:
requires:
- Get Ready
- Test Group 2:
requires:
- Get Ready
- Test Group 3:
requires:
- Get Ready
- Test Group 4:
requires:
- Get Ready
- Test Group 5:
requires:
- Get Ready
- Test Group 6:
requires:
- Get Ready
- Test Group 7:
requires:
- Get Ready
- Test Group 8:
requires:
- Get Ready
- Test Group 9:
requires:
- Get Ready
- Test Group 10:
requires:
- Get Ready
- Test Group 11:
requires:
- Get Ready
- Clean Up:
requires:
- Isolated Tests
- Test Group 0
- Test Group 1
- Test Group 2
- Test Group 3
- Test Group 4
- Test Group 5
- Test Group 6
- Test Group 7
- Test Group 8
- Test Group 9
- Test Group 10
- Test Group 11

View File

@@ -6,7 +6,6 @@
*.md
*.json
tsconfig.json
.travis.yml
android_bundle/
dev_bundle/
docs/
@@ -18,7 +17,6 @@ npm-packages/
v3-docs/
node_modules/
.meteor/
.circleci/
.github/
.coderabbit.yaml

934
.github/workflows/test-tools.yml vendored Normal file
View File

@@ -0,0 +1,934 @@
name: Test Tools
on:
pull_request:
paths:
- "tools/**"
- "packages/**"
- "meteor"
- "meteor.bat"
- ".github/workflows/test-tools.yml"
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
# Multiplies the waitSecs for self-tests.
TIMEOUT_SCALE_FACTOR: 8
# Retry failed tests additional times.
METEOR_SELF_TEST_RETRIES: 2
METEOR_HEADLESS: true
METEOR_PRETTY_OUTPUT: 0
# Avoid SIGSEGV from cleaning up temp directories.
METEOR_SAVE_TMPDIRS: 1
# Skip this test on every run (it lives in Isolated Tests instead).
SELF_TEST_EXCLUDE: "add debugOnly and prodOnly packages"
# Suppress the self-test node-flags reminder.
SELF_TEST_TOOL_NODE_FLAGS: " "
METEOR_MODERN: true
CXX: g++-12
METEOR_ALLOW_SUPERUSER: 1
jobs:
# ─── Setup ────────────────────────────────────────────────────────────────────
# Prepares the Meteor environment and populates the cache so all parallel
# test jobs get a cache hit and skip the slow --get-ready step.
setup:
name: Setup
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root
timeout-minutes: 75
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
# puppeteer is pre-installed on oss-vm via `npm install -g`.
# Setting NODE_PATH lets `require('puppeteer')` resolve it directly,
# so --get-ready skips the slow `./meteor npm install -g puppeteer` step.
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
id: meteor-cache
uses: actions/cache@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Prepare Meteor
if: steps.meteor-cache.outputs.cache-hit != 'true'
timeout-minutes: 65
run: ./meteor --get-ready
# ─── Isolated Tests ───────────────────────────────────────────────────────────
# Tests that must run in isolation: the debugOnly/prodOnly package test
# (excluded from all groups) and any custom-warehouse tests.
isolated-tests:
name: Isolated Tests
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root
needs: setup
timeout-minutes: 45
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
- name: Running self-test (add debugOnly and prodOnly packages)
timeout-minutes: 20
run: |
ulimit -c unlimited
./meteor self-test \
'add debugOnly and prodOnly packages' \
--retries "$METEOR_SELF_TEST_RETRIES" \
--headless
- name: Running self-test (Custom Warehouse Tests)
timeout-minutes: 20
run: |
ulimit -c unlimited
./meteor self-test \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--with-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-isolated-tests
path: ./tmp/results
if-no-files-found: ignore
# ─── Test Group 0 ─────────────────────────────────────────────────────────────
test-group-0:
name: "Test Group 0 (^[a-b]|^c[a-n]|^co[a-l]|^comm)"
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root --cpus 4 --memory 16g --security-opt seccomp=unconfined
needs: setup
timeout-minutes: 35
env:
TIMEOUT_SCALE_FACTOR: 14
TEST_GROUP: "^[a-b]|^c[a-n]|^co[a-l]|^comm"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
- name: Running self-test (Test Group 0)
timeout-minutes: 35
run: |
mkdir -p tmp/results/junit
ulimit -c unlimited
echo "Test group pattern: $TEST_GROUP"
./meteor self-test \
"$TEST_GROUP" \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--junit ./tmp/results/junit/0.xml \
--without-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-group-0
path: ./tmp/results
if-no-files-found: ignore
# ─── Test Group 1 ─────────────────────────────────────────────────────────────
test-group-1:
name: "Test Group 1 (^com[n-z])"
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root
needs: setup
timeout-minutes: 25
env:
TEST_GROUP: "^com[n-z]"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
- name: Running self-test (Test Group 1)
timeout-minutes: 25
run: |
mkdir -p tmp/results/junit
ulimit -c unlimited
echo "Test group pattern: $TEST_GROUP"
./meteor self-test \
"$TEST_GROUP" \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--junit ./tmp/results/junit/1.xml \
--without-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-group-1
path: ./tmp/results
if-no-files-found: ignore
# ─── Test Group 2 ─────────────────────────────────────────────────────────────
# Note: Gradle and Java are pre-installed in the meteor/circleci Docker image.
test-group-2:
name: "Test Group 2 (^co[n-z])"
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root
needs: setup
timeout-minutes: 25
env:
TEST_GROUP: "^co[n-z]"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Add Gradle to PATH
# Gradle is installed via sdkman in the meteor/circleci image but not on PATH by default.
# This mirrors what CircleCI does: export PATH="/home/circleci/.sdkman/candidates/gradle/8.7/bin:${PATH}"
run: echo "/home/circleci/.sdkman/candidates/gradle/8.7/bin" >> "$GITHUB_PATH"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
java --version
gradle --version
- name: Running self-test (Test Group 2)
timeout-minutes: 25
run: |
mkdir -p tmp/results/junit
ulimit -c unlimited
echo "Test group pattern: $TEST_GROUP"
./meteor self-test \
"$TEST_GROUP" \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--junit ./tmp/results/junit/2.xml \
--without-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-group-2
path: ./tmp/results
if-no-files-found: ignore
# ─── Test Group 3 ─────────────────────────────────────────────────────────────
test-group-3:
name: "Test Group 3 (^c[p-z]|^h[a-e])"
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root
needs: setup
timeout-minutes: 35
env:
TEST_GROUP: "^c[p-z]|^h[a-e]"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
- name: Running self-test (Test Group 3)
timeout-minutes: 35
run: |
mkdir -p tmp/results/junit
ulimit -c unlimited
echo "Test group pattern: $TEST_GROUP"
./meteor self-test \
"$TEST_GROUP" \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--junit ./tmp/results/junit/3.xml \
--without-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-group-3
path: ./tmp/results
if-no-files-found: ignore
# ─── Test Group 4 ─────────────────────────────────────────────────────────────
test-group-4:
name: "Test Group 4 (^h[f-z]|^[i-l])"
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root
needs: setup
timeout-minutes: 25
env:
TEST_GROUP: "^h[f-z]|^[i-l]"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
- name: Running self-test (Test Group 4)
timeout-minutes: 25
run: |
mkdir -p tmp/results/junit
ulimit -c unlimited
echo "Test group pattern: $TEST_GROUP"
./meteor self-test \
"$TEST_GROUP" \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--junit ./tmp/results/junit/4.xml \
--without-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-group-4
path: ./tmp/results
if-no-files-found: ignore
# ─── Test Group 5 ─────────────────────────────────────────────────────────────
test-group-5:
name: "Test Group 5 (^m[a-n]|^mo[a-d])"
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root --cpus 4 --memory 16g --security-opt seccomp=unconfined
needs: setup
timeout-minutes: 25
env:
TIMEOUT_SCALE_FACTOR: 14
TEST_GROUP: "^m[a-n]|^mo[a-d]"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
- name: Running self-test (Test Group 5)
timeout-minutes: 25
run: |
mkdir -p tmp/results/junit
ulimit -c unlimited
echo "Test group pattern: $TEST_GROUP"
./meteor self-test \
"$TEST_GROUP" \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--junit ./tmp/results/junit/5.xml \
--without-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-group-5
path: ./tmp/results
if-no-files-found: ignore
# ─── Test Group 6 ─────────────────────────────────────────────────────────────
test-group-6:
name: "Test Group 6 (^mo[e-z]|^m[p-z]|^[n-o])"
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root
needs: setup
timeout-minutes: 25
env:
TEST_GROUP: "^mo[e-z]|^m[p-z]|^[n-o]"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
- name: Running self-test (Test Group 6)
timeout-minutes: 25
run: |
mkdir -p tmp/results/junit
ulimit -c unlimited
echo "Test group pattern: $TEST_GROUP"
./meteor self-test \
"$TEST_GROUP" \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--junit ./tmp/results/junit/6.xml \
--without-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-group-6
path: ./tmp/results
if-no-files-found: ignore
# ─── Test Group 7 ─────────────────────────────────────────────────────────────
test-group-7:
name: "Test Group 7 (^[p-q]|^r[a-e])"
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root
needs: setup
timeout-minutes: 25
env:
TEST_GROUP: "^[p-q]|^r[a-e]"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
- name: Running self-test (Test Group 7)
timeout-minutes: 25
run: |
mkdir -p tmp/results/junit
ulimit -c unlimited
echo "Test group pattern: $TEST_GROUP"
./meteor self-test \
"$TEST_GROUP" \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--junit ./tmp/results/junit/7.xml \
--without-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-group-7
path: ./tmp/results
if-no-files-found: ignore
# ─── Test Group 8 ─────────────────────────────────────────────────────────────
test-group-8:
name: "Test Group 8 (^r[f-z])"
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root
needs: setup
timeout-minutes: 25
env:
TEST_GROUP: "^r[f-z]"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
- name: Running self-test (Test Group 8)
timeout-minutes: 25
run: |
mkdir -p tmp/results/junit
ulimit -c unlimited
echo "Test group pattern: $TEST_GROUP"
./meteor self-test \
"$TEST_GROUP" \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--junit ./tmp/results/junit/8.xml \
--without-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-group-8
path: ./tmp/results
if-no-files-found: ignore
# ─── Test Group 9 ─────────────────────────────────────────────────────────────
test-group-9:
name: "Test Group 9 (^s)"
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root
needs: setup
timeout-minutes: 25
env:
TEST_GROUP: "^s"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
- name: Running self-test (Test Group 9)
timeout-minutes: 25
run: |
mkdir -p tmp/results/junit
ulimit -c unlimited
echo "Test group pattern: $TEST_GROUP"
./meteor self-test \
"$TEST_GROUP" \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--junit ./tmp/results/junit/9.xml \
--without-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-group-9
path: ./tmp/results
if-no-files-found: ignore
# ─── Test Group 10 ────────────────────────────────────────────────────────────
test-group-10:
name: "Test Group 10 (^[t-z])"
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root
needs: setup
timeout-minutes: 25
env:
TEST_GROUP: "^[t-z]"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
- name: Running self-test (Test Group 10)
timeout-minutes: 25
run: |
mkdir -p tmp/results/junit
ulimit -c unlimited
echo "Test group pattern: $TEST_GROUP"
./meteor self-test \
"$TEST_GROUP" \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--junit ./tmp/results/junit/10.xml \
--without-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-group-10
path: ./tmp/results
if-no-files-found: ignore
# ─── Test Group 11 ────────────────────────────────────────────────────────────
test-group-11:
name: "Test Group 11 (^[d-g])"
runs-on: oss-vm
container:
image: meteor/circleci:2025.07.8-android-35-node-22
options: --user root
needs: setup
timeout-minutes: 40
env:
TEST_GROUP: "^[d-g]"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Expose globally-installed puppeteer to Node.js
run: echo "NODE_PATH=$(npm root -g)" >> "$GITHUB_ENV"
- name: Restore caches
uses: actions/cache/restore@v4
with:
path: |
~/.npm
.meteor
.babel-cache
dev_bundle
packages/**/.npm
key: ${{ runner.os }}-meteor-tools-${{ hashFiles('meteor', '**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-meteor-tools-
${{ runner.os }}-meteor-
- name: Log environment
run: |
lsb_release -a
uname -srm
echo "Node: $(node --version)"
echo "NPM: $(npm --version)"
echo "Meteor Node: $(./meteor node --version)"
echo "Meteor NPM: $(./meteor npm --version)"
- name: Running self-test (Test Group 11)
timeout-minutes: 40
run: |
mkdir -p tmp/results/junit
ulimit -c unlimited
echo "Test group pattern: $TEST_GROUP"
./meteor self-test \
"$TEST_GROUP" \
--retries "$METEOR_SELF_TEST_RETRIES" \
--exclude "$SELF_TEST_EXCLUDE" \
--headless \
--junit ./tmp/results/junit/11.xml \
--without-tag "custom-warehouse"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-group-11
path: ./tmp/results
if-no-files-found: ignore

View File

@@ -15,7 +15,6 @@ npm-packages/
v3-docs/
node_modules/
.meteor/
.circleci/
.github/
.coderabbit.yaml

View File

@@ -61,7 +61,7 @@ can run Meteor directly from a Git checkout using these steps:
> _Tip 2:_ When working with meteor tool, it may be helpful to use the debugger to check what's happening. You can do this using the following flag:
>
> TOOL_NODE_FLAGS="--inspect-brk" mymeteor
>
>
> Then you can use the chrome debugger inside `chrome://inspect`.
### Testing a fork branch
@@ -247,7 +247,7 @@ PUPPETEER_DOWNLOAD_PATH=~/.npm/chromium ./packages/test-in-console/run.sh
### Continuous integration
Any time a pull-request is submitted or a commit is pushed directly to the `devel` branch, continuous integration tests will be started automatically by the CI server. These are run by [Circle CI](https://circleci.com/) and defined in the [`circle.yml` file](./circle.yml). Even more specifically, the tests to run and the containers to run them under are defined in the [`/scripts/ci.sh`](scripts/ci.sh) script, which is a script which can run locally to replicate the exact tests.
Any time a pull-request is submitted or a commit is pushed directly to the `devel` branch, continuous integration tests will be started automatically by the CI server. The tests to run and the containers to run them under are defined in the [`/scripts/ci.sh`](scripts/ci.sh) script, which is a script which can run locally to replicate the exact tests.
Not every test which is defined in a test spec is actually ran by the CI server. Some tests are simply too long-running and some tests are just no longer relevant. As one particular example, there is a suite of very slow tests grouped into a `slow` designator within the test framework. These can be executed by adding the `--slow` option to the `self-test` command.
@@ -255,20 +255,6 @@ Not every test which is defined in a test spec is actually ran by the CI server.
>
> There is not currently a continuous integration system setup for Windows. Additionally, not all tests are known to work on Windows. If you're able to take time to improve those tests, it would be greatly appreciated. Currently, there isn't an official list of known tests which do not run on Windows, but a PR to note those here and get them fixed would be ideal!
#### Running your own CircleCI
Since Meteor is a free, open-source project, you can run tests in the context of your own CircleCI account at no cost (up to the maximum number of containers allowed by them) during development and prior to submitting a pull-request. For some, this may be quicker or more convenient than running tests on their own workstation. As an added advantage, when your tests are "green", that status will be immediately shown (as passing) when a pull-request is opened with the official Meteor repository.
To enable CircleCI for your development:
0. Make sure you have an account with [CircleCI](https://circleci.com)
0. Make sure you have [forked](https://help.github.com/articles/fork-a-repo/) [Meteor](https://github.com/meteor/meteor) into your own GitHub account.
0. Go to the [Add Projects](https://circleci.com/add-projects) page on CircleCI.
0. On the left, click on your GitHub username.
0. On the right, find `meteor`
0. Click on the "Build project" button next to `meteor`.
0. Your build will start automatically!
## Code style
* New contributions should follow the [Meteor Style Guide](https://github.com/meteor/javascript/) as closely as possible.

View File

@@ -10,8 +10,6 @@
<div align="center">
[![Travis CI Status](https://api.travis-ci.com/meteor/meteor.svg?branch=devel)](https://app.travis-ci.com/github/meteor/meteor)
[![CircleCI Status](https://circleci.com/gh/meteor/meteor.svg?style=svg)](https://app.circleci.com/pipelines/github/meteor/meteor?branch=devel)
[![built with Meteor](https://img.shields.io/badge/Meteor-3.4.0-green?logo=meteor&logoColor=white)](https://meteor.com)
![node-current](https://img.shields.io/node/v/meteor)
![Discord](https://img.shields.io/discord/1247973371040239676)
@@ -67,7 +65,7 @@ On your platform, use this line:
```shell
> npx meteor
```
🚀 To create a project:
```shell

View File

@@ -18,7 +18,6 @@ async function runNextUrl(browser) {
// });
page.on("console", async (msg) => {
// this is a way to make sure the travis does not timeout
// if the test is running for too long without any output to the console (10 minutes)
const text = msg.text();
if (text.includes("Permissions policy violation")) {

View File

@@ -846,18 +846,11 @@ makeGlobalAsyncLocalStorage().run({}, async function () {
"However, if you are running this command in a build process (CI, etc.), or you are absolutely sure you know what you are doing,",
"set the METEOR_ALLOW_SUPERUSER environment variable or pass --allow-superuser to proceed."
);
}
Console.info("");
Console.info(
"Even with METEOR_ALLOW_SUPERUSER or --allow-superuser, permissions in your app directory will be incorrect if you ever attempt to perform any Meteor tasks as a normal user.",
"If you need to fix your permissions, run the following command from the root of your project:"
);
Console.info("");
Console.info(Console.command(" sudo chown -Rh <username> .meteor/local"));
Console.info("");
Console.info("");
Console.info(Console.command(" sudo chown -Rh <username> .meteor/local"));
Console.info("");
if (! allowSuperuser) {
process.exit(1);
}
}

View File

@@ -37,7 +37,6 @@ export default class PuppeteerClient extends Client {
async connect() {
this._checkInitialized();
// Note for Travis and CircleCI to run sandbox must be turned off.
// From a security perspective this is not ideal, in the future would be worthwhile
// to configure to include only for CI based setups
this.browser = await this.npmPackageExports.launch({