version: 2.1 orbs: node: circleci/node@5.2.0 browser-tools: circleci/browser-tools@1.3.0 executors: pw-focal-development: docker: - image: mcr.microsoft.com/playwright:v1.48.1-focal environment: NODE_ENV: development # Needed to ensure 'dist' folder created and devDependencies installed PERCY_POSTINSTALL_BROWSER: 'true' # Needed to store the percy browser in cache deps PERCY_LOGLEVEL: 'debug' # Enable DEBUG level logging for Percy (Issue: https://github.com/nasa/openmct/issues/5742) PERCY_PARALLEL_TOTAL: 2 ubuntu: machine: image: ubuntu-2204:current docker_layer_caching: true commands: build_and_install: description: 'All steps used to build and install.' parameters: node-version: type: string steps: - checkout - node/install: node-version: << parameters.node-version >> - node/install-packages generate_and_store_version_and_filesystem_artifacts: description: 'Track important packages and files' steps: - run: | [[ $EUID -ne 0 ]] && (sudo mkdir -p /tmp/artifacts && sudo chmod 777 /tmp/artifacts) || (mkdir -p /tmp/artifacts && chmod 777 /tmp/artifacts) printenv NODE_ENV >> /tmp/artifacts/NODE_ENV.txt || true npm -v >> /tmp/artifacts/npm-version.txt node -v >> /tmp/artifacts/node-version.txt ls -latR >> /tmp/artifacts/dir.txt - store_artifacts: path: /tmp/artifacts/ download_verify_codecov_cli: description: 'Download and verify Codecov CLI' steps: - run: name: Download and verify Codecov CLI command: | # Download Codecov CLI curl -Os https://cli.codecov.io/latest/linux/codecov # Import Codecov's GPG key curl https://keybase.io/codecovsecurity/pgp_keys.asc | gpg --no-default-keyring --keyring trustedkeys.gpg --import # Download and verify the SHA256SUM and its signature curl -Os https://cli.codecov.io/latest/linux/codecov.SHA256SUM curl -Os https://cli.codecov.io/latest/linux/codecov.SHA256SUM.sig gpgv codecov.SHA256SUM.sig codecov.SHA256SUM # Verify the checksum shasum -a 256 -c codecov.SHA256SUM # Make the codecov executable [[ $EUID -ne 0 ]] && sudo chmod +x codecov || chmod +x codecov ./codecov --help generate_e2e_code_cov_report: description: 'Generate e2e code coverage artifacts and publish to codecov.io. Needed to that we can ignore the exit code status of the npm run test' parameters: suite: type: string steps: - run: npm run cov:e2e:report || true - download_verify_codecov_cli - run: name: Upload coverage report to Codecov command: | ./codecov --verbose upload-process --disable-search \ -t $CODECOV_TOKEN \ -n 'e2e-<>'-${CIRCLE_WORKFLOW_ID} \ -F e2e-<> \ -f ./coverage/e2e/lcov.info jobs: npm-audit: parameters: node-version: type: string executor: pw-focal-development steps: - build_and_install: node-version: <> - run: npm audit --audit-level=low - generate_and_store_version_and_filesystem_artifacts lint: parameters: node-version: type: string executor: pw-focal-development steps: - build_and_install: node-version: <> - run: npm run lint - generate_and_store_version_and_filesystem_artifacts unit-test: parameters: node-version: type: string executor: pw-focal-development steps: - build_and_install: node-version: <> - browser-tools/install-chrome: replace-existing: false - run: command: | mkdir -p dist/reports/tests/ TESTFILES=$(circleci tests glob "src/**/*Spec.js") echo "$TESTFILES" | circleci tests run --command="xargs npm run test" --verbose - download_verify_codecov_cli - run: name: Upload coverage report to Codecov command: | ./codecov --verbose upload-process --disable-search \ -t $CODECOV_TOKEN \ -n 'unit-test'-${CIRCLE_WORKFLOW_ID} \ -F unit \ -f ./coverage/unit/lcov.info - store_test_results: path: dist/reports/tests/ - store_artifacts: path: coverage - when: condition: equal: [42, 42] # Always generate version artifacts regardless of test failure https://discuss.circleci.com/t/make-custom-command-run-always-with-when-always/38957/2 steps: - generate_and_store_version_and_filesystem_artifacts e2e-test: parameters: suite: #ci or full type: string executor: pw-focal-development parallelism: 8 steps: - build_and_install: node-version: lts/hydrogen - when: #Only install chrome-beta when running the 'full' suite to save $$$ condition: equal: ['full', <>] steps: - run: npx playwright install chrome-beta - run: command: | mkdir test-results TESTFILES=$(circleci tests glob "e2e/**/*.spec.js") echo "$TESTFILES" | circleci tests run --command="xargs npm run test:e2e:<>" --verbose --split-by=timings - when: condition: equal: [42, 42] # Always run codecov reports regardless of test failure https://discuss.circleci.com/t/make-custom-command-run-always-with-when-always/38957/2 steps: - generate_e2e_code_cov_report: suite: <> - store_test_results: path: test-results/results.xml - store_artifacts: path: test-results - store_artifacts: path: coverage - store_artifacts: path: html-test-results - when: condition: equal: [42, 42] # Always generate version artifacts regardless of test failure https://discuss.circleci.com/t/make-custom-command-run-always-with-when-always/38957/2 steps: - generate_and_store_version_and_filesystem_artifacts e2e-mobile: executor: pw-focal-development steps: - build_and_install: node-version: lts/hydrogen - run: npm run test:e2e:mobile - when: condition: equal: [42, 42] # Always run codecov reports regardless of test failure https://discuss.circleci.com/t/make-custom-command-run-always-with-when-always/38957/2 steps: - generate_e2e_code_cov_report: suite: full - store_test_results: path: test-results/results.xml - store_artifacts: path: test-results - store_artifacts: path: coverage - store_artifacts: path: html-test-results - when: condition: equal: [42, 42] # Always generate version artifacts regardless of test failure https://discuss.circleci.com/t/make-custom-command-run-always-with-when-always/38957/2 steps: - generate_and_store_version_and_filesystem_artifacts e2e-couchdb: executor: ubuntu steps: - build_and_install: node-version: lts/hydrogen - run: npx playwright@1.48.1 install #Necessary for bare ubuntu machine - run: | export $(cat src/plugins/persistence/couch/.env.ci | xargs) docker compose -f src/plugins/persistence/couch/couchdb-compose.yaml up --detach sleep 3 bash src/plugins/persistence/couch/setup-couchdb.sh - run: sh src/plugins/persistence/couch/replace-localstorage-with-couchdb-indexhtml.sh #Replace LocalStorage Plugin with CouchDB - run: npm run test:e2e:couchdb - when: condition: equal: [42, 42] # Always run codecov reports regardless of test failure https://discuss.circleci.com/t/make-custom-command-run-always-with-when-always/38957/2 steps: - generate_e2e_code_cov_report: suite: full #add to full suite - store_test_results: path: test-results/results.xml - store_artifacts: path: test-results - store_artifacts: path: coverage - store_artifacts: path: html-test-results - when: condition: equal: [42, 42] # Always generate version artifacts regardless of test failure https://discuss.circleci.com/t/make-custom-command-run-always-with-when-always/38957/2 steps: - generate_and_store_version_and_filesystem_artifacts mem-test: executor: pw-focal-development steps: - build_and_install: node-version: lts/hydrogen - run: npm run test:perf:memory - store_test_results: path: test-results/results.xml - store_artifacts: path: test-results - store_artifacts: path: html-test-results - when: condition: equal: [42, 42] # Always run codecov reports regardless of test failure https://discuss.circleci.com/t/make-custom-command-run-always-with-when-always/38957/2 steps: - generate_and_store_version_and_filesystem_artifacts perf-test: executor: pw-focal-development steps: - build_and_install: node-version: lts/hydrogen - run: npm run test:perf:localhost - run: npm run test:perf:contract - store_test_results: path: test-results/results.xml - store_artifacts: path: test-results - store_artifacts: path: html-test-results - when: condition: equal: [42, 42] # Always run codecov reports regardless of test failure https://discuss.circleci.com/t/make-custom-command-run-always-with-when-always/38957/2 steps: - generate_and_store_version_and_filesystem_artifacts visual-a11y: parameters: suite: type: string # ci or full executor: pw-focal-development parallelism: 2 steps: - build_and_install: node-version: lts/iron - run: SHARD="$((${CIRCLE_NODE_INDEX}+1))"; npm run test:e2e:visual:<> -- --shard=${SHARD}/${CIRCLE_NODE_TOTAL} - store_test_results: path: test-results/results.xml - store_artifacts: path: test-results - store_artifacts: path: html-test-results - when: condition: equal: [42, 42] # Always generate version artifacts regardless of test failure https://discuss.circleci.com/t/make-custom-command-run-always-with-when-always/38957/2 steps: - generate_and_store_version_and_filesystem_artifacts workflows: overall-circleci-commit-status: #These jobs run on every commit jobs: - lint: name: node22-lint node-version: '22' - unit-test: name: node18-chrome node-version: lts/hydrogen - e2e-test: name: e2e-ci suite: ci - e2e-mobile - visual-a11y: name: visual-a11y-ci suite: ci - perf-test - mem-test the-nightly: #These jobs do not run on PRs, but against master at night jobs: - unit-test: name: node22-chrome-nightly node-version: '22' - unit-test: name: node18-chrome node-version: lts/hydrogen - npm-audit: node-version: lts/hydrogen - e2e-test: name: e2e-full-nightly suite: full - e2e-mobile - perf-test - mem-test - visual-a11y: name: visual-a11y-nightly suite: full - e2e-couchdb triggers: - schedule: cron: '0 0 * * *' filters: branches: only: - master