From f5b5cdacf81dba1628d5c725fcdb56749af205ea Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Wed, 8 Apr 2026 22:01:44 -0300 Subject: [PATCH 01/12] CI: move circleci to GitHub actions --- .github/workflows/test-tools.yml | 888 +++++++++++++++++++++++++++++++ 1 file changed, 888 insertions(+) create mode 100644 .github/workflows/test-tools.yml diff --git a/.github/workflows/test-tools.yml b/.github/workflows/test-tools.yml new file mode 100644 index 0000000000..0ee28a93e6 --- /dev/null +++ b/.github/workflows/test-tools.yml @@ -0,0 +1,888 @@ +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 + +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 + 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: | + ulimit -c unlimited + cd dev_bundle/lib + ../../meteor npm install @types/node@22.7.4 --save-dev + ../../meteor npm install -g typescript + cd ../../ + ./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 + 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 + needs: setup + timeout-minutes: 35 + env: + 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: | + 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 + 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: | + 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: CircleCI sets up Gradle via sdkman for this group. If oss-vm does not + # have Gradle pre-installed, add a `gradle/actions/setup-gradle@v3` step here. + test-group-2: + name: "Test Group 2 (^co[n-z])" + runs-on: oss-vm + 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: 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: Set up Java + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "17" + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v3 + + - 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: | + 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 + 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: | + 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 + 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: | + 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 + needs: setup + timeout-minutes: 25 + env: + 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: | + 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 + 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: | + 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 + 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: | + 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 + 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: | + 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 + 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: | + 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 + 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: | + 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 + 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: | + 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 From 9b54f684e6aa70474334113eb3bb061b1cf652a5 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Wed, 8 Apr 2026 22:03:24 -0300 Subject: [PATCH 02/12] DEV: testing something --- .github/workflows/test-tools.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/test-tools.yml b/.github/workflows/test-tools.yml index 0ee28a93e6..cf42446c8a 100644 --- a/.github/workflows/test-tools.yml +++ b/.github/workflows/test-tools.yml @@ -67,13 +67,7 @@ jobs: - name: Prepare Meteor if: steps.meteor-cache.outputs.cache-hit != 'true' timeout-minutes: 65 - run: | - ulimit -c unlimited - cd dev_bundle/lib - ../../meteor npm install @types/node@22.7.4 --save-dev - ../../meteor npm install -g typescript - cd ../../ - ./meteor --get-ready + run: ./meteor --get-ready # ─── Isolated Tests ─────────────────────────────────────────────────────────── # Tests that must run in isolation: the debugOnly/prodOnly package test From d880f354858a007f04dc6accca13e7fca669e760 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Wed, 8 Apr 2026 22:35:11 -0300 Subject: [PATCH 03/12] DEV: testing w/docker --- .github/workflows/test-tools.yml | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test-tools.yml b/.github/workflows/test-tools.yml index cf42446c8a..a3cda4851b 100644 --- a/.github/workflows/test-tools.yml +++ b/.github/workflows/test-tools.yml @@ -36,6 +36,7 @@ jobs: setup: name: Setup runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 timeout-minutes: 75 steps: - name: Checkout repository @@ -75,6 +76,7 @@ jobs: isolated-tests: name: Isolated Tests runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 45 steps: @@ -140,6 +142,7 @@ jobs: test-group-0: name: "Test Group 0 (^[a-b]|^c[a-n]|^co[a-l]|^comm)" runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 35 env: @@ -201,6 +204,7 @@ jobs: test-group-1: name: "Test Group 1 (^com[n-z])" runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 25 env: @@ -259,11 +263,11 @@ jobs: if-no-files-found: ignore # ─── Test Group 2 ───────────────────────────────────────────────────────────── - # Note: CircleCI sets up Gradle via sdkman for this group. If oss-vm does not - # have Gradle pre-installed, add a `gradle/actions/setup-gradle@v3` step here. + # 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: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 25 env: @@ -291,15 +295,6 @@ jobs: ${{ runner.os }}-meteor-tools- ${{ runner.os }}-meteor- - - name: Set up Java - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: "17" - - - name: Set up Gradle - uses: gradle/actions/setup-gradle@v3 - - name: Log environment run: | lsb_release -a @@ -336,6 +331,7 @@ jobs: test-group-3: name: "Test Group 3 (^c[p-z]|^h[a-e])" runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 35 env: @@ -397,6 +393,7 @@ jobs: test-group-4: name: "Test Group 4 (^h[f-z]|^[i-l])" runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 25 env: @@ -458,6 +455,7 @@ jobs: test-group-5: name: "Test Group 5 (^m[a-n]|^mo[a-d])" runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 25 env: @@ -519,6 +517,7 @@ jobs: test-group-6: name: "Test Group 6 (^mo[e-z]|^m[p-z]|^[n-o])" runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 25 env: @@ -580,6 +579,7 @@ jobs: test-group-7: name: "Test Group 7 (^[p-q]|^r[a-e])" runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 25 env: @@ -641,6 +641,7 @@ jobs: test-group-8: name: "Test Group 8 (^r[f-z])" runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 25 env: @@ -702,6 +703,7 @@ jobs: test-group-9: name: "Test Group 9 (^s)" runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 25 env: @@ -763,6 +765,7 @@ jobs: test-group-10: name: "Test Group 10 (^[t-z])" runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 25 env: @@ -824,6 +827,7 @@ jobs: test-group-11: name: "Test Group 11 (^[d-g])" runs-on: oss-vm + container: meteor/circleci:2025.07.8-android-35-node-22 needs: setup timeout-minutes: 40 env: From bdb3c03443597099b9cf367382ec964326f53071 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Wed, 8 Apr 2026 22:40:01 -0300 Subject: [PATCH 04/12] DEV: testing w/docker 2 --- .github/workflows/test-tools.yml | 52 ++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test-tools.yml b/.github/workflows/test-tools.yml index a3cda4851b..131ab7ba74 100644 --- a/.github/workflows/test-tools.yml +++ b/.github/workflows/test-tools.yml @@ -36,7 +36,9 @@ jobs: setup: name: Setup runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root timeout-minutes: 75 steps: - name: Checkout repository @@ -76,7 +78,9 @@ jobs: isolated-tests: name: Isolated Tests runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 45 steps: @@ -142,7 +146,9 @@ jobs: test-group-0: name: "Test Group 0 (^[a-b]|^c[a-n]|^co[a-l]|^comm)" runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 35 env: @@ -267,7 +273,9 @@ jobs: test-group-2: name: "Test Group 2 (^co[n-z])" runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 25 env: @@ -331,7 +339,9 @@ jobs: test-group-3: name: "Test Group 3 (^c[p-z]|^h[a-e])" runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 35 env: @@ -393,7 +403,9 @@ jobs: test-group-4: name: "Test Group 4 (^h[f-z]|^[i-l])" runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 25 env: @@ -455,7 +467,9 @@ jobs: test-group-5: name: "Test Group 5 (^m[a-n]|^mo[a-d])" runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 25 env: @@ -517,7 +531,9 @@ jobs: test-group-6: name: "Test Group 6 (^mo[e-z]|^m[p-z]|^[n-o])" runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 25 env: @@ -579,7 +595,9 @@ jobs: test-group-7: name: "Test Group 7 (^[p-q]|^r[a-e])" runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 25 env: @@ -641,7 +659,9 @@ jobs: test-group-8: name: "Test Group 8 (^r[f-z])" runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 25 env: @@ -703,7 +723,9 @@ jobs: test-group-9: name: "Test Group 9 (^s)" runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 25 env: @@ -765,7 +787,9 @@ jobs: test-group-10: name: "Test Group 10 (^[t-z])" runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 25 env: @@ -827,7 +851,9 @@ jobs: test-group-11: name: "Test Group 11 (^[d-g])" runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 40 env: From ae1d9bd299451742d71c1ad77521619054705466 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Wed, 8 Apr 2026 22:43:55 -0300 Subject: [PATCH 05/12] DEV: testing w/docker 3 --- .github/workflows/test-tools.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-tools.yml b/.github/workflows/test-tools.yml index 131ab7ba74..171cb7713e 100644 --- a/.github/workflows/test-tools.yml +++ b/.github/workflows/test-tools.yml @@ -28,6 +28,7 @@ env: SELF_TEST_TOOL_NODE_FLAGS: " " METEOR_MODERN: true CXX: g++-12 + METEOR_ALLOW_SUPERUSER: 1 jobs: # ─── Setup ──────────────────────────────────────────────────────────────────── From dd3695a1a65feff48e14f919170363a1e1756218 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Wed, 8 Apr 2026 23:11:06 -0300 Subject: [PATCH 06/12] DEV: testing w/docker 4 --- .github/workflows/test-tools.yml | 16 +++++++++++++++- tools/cli/main.js | 13 +++---------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test-tools.yml b/.github/workflows/test-tools.yml index 171cb7713e..ec0d0bcd26 100644 --- a/.github/workflows/test-tools.yml +++ b/.github/workflows/test-tools.yml @@ -189,6 +189,7 @@ jobs: - 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 \ @@ -211,7 +212,9 @@ jobs: test-group-1: name: "Test Group 1 (^com[n-z])" runs-on: oss-vm - container: meteor/circleci:2025.07.8-android-35-node-22 + container: + image: meteor/circleci:2025.07.8-android-35-node-22 + options: --user root needs: setup timeout-minutes: 25 env: @@ -251,6 +254,7 @@ jobs: - 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 \ @@ -318,6 +322,7 @@ jobs: - 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 \ @@ -382,6 +387,7 @@ jobs: - 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 \ @@ -446,6 +452,7 @@ jobs: - 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 \ @@ -510,6 +517,7 @@ jobs: - 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 \ @@ -574,6 +582,7 @@ jobs: - 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 \ @@ -638,6 +647,7 @@ jobs: - 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 \ @@ -702,6 +712,7 @@ jobs: - 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 \ @@ -766,6 +777,7 @@ jobs: - 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 \ @@ -830,6 +842,7 @@ jobs: - 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 \ @@ -894,6 +907,7 @@ jobs: - 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 \ diff --git a/tools/cli/main.js b/tools/cli/main.js index d72744a72f..b37b2f0b4c 100644 --- a/tools/cli/main.js +++ b/tools/cli/main.js @@ -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 .meteor/local")); - Console.info(""); + Console.info(""); + Console.info(Console.command(" sudo chown -Rh .meteor/local")); + Console.info(""); - if (! allowSuperuser) { process.exit(1); } } From c554fd354f7fdbc33b200f298079ba350a0126bf Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Wed, 8 Apr 2026 23:19:40 -0300 Subject: [PATCH 07/12] DEV: testing w/docker 5 --- .github/workflows/test-tools.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/test-tools.yml b/.github/workflows/test-tools.yml index ec0d0bcd26..32d3014ed3 100644 --- a/.github/workflows/test-tools.yml +++ b/.github/workflows/test-tools.yml @@ -294,6 +294,11 @@ jobs: - 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: From b54df7c75326f6d2156603722a37118e2bea3e1e Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Mon, 20 Apr 2026 09:00:23 -0300 Subject: [PATCH 08/12] CI: removing circle CI As mentioned in both https://github.com/meteor/meteor/pull/14300 and https://github.com/meteor/meteor/pull/14326, we are removing circle and travis tests from core and making it all to be vm based --- .circleci/config.yml | 920 ------------------ .fmtignore | 2 - .oxlintignore | 1 - .travis.yml | 34 - DEVELOPMENT.md | 18 +- README.md | 4 +- packages/test-in-console/puppeteer_runner.js | 1 - packages/webapp/socket_file_tests.js | 4 - tools/tool-testing/clients/puppeteer/index.js | 1 - 9 files changed, 3 insertions(+), 982 deletions(-) delete mode 100644 .circleci/config.yml delete mode 100644 .travis.yml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 6736ff3860..0000000000 --- a/.circleci/config.yml +++ /dev/null @@ -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 diff --git a/.fmtignore b/.fmtignore index fe089bcddd..94ff445bab 100644 --- a/.fmtignore +++ b/.fmtignore @@ -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 diff --git a/.oxlintignore b/.oxlintignore index 31fd4c2bcb..f2e08735ea 100644 --- a/.oxlintignore +++ b/.oxlintignore @@ -15,7 +15,6 @@ npm-packages/ v3-docs/ node_modules/ .meteor/ -.circleci/ .github/ .coderabbit.yaml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 3e63726f4c..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,34 +0,0 @@ -language: node_js -os: linux -dist: jammy -sudo: required -services: xvfb -node_js: - - "22.17.0" -cache: - directories: - - ".meteor" - - ".babel-cache" -script: - - travis_retry ./packages/test-in-console/run.sh -env: - global: - - CXX=g++-12 - - phantom=false - - PUPPETEER_DOWNLOAD_PATH=~/.npm/chromium - - TEST_PACKAGES_EXCLUDE=stylus - - METEOR_MODERN=true -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-12 - - libnss3 - -before_install: - - cat /etc/apt/sources.list - - python3 --version - - echo "deb http://archive.ubuntu.com/ubuntu jammy main universe" | sudo tee -a /etc/apt/sources.list - - sudo apt-get update - - sudo apt-get install -y libnss3 diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index bf5c84193f..528979edfb 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -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. diff --git a/README.md b/README.md index d46cffc3ab..15c0136aca 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,6 @@
-[![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 diff --git a/packages/test-in-console/puppeteer_runner.js b/packages/test-in-console/puppeteer_runner.js index 546723de22..e74984cc55 100644 --- a/packages/test-in-console/puppeteer_runner.js +++ b/packages/test-in-console/puppeteer_runner.js @@ -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")) { diff --git a/packages/webapp/socket_file_tests.js b/packages/webapp/socket_file_tests.js index 0bc93627bc..7fceae1481 100644 --- a/packages/webapp/socket_file_tests.js +++ b/packages/webapp/socket_file_tests.js @@ -45,10 +45,6 @@ const getGroupToUse = () => { return 'staff'; } - if (process.env.TRAVIS) { - return 'travis'; - } - return getCurrentGroupName() || 'root'; }; diff --git a/tools/tool-testing/clients/puppeteer/index.js b/tools/tool-testing/clients/puppeteer/index.js index ebe134fa75..5fd31d4bf0 100644 --- a/tools/tool-testing/clients/puppeteer/index.js +++ b/tools/tool-testing/clients/puppeteer/index.js @@ -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({ From 8242189321d1e5eff958705223058798050e8312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Mon, 20 Apr 2026 16:28:15 +0200 Subject: [PATCH 09/12] increase TIMEOUT_SCALE_FACTOR to 14 for self-tests optimization --- .github/workflows/test-tools.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-tools.yml b/.github/workflows/test-tools.yml index 32d3014ed3..91bf20f5ee 100644 --- a/.github/workflows/test-tools.yml +++ b/.github/workflows/test-tools.yml @@ -15,7 +15,7 @@ concurrency: env: # Multiplies the waitSecs for self-tests. - TIMEOUT_SCALE_FACTOR: 8 + TIMEOUT_SCALE_FACTOR: 14 # Retry failed tests additional times. METEOR_SELF_TEST_RETRIES: 2 METEOR_HEADLESS: true From c6dd463f9b3b397ddbafd01f1c1e1839fb784fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Mon, 20 Apr 2026 17:00:29 +0200 Subject: [PATCH 10/12] update test-tools workflow: allocate 4 CPUs, 16GB memory, and disable seccomp for container --- .github/workflows/test-tools.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-tools.yml b/.github/workflows/test-tools.yml index 91bf20f5ee..6957a0eb15 100644 --- a/.github/workflows/test-tools.yml +++ b/.github/workflows/test-tools.yml @@ -81,7 +81,7 @@ jobs: runs-on: oss-vm container: image: meteor/circleci:2025.07.8-android-35-node-22 - options: --user root + options: --user root --cpus 4 --memory 16g --security-opt seccomp=unconfined needs: setup timeout-minutes: 45 steps: From 0a33bdf2712a4c775caa5fc471a4aaf9e0c12f05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Mon, 20 Apr 2026 17:30:05 +0200 Subject: [PATCH 11/12] swap CPU/memory/seccomp options within test-tools workflow configuration --- .github/workflows/test-tools.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-tools.yml b/.github/workflows/test-tools.yml index 6957a0eb15..35bb712a7b 100644 --- a/.github/workflows/test-tools.yml +++ b/.github/workflows/test-tools.yml @@ -81,7 +81,7 @@ jobs: 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 + options: --user root needs: setup timeout-minutes: 45 steps: @@ -149,7 +149,7 @@ jobs: runs-on: oss-vm container: image: meteor/circleci:2025.07.8-android-35-node-22 - options: --user root + options: --user root --cpus 4 --memory 16g --security-opt seccomp=unconfined needs: setup timeout-minutes: 35 env: @@ -482,7 +482,7 @@ jobs: runs-on: oss-vm container: image: meteor/circleci:2025.07.8-android-35-node-22 - options: --user root + options: --user root --cpus 4 --memory 16g --security-opt seccomp=unconfined needs: setup timeout-minutes: 25 env: From d1e46e07d544a7909020ad9a33c99d9b73b8f3de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Mon, 20 Apr 2026 18:07:35 +0200 Subject: [PATCH 12/12] adjust TIMEOUT_SCALE_FACTOR values in test-tools workflow configuration --- .github/workflows/test-tools.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-tools.yml b/.github/workflows/test-tools.yml index 35bb712a7b..ceab4b1ef5 100644 --- a/.github/workflows/test-tools.yml +++ b/.github/workflows/test-tools.yml @@ -15,7 +15,7 @@ concurrency: env: # Multiplies the waitSecs for self-tests. - TIMEOUT_SCALE_FACTOR: 14 + TIMEOUT_SCALE_FACTOR: 8 # Retry failed tests additional times. METEOR_SELF_TEST_RETRIES: 2 METEOR_HEADLESS: true @@ -153,6 +153,7 @@ jobs: 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 @@ -486,6 +487,7 @@ jobs: needs: setup timeout-minutes: 25 env: + TIMEOUT_SCALE_FACTOR: 14 TEST_GROUP: "^m[a-n]|^mo[a-d]" steps: - name: Checkout repository