version: 2.1 executors: pw-focal-development: docker: - image: mcr.microsoft.com/playwright:v1.25.2-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) parameters: BUST_CACHE: description: "Set this with the CircleCI UI Trigger Workflow button (boolean = true) to bust the cache!" default: false type: boolean commands: build_and_install: description: "All steps used to build and install. Will use cache if found" parameters: node-version: type: string steps: - checkout - restore_cache_cmd: node-version: << parameters.node-version >> - node/install: install-npm: true node-version: << parameters.node-version >> - run: npm install --prefer-offline --no-audit --progress=false restore_cache_cmd: description: "Custom command for restoring cache with the ability to bust cache. When BUST_CACHE is set to true, jobs will not restore cache" parameters: node-version: type: string steps: - when: condition: equal: [false, << pipeline.parameters.BUST_CACHE >> ] steps: - restore_cache: key: deps-{{ .Branch }}--<< parameters.node-version >>--{{ checksum "package.json" }}-{{ checksum ".circleci/config.yml" }} save_cache_cmd: description: "Custom command for saving cache." parameters: node-version: type: string steps: - save_cache: key: deps-{{ .Branch }}--<< parameters.node-version >>--{{ checksum "package.json" }}-{{ checksum ".circleci/config.yml" }} paths: - ~/.npm - node_modules generate_and_store_version_and_filesystem_artifacts: description: "Track important packages and files" steps: - run: | mkdir /tmp/artifacts printenv NODE_ENV >> /tmp/artifacts/NODE_ENV.txt 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/ 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 - run: npm run cov:e2e:<>:publish orbs: node: circleci/node@4.9.0 browser-tools: circleci/browser-tools@1.3.0 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: npm run test - run: npm run cov:unit:publish - save_cache_cmd: node-version: <> - store_test_results: path: dist/reports/tests/ - store_artifacts: path: coverage - generate_and_store_version_and_filesystem_artifacts e2e-test: parameters: node-version: type: string suite: #stable or full type: string executor: pw-focal-development parallelism: 4 steps: - build_and_install: node-version: <> - when: #Only install chrome-beta when running the 'full' suite to save $$$ condition: equal: [ "full", <> ] steps: - run: npx playwright install chrome-beta - run: SHARD="$((${CIRCLE_NODE_INDEX}+1))"; npm run test:e2e:<> -- --shard=${SHARD}/${CIRCLE_NODE_TOTAL} - 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 - generate_and_store_version_and_filesystem_artifacts perf-test: parameters: node-version: type: string executor: pw-focal-development steps: - build_and_install: node-version: <> - run: npm run test:perf - store_test_results: path: test-results/results.xml - store_artifacts: path: test-results - store_artifacts: path: html-test-results - generate_and_store_version_and_filesystem_artifacts visual-test: parameters: node-version: type: string executor: pw-focal-development steps: - build_and_install: node-version: <> - run: npm run test:e2e:visual - store_test_results: path: test-results/results.xml - store_artifacts: path: test-results - store_artifacts: path: html-test-results - generate_and_store_version_and_filesystem_artifacts workflows: overall-circleci-commit-status: #These jobs run on every commit jobs: - lint: name: node14-lint node-version: lts/fermium - unit-test: name: node18-chrome node-version: "18" - e2e-test: name: e2e-stable node-version: lts/gallium suite: stable - perf-test: node-version: lts/gallium - visual-test: node-version: lts/gallium the-nightly: #These jobs do not run on PRs, but against master at night jobs: - unit-test: name: node14-chrome-nightly node-version: lts/fermium - unit-test: name: node16-chrome-nightly node-version: lts/gallium - unit-test: name: node18-chrome node-version: "18" - npm-audit: node-version: lts/gallium - e2e-test: name: e2e-full-nightly node-version: lts/gallium suite: full - perf-test: node-version: lts/gallium - visual-test: node-version: lts/gallium triggers: - schedule: cron: "0 0 * * *" filters: branches: only: - master