From 0c455c35c9ce1096a82055c617f562da8d56b3f4 Mon Sep 17 00:00:00 2001 From: Nolan Lawson Date: Sat, 3 Jul 2021 13:15:44 -0700 Subject: [PATCH] chore: run Circle CI tests in parallel (#2059) * chore: run Circle CI tests in parallel * fix: fix schema * fix: fix schema * chore: persist and load workspace * chore: optimize ci steps * chore: fix * chore: fix * chore: fix cache * chore: fix cache * chore: fix cache * chore: fix cache --- .circleci/config.yml | 146 ++++++++++++++++++++++++++++++++----------- package.json | 5 +- 2 files changed, 113 insertions(+), 38 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d09f0eaa..43fba6e7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,15 +2,25 @@ version: 2.1 workflows: version: 2 - build: - jobs: - - build_and_test -jobs: build_and_test: + jobs: + - build_and_unit_test + - integration_test_readonly: + requires: + - build_and_unit_test + - integration_test_readwrite: + requires: + - build_and_unit_test +executors: + node: + working_directory: ~/pinafore + docker: + # we want Node v12, not v14 + # see https://discuss.circleci.com/t/build-failed-the-engine-node-is-incompatible-with-this-module-expected-version-12-x-got-14-15-0/37921/7 + - image: circleci/ruby@sha256:b018ec2a8f0bbf06880735d2801402bad316c465edb60663be83ac8f1086b805 + node_and_ruby: working_directory: ~/pinafore docker: - # see https://discuss.circleci.com/t/build-failed-the-engine-node-is-incompatible-with-this-module-expected-version-12-x-got-14-15-0/37921/7 - # we want Node v12, not v14 - image: circleci/ruby@sha256:b018ec2a8f0bbf06880735d2801402bad316c465edb60663be83ac8f1086b805 - image: circleci/postgres:12.2 environment: @@ -19,37 +29,79 @@ jobs: POSTGRES_DB: pinafore_development BROWSER: chrome:headless - image: circleci/redis:5-alpine +commands: + save_workspace: + description: Persist workspace + steps: + - persist_to_workspace: + root: . + paths: + - . + load_workspace: + description: Load workspace + steps: + - attach_workspace: + at: ~/pinafore + restore_yarn_cache: + description: Restore yarn cache + steps: + - restore_cache: + name: Restore yarn cache + key: yarn-v3-{{ checksum "yarn.lock" }} + save_yarn_cache: + description: Save yarn cache + steps: + - save_cache: + name: Save yarn cache + key: yarn-v3-{{ checksum "yarn.lock" }} + paths: + - ~/.cache/yarn + restore_yarn_cache_mastodon: + description: Restore yarn cache for Mastodon + steps: + - restore_cache: + name: Restore yarn cache for Mastodon + key: yarn-v3-{{ checksum "mastodon/yarn.lock" }} + save_yarn_cache_mastodon: + description: Save yarn cache for Mastodon + steps: + - save_cache: + name: Save yarn cache for Mastodon + key: yarn-v3-{{ checksum "mastodon/yarn.lock" }} + paths: + - ~/.cache/yarn + restore_bundler_cache: + description: Restore bundler cache + steps: + - restore_cache: + name: Restore bundler cache + key: bundler-v2-{{ checksum "mastodon/Gemfile.lock" }} + save_bundler_cache: + description: Save bundler cache + steps: + - save_cache: + name: Save bundler cache + key: bundler-v2-{{ checksum "mastodon/Gemfile.lock" }} + paths: + - mastodon/vendor/bundle + install_mastodon: + description: Install Mastodon and set up Postgres/Redis steps: - - checkout - run: name: Install system dependencies command: | sudo apt-get update sudo apt-get install -y ffmpeg fonts-noto-color-emoji libicu-dev libidn11-dev libprotobuf-dev postgresql-contrib protobuf-compiler - - run: - name: Check node version - command: node -v - - restore_cache: - name: Restore yarn cache - key: yarn-v1-{{ checksum "yarn.lock" }} - - run: - name: Yarn install - command: yarn install --immutable - run: name: Clone mastodon command: yarn clone-mastodon - - restore_cache: - name: Restore bundler cache - key: bundler-v2-{{ checksum "mastodon/Gemfile.lock" }} - - run: - name: Lint - command: yarn lint - - run: - name: Unit tests - command: yarn test-unit + - restore_yarn_cache_mastodon + - restore_bundler_cache - run: name: Install mastodon command: yarn install-mastodon + - save_yarn_cache_mastodon + - save_bundler_cache - run: name: Wait for postgres to be ready command: | @@ -70,6 +122,19 @@ jobs: sleep 1 done echo Failed waiting for redis && exit 1 +jobs: + build_and_unit_test: + executor: node + steps: + - checkout + - restore_yarn_cache + - run: + name: Yarn install + command: yarn install --immutable + - save_yarn_cache + - run: + name: Lint + command: yarn lint - run: name: Copy vercel.json command: cp vercel.json vercel-old.json @@ -85,15 +150,22 @@ jobs: exit 1 fi - run: - name: Integration tests - command: yarn test-in-ci - - save_cache: - name: Save yarn cache - key: yarn-v1-{{ checksum "yarn.lock" }} - paths: - - ~/.cache/yarn - - save_cache: - name: Save bundler cache - key: bundler-v2-{{ checksum "mastodon/Gemfile.lock" }} - paths: - - mastodon/vendor/bundle + name: Unit tests + command: yarn test-unit + - save_workspace + integration_test_readonly: + executor: node_and_ruby + steps: + - load_workspace + - install_mastodon + - run: + name: Read-only integration tests + command: yarn test-in-ci-suite0 + integration_test_readwrite: + executor: node_and_ruby + steps: + - load_workspace + - install_mastodon + - run: + name: Read-write integration tests + command: yarn test-in-ci-suite1 diff --git a/package.json b/package.json index 04c329fe..a1229f63 100644 --- a/package.json +++ b/package.json @@ -23,11 +23,14 @@ "test": "cross-env BROWSER=chrome:headless run-s test-browser", "test-browser": "run-p --race run-mastodon build-and-start test-mastodon", "test-mastodon": "run-s wait-for-mastodon-to-start wait-for-mastodon-data testcafe", + "test-mastodon-suite0": "run-s wait-for-mastodon-to-start wait-for-mastodon-data testcafe-suite0", + "test-mastodon-suite1": "run-s wait-for-mastodon-to-start wait-for-mastodon-data testcafe-suite1", "testcafe": "run-s testcafe-suite0 testcafe-suite1", "testcafe-suite0": "cross-env-shell testcafe -c 2 $BROWSER tests/spec/0*", "testcafe-suite1": "cross-env-shell testcafe $BROWSER tests/spec/1*", "test-unit": "NODE_ENV=test mocha -r esm -r bin/browser-shim.js tests/unit/", - "test-in-ci": "cross-env BROWSER=chrome:headless run-p --race run-mastodon start test-mastodon", + "test-in-ci-suite0": "cross-env BROWSER=chrome:headless run-p --race run-mastodon start test-mastodon-suite0", + "test-in-ci-suite1": "cross-env BROWSER=chrome:headless run-p --race run-mastodon start test-mastodon-suite1", "wait-for-mastodon-to-start": "node -r esm bin/wait-for-mastodon-to-start.js", "wait-for-mastodon-data": "node -r esm bin/wait-for-mastodon-data.js", "backup-mastodon-data": "./bin/backup-mastodon-data.sh",